2010-07-21 224 views
3

我目前正在将一些曾经使用RSA Security库的现有技术重写入OpenSSL,但我开始遇到一些问题。目前,所有的证书验证代码似乎都没有问题,直到我调用SSL_connect()。SSL_connect()产生证书验证失败

之前,对SSL_connect()的调用会产生SSL_ERROR_WANT_READ。

对另一个论坛的这个问题的回答告诉我,应该调用SSL_connect(),直到它停止产生SSL_ERROR_WANT_READ错误。不幸的是,这只会产生更多令人困惑的内容:

error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 

即使SSL_CTX_load_verify_locations()成功。有没有人有任何想法,为什么验证错误不会注册证书方法,并等待直到SSL_connect()被触发?

回答

4

通常,此错误表示您的客户端在响应SSL_connect()时收到的服务器证书无法验证。

发生这种情况的原因不尽相同:

  • 如果服务器证书是自签名的,你必须批准已在你的SSL_CONTEXT
  • 如果服务器证书是由不信任的CA证书列表中的证书颁发机构签署
  • 如果服务器证书尚未生效或不再有效

其实,你应该设定一个回拨证书验证并使其接受任何证书,因此您可以专注于连接部分。一旦工作,只需调整回调或检查您的证书是否有效。

在任何时候你失败了,你可以调用一些SSL_get_error()函数来告诉你为什么证书被拒绝。

(不幸的是,我现在不能访问我的代码库,所以我不能给出具体的例子)


下面是我自己的SSL插座包装类,适合一些对你的代码示例:

// ctx is a SSL_CONTEXT 
// internalCertificateVerificationCallback is a callback static method (or function) 
ctx->setVerify(SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, internalCertificateVerificationCallback); 

这里是internalCertificateVerificationCallback定义:

int SecureSocket::internalCertificateVerificationCallback(int preverify_ok, X509_STORE_CTX* x509_ctx) 
{ 
    //preverify_ok contains 1 if the pre-verification succeeded, 0 otherwise. 

    return 1; // This accepts every certificate 
} 
+0

感谢您的回复,但我认为我仍然有点困惑。我如何“接受任何证书”?我尝试在我的SSL_CTX_set_verify()方法调用中使用SSL_VERIFY_NONE,但我不认为这是我想要的路线。 另外,如何将一个回调附加到SSL_CTX_load_verify_locations()调用?我认为它不接受回调函数。呃,至少在C++中〜 – 2010-07-21 23:27:28

+0

@ kelly.dunn:我添加了几个代码示例,可能有帮助。 我不明白你对回调函数和'C++'的评论:你可以在'C++'中编写和使用'C'回调,没有任何问题。只要注意指定了一个函数或一个** static **方法,而不是一个方法(由于隐藏'this'参数,它们的签名会有所不同)。 – ereOn 2010-07-22 07:50:48

+0

哦,我只是混淆了你说的附加回调函数〜我忘了SSL_set_verify()接受一个作为它的最后一个参数。非常感谢!我会尽快执行此操作,看看它是否有帮助:D – 2010-07-22 08:55:20

相关问题