我正在使用 SSL 创建安全连接并使用 CA 认证的证书。进行 ssl 会话后,我想检查证书的有效性,如果它无效,我需要中断所有正在进行的会话。
如何跟踪正在进行的 ssl 会话以检查使用此证书建立了多少会话。是否有任何 api 来跟踪 ssl 活动会话。
我是否应该使用 SSL_CTX_remove_session() 来终止 SSL 会话。或者是否有任何特定的 API 用于终止 openSSL 中的 SSL 会话。如果支持恢复,是否会保留此会话的单独副本。
连接到服务器后,您可以通过
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);