gpt4 book ai didi

c - 使用 SSL 验证服务器(对等)

转载 作者:太空宇宙 更新时间:2023-11-04 02:54:52 26 4
gpt4 key购买 nike

我希望我的 C/C++ 客户端通过 SSL 验证服务器。我首先使用
从服务器下载了证书文件 openssl s_client -showcerts -connect www.openssl.org:443 </dev/null 2>/dev/null | openssl x509 -outform PEM > mycertfile.pem

然后在我的应用程序中执行以下 API 调用(伪代码):


// Register the error strings for libcrypto & libssl
SSL_load_error_strings();
// Register the available ciphers and digests
SSL_library_init();
// New context saying we are a client, and using SSL 2 or 3
ctx = SSL_CTX_new(SSLv23_client_method());
// load the certificate
if(!SSL_CTX_load_verify_locations(ctx, "mycertfile.pem", 0))
...
// Create an SSL struct for the connection
ssl = SSL_new(ctx);
// Connect the SSL struct to our pre-existing TCP/IP socket connection
if (!SSL_set_fd(ssl, sd))
...
// Initiate SSL handshake
if(SSL_connect(ssl) != 1)
...
// form this point onwards the SSL connection is established and works
// perfectly, I would be able to send and receive encrypted data
// **Crucial point now**
// Get certificate (it works)
X509 *cert = SSL_get_peer_certificate(ssl);
if(cert) {
// the below API returns code 19
const long cert_res = SSL_get_verify_result(ssl);
if(cert_res == X509_V_OK) {
printf("Certificate verified!\n");
}
X509_free(cert);
}

如果我不介意检查证书并且我只对加密连接感兴趣,上面的代码可以正常工作。
问题在于,当我尝试验证服务器的真实性时,我确实SSL_get_peer_certificate 获取了证书。但是如果我在 5 分钟前刚刚下载了证书,那么结果验证将不起作用甚至

我做错了什么?

所有这些都在 Ubuntu 12.04.03 x86-64 上运行,带有 gcc 和 openssl

谢谢,艾玛

最佳答案

如果您拥有比 OpenSSL 已经提供的更完整的 CA 证书集,或者如果您连接到使用非标准 CA 的服务器签署其证书,并且您拥有用于验证服务器证书的 CA 证书。否则,您应该改为调用 SSL_CTX_set_default_verify_paths()

// load the certificate^H^H^H^H^H^H^H^H^H^H^H^H CA trust-store
if(!SSL_CTX_set_default_verify_paths(ctx))
...

附带说明一下,您的程序还有另一个错误。您向 SSL_get_verify_result() 传递了错误的指针。您不应传入 SSL_CTX *,而应传入 SSL *。编译器应该就此错误警告您。

  const long cert_res = SSL_get_verify_result(ssl);

关于c - 使用 SSL 验证服务器(对等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18855500/

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