【发布时间】:2021-04-28 17:53:14
【问题描述】:
我希望有人可以帮助解决我在尝试针对服务器验证客户端上的证书时遇到的 OpenSSL(1.1.1k) 问题。证书内容以文本形式指定,而不是在客户端的 .PEM 文件中。一些示例代码在这里:
bool setCert(SSL_CTX* ctx, LPCSTR cert)
{
//cert is the text of the certificate e.g. -----BEGIN CERTIFICATE----- blah -----END CERTIFICATE-----
bool bOk = true;
if (!cert.empty()) // no cert on disk
{
BIO *bioCert = BIO_new_mem_buf((void*)cert, -1);
X509* pCert = PEM_read_bio_X509(bioCert, NULL, 0, NULL);
if (SSL_CTX_use_certificate(ctx, pCert) != 1)
{
//log errror, "Invalid certificate"
bOk = false;
}
BIO_free_all(bioCert);
X509_free(pCert);
}
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3); // other options not used atm SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2
SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF);
return bOk;
}
此方法返回后,我使用 SSL_new(ctx) 基于上下文创建一个 SSL 对象。
然后我调用 SSL_Connect(ssl)
即使我传入无效的证书,也会发生握手并被接受。
我在这里的假设是它这样做是因为我没有设置验证方法,例如:
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
我的理解是我不能使用 SSL_VERIFY_PEER,除非客户端磁盘上有一个 cert / .PEM 文件可供验证。
将证书内容保存在内存中时如何验证握手?
如果我更改代码以使用 PEM 文件,调用 SSL_CTX_use_certificate_file 而不是 SSL_CTX_use_certificate,它可以工作。在那种情况下,我确实设置了 SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
非常感谢这里的任何帮助。谢谢
【问题讨论】: