如何验证正在进行的ssl会话的证书

时间:2012-05-09 06:29:48

标签: ssl openssl

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

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

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

1 个答案:

答案 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);