OpenSSL:服务器不接受客户端通配符证书(错误 =62:主机名不匹配)

发布时间:2021-03-05 15:15

我的应用程序正在使用 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 完成还是我需要自己进行证书验证?

感谢您对此的任何帮助。

回答1