我在 Apache 2.4.54 上使用自签名 CA 和 iOS 和 MacOS 上的测试客户端进行了 TLS 1.2 相互身份验证。一切正常,只是客户端无法识别证书请求上的“可接受的客户端证书 CA”,因此用户/应用程序必须知道选择哪一个。在我的 iOS 应用程序中,应该URLAuthenticationChallenge.protectionSpace.distinguishedNames
提供此列表的字段为空。在 MacOS Safari 上,它要求用户在所有已安装的证书中选择一个,即使只有 1 个具有正确的颁发者 CA。使用
openssl s_client -connect myserver.com:443 -prexit
返回
Acceptable client certificate CA names
/C=US/ST=x/L=x/O=x/OU=x/CN=myca.com/emailAddress=x
相关的apache配置如下。
SSLCACertificateFile /etc/pki/CA/cacert.pem
SSLCADNRequestFile /etc/pki/CA/cacert.pem
SSLVerifyClient require
SSLVerifyDepth 1
不使用 ,我也能得到相同的结果SSLCADNRequestFile
。使用 ,查看 apache 日志LogLevel trace8
似乎显示证书请求中写入了正确的专有名称。这是原始转储,因此我无法读取二进制字段,但我可以看到我的 CA CN 的正确 ASCII。我猜 iOS/MacOS 一定看到了这些数据,但决定不可用。
CA 证书有X509v3 Basic Constraints: CA:TRUE
,但没有 keyUsage 规范。由于身份验证有效,我认为只要客户端选择正确的证书,证书就没有问题。
知道我做错了什么吗,或者如何进一步调试?
答案1
我错了。可接受的 CA 列表正在传送到我的 iOS 应用程序(无论我是否包含 SSLCADNRequestFile)。连接开始时有两个应用程序回调,DER 编码的 CA 列表在第二个回调中传送。我仍然需要弄清楚为什么 MacOS Safari 让我选择具有错误 CA 的证书,但至少列表正在传送。