2

我正在使用 SSL 创建安全连接并使用 CA 认证的证书。进行 ssl 会话后,我想检查证书的有效性,如果它无效,我需要中断所有正在进行的会话。

如何跟踪正在进行的 ssl 会话以检查使用此证书建立了多少会话。是否有任何 api 来跟踪 ssl 活动会话。

我是否应该使用 SSL_CTX_remove_session() 来终止 SSL 会话。或者是否有任何特定的 API 用于终止 openSSL 中的 SSL 会话。如果支持恢复,是否会保留此会话的单独副本。

4

1 回答 1

5

连接到服务器后,您可以通过 SSL_get_verify_result() 查看手册页获得证书验证结果。

SSL_get_session() 之后,您可以通过手册页获取连接的关联会话,并通过SSL_CTX_remove_session().

这不会取消正在使用此会话的每个连接,但会确保没有新连接重用旧的(无效和删除的)会话。要关闭连接,请使用SSL_shutdown().

不要忘记将 OCSP 和 CRL 检查添加到您的代码中。

如果您真的想跟踪使用过的会话,一种方法是包含您自己的会话处理回调,请参阅会话处理文档并跟踪SSL需要终止的对象。

评论后编辑:

此代码应允许您随时重新检查证书,并重新检查 CRL 状态。

  X509_CRL *crl;
  /* load crl */
  FILE *fp = fopen(/*path to crl */, "r");
  d2i_X509_CRL_fp(dp, &crl);

  X509 *cert = SSL_get_peer_certificate(ssl); //ssl is your running connection
  X509_STORE *store = SSL_CTX_get_cert_store(ctx);
  /* add crls */
  X509_STORE_add_crl(store, crl);
  X509_VERIFY_PARAM *param = X509_VERIFY_PARAM_new();
  X509_VERIFY_PARAM_set_flags(param, X509_V_FLAG_CRL_CHECK);
  X509_STORE_set1_param(store, param);

  X509_STORE_CTX *csc = X509_STORE_CTX_new();
  X509_STORE_CTX_set_verify_cb(csc, /* your verify callback here */);
  X509_STORE_init(csc, store, cert, NULL);
  int ret = X509_verify_cert(csc);
于 2012-05-09T10:01:56.843 回答