我正在尝试学习如何使用 OpenSSL 库(total newb)并且在弄清楚如何让客户端连接到具有正确证书的服务器时遇到了一些麻烦,如果证书不正确则失败。我的用例是构建一个没有中央 CA 的 p2p 应用程序,所以我不能依赖 CA 证书。具体来说,服务器和往常一样有一个cert/key,客户端会通过请求其他p2p节点投票来确定一个服务器的证书。
我有两个具体问题:
- 在下面的代码片段中,如果我注释掉“密码列表”下面的选择,我希望客户端无法连接。它仍然有效!我错过了一些东西,对吧?
- 有没有办法让客户端使用服务器证书,并且足以打开连接?即没有密钥,没有CA?
客户:
ctx = SSL_CTX_new(DTLSv1_client_method());
SSL_CTX_set_cipher_list(ctx, "HIGH:!DSS:!aNULL@STRENGTH");
// If I comment out below stuff, client still connects happily!?
if (!SSL_CTX_use_certificate_file(ctx, "certs/server-cert.pem", SSL_FILETYPE_PEM))
printf("\nERROR: no certificate found!");
if (!SSL_CTX_use_PrivateKey_file(ctx, "certs/server-key.pem", SSL_FILETYPE_PEM))
printf("\nERROR: no private key found!");
if (!SSL_CTX_check_private_key (ctx))
printf("\nERROR: invalid private key!");
服务器:
SSL_CTX_set_cipher_list(ctx, "HIGH:!DSS:!aNULL@STRENGTH"); // high strength ciphers
SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF);
if (!SSL_CTX_use_certificate_file(ctx, "certs/server-cert.pem", SSL_FILETYPE_PEM))
printf("\nERROR: no certificate found!");
if (!SSL_CTX_use_PrivateKey_file(ctx, "certs/server-key.pem", SSL_FILETYPE_PEM))
printf("\nERROR: no private key found!");
if (!SSL_CTX_check_private_key (ctx))
printf("\nERROR: invalid private key!");
我的代码在https://github.com/a34729t/exp/tree/master/tun2udp/dtls;它由 Robin Seggelmann 的 DTLS 示例构建而成。具体来说,我正在使用 server3_oo.c。