当我尝试通过 2 路 SSL (HTTPS) 连接到 f5 BigIP 服务器时,我的 iOS 客户端遇到了一个奇怪的错误 - 只有当服务器不需要客户端证书时,客户端才能通过其证书验证服务器在 SSL 协商期间。签署服务器和我的客户端证书的根 CA 的证书已经在我的受信任锚证书列表中。
以下是我尝试过的每个测试中的步骤,以及它们的 SSL 协商结果:
- 服务器不需要客户端证书,客户端验证服务器证书(1-way ssl:客户端->服务器)
- 客户端验证服务器证书(通过)
- 客户端将其证书提供给服务器(未选中 - 服务器不需要)
- 连接建立,服务器允许客户端访问
- 服务器需要客户端证书,客户端验证服务器证书(2-way SSL:客户端 <-> 服务器)
- 客户端验证服务器证书(失败!!)
- 没有其他事情发生
- 服务器需要客户端证书,客户端接受任何受信任的服务器(单向 SSL:客户端 <- 服务器)
- 客户端不验证服务器证书(
setAllowsAnyHTTPSCertificate:YES
- 仅用于测试目的) - 客户端将其证书提供给服务器(通过)
- 连接建立,服务器允许客户端访问
- 客户端不验证服务器证书(
在情况 1 和 2 之间,只有服务器更改为需要客户端证书(从而启用 2-way SSL),而客户端在两种情况下都验证服务器证书。在情况 2 和 3 之间,客户端更改为接受所有服务器证书,而服务器在这两种情况下都需要客户端证书。
所以看起来我只能在任一方向上实现 1-way SSL,但不能实现 2-way SSL。这很奇怪,因为客户端验证服务器的初始步骤应该发生在服务器请求客户端证书之前,因此每次都会产生相同的结果。我从测试用例 2 得到的错误如下:
此服务器的证书无效。您可能正在连接到伪装成“server.myexample.com”的服务器,这可能会使您的机密信息面临风险。获取https://server.myexample.com/service时出错:错误域 = NSURLErrorDomain 代码 = -1202“此服务器的证书无效。您可能正在连接到伪装成“server.myexample”的服务器。 com”,这可能会使您的机密信息面临风险。
我收到具有相同信息但指定错误的其他消息:NSErrorFailingURLStringKey
、NSErrorFailingURLKey
、NSUnderlyingError
和NSURLErrorFailingURLPeerTrustErrorKey
。
我认为我不需要为 2-way 与 1-way SSL 提供不同的服务器证书,或者我需要吗?
提前致谢!