gpt4 book ai didi

ssl - 在非阻塞模式下,openssl 允许在客户端使用任何证书

转载 作者:太空宇宙 更新时间:2023-11-03 14:01:26 40 4
gpt4 key购买 nike

我将 BIO 更改为非阻塞模式

BIO_set_nbio(m_bio, 1)

为了 BIO_do_connect 不挂起(并使用 BIO_should_retryselect 重试重新连接)。它解决了我连接到错误监听器的问题,现在立即失败,而不是在 2 小时内超时。

但现在我遇到了一个新问题 - SSL_get_verify_result 总是返回 X509_V_OK。不管它是过期证书还是与服务器证书不同 - 验证总是成功。

我不明白的是非阻塞模式如何以及为什么更改证书的验证。我确认如果客户端证书不相同,则在不切换到非阻塞模式的情况下验证失败。

我尝试使用 SSL_CTX_load_verify_locationsSSL_CTX_use_certificate_file 设置客户端证书,但这似乎并不重要。

最佳答案

正如帕特里克指出的那样,我遇到的问题是由于非阻塞模式下的 SSL 上下文没有服务器证书,因此在建立连接后立即进行验证总是成功的。为了解决这个问题,我在第一次读写数据交换后添加了证书验证(如果它与我希望看到的相同)。

SSL_CTX_new(SSLv23_client_method());
SSL_CTX_load_verify_locations(ctx, certFilePath, NULL);
BIO_new_ssl_connect(ctx);
BIO_get_ssl(bio, &ssl);
BIO_set_conn_hostname(bio, hostname);
BIO_set_nbio(bio, 1);
auto err = BIO_do_connect(bio);
// check err and BIO_should_retry to retry as needed

// Problem I had was here - the call always returns X509_V_OK
// in non-blocking mode regardless of what cert I use on
// my (client) side.
// In IO blocking mode (without BIO_set_nbio call above) validation
// fails as expected for mismatching certs.
SSL_get_verify_result(ssl);

// Exchange some data with server with
// BIO_read/BIO_write

// And now we have server cert in ctx
auto clientCert = SSL_get_certificate(ssl);
auto serverCert = SSL_get_peer_certificate(ssl);
auto certsAreTheSame = X509_cmp(clientCert, serverCert) == 0;

关于ssl - 在非阻塞模式下,openssl 允许在客户端使用任何证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51972054/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com