我使用SSL创建安全连接并使用CA认证的证书。在进行ssl会话之后,我想检查证书的有效性,如果它无效,我需要打破所有正在进行的会话。
如何跟踪正在进行的ssl会话以检查使用此证书建立的会话数。是否有任何API来跟踪ssl活动会话。
我应该使用SSL_CTX_remove_session()来终止SSL会话。或者是否有任何特定的API用于终止openSSL中的SSL会话。如果支持恢复,它是否会保留此会话的单独副本。
答案 0 :(得分:4)
连接到服务器后,您可以通过以下方式获取证书验证结果
SSL_get_verify_result()
see man page。
之后,您可以通过SSL_get_session()
man page获取关联的会话,并通过SSL_CTX_remove_session()
将其从会话缓存中删除。
这不会取消正在使用此会话的每个连接,但它将确保没有新连接重用旧的(无效和已删除)会话。要关闭连接,请使用SSL_shutdown()
。
不要忘记在代码中添加OCSP和CRL检查。
如果您真的想要跟踪已使用的会话,一种方法是包含您自己的会话处理回调,请参阅Documentation for Session handling并跟踪需要终止的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);