我的应用程序正在使用 openSSL(版本 1.1.1g)。我有一个客户端可以使用 TLS 连接到的服务器。服务器要求客户端使用 X509 证书进行身份验证。服务器检查证书和证书上的 SAN(名称)。
我想在客户端使用通配符证书。这意味着服务器必须将(预期的)名称与客户端发送的证书上的通配符进行匹配。这样客户端就可以为不同的“服务”使用相同的通配符证书。
所以它就像服务器端的通配符,但反过来也是如此。
客户端使用的证书具有以下(示例)扩展名。
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:*.service1.com
服务器将提供不同的服务,它希望客户端提供具有以下(示例)名称的证书:
first.service1.com
second.service1.com
third.service1.com
我可以为服务器使用通配符证书,openSSL 将检查并匹配名称。
// Code on the client to check for the expected server host name
int verificationMode = SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
SSL_CTX_set_verify(ctx, verificationMode, openSSLVerifyCertCallback);
SSL_CTX_set_verify_depth(ctx, MAX_CERT_CHAIN_DEPTH);
X509_VERIFY_PARAM *vpm = SSL_get0_param(ssl);
X509_VERIFY_PARAM_set1_host(vpm, targetName.c_str(), targetName.size());
SSL_set_hostflags(ssl, X509_CHECK_FLAG_MULTI_LABEL_WILDCARDS);
所以我尝试为服务器端做同样的事情,但我无法让它工作。 SSL 握手失败:
error =62:Hostname mismatch
error string=140619424118528:error:1417C086:SSL routines:tls_process_client_certificate:certificate verify failed:ssl/statem/statem_srvr.c:3703
这可以通过 openSSL 完成还是我需要自己进行证书验证?
感谢您对此的任何帮助。