我使用NSURLConnection
连接到具有通配符TLS证书的服务器(例如“* .domain.com”),当我在SecTrustEvaluate
中呼叫NSURLConnectionDelegate
时s -connection:willSendRequestForAuthenticationChallenge:
方法,证书被拒绝为无效。另一台具有完全指定的TLS证书(如“server2.domain.com”)的服务器被接受。两个证书都由同一个CA颁发,我已将CA证书添加到设备的可信证书列表中。
我在iPhone / iOS 8.1上看到Safari的相同行为。具有通配符证书的服务器被报告为具有不受信任的证书,而另一个服务器工作正常。所以看起来iOS的默认证书验证拒绝通配符证书。是这种情况吗?
有没有办法告诉SecEvaluateTrust
允许通配符证书?以下是我-connection:willSendRequestForAuthenticationChallenge:
- (void)connection:(NSURLConnection *)connection
willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
if ([challenge.protectionSpace.authenticationMethod
isEqualToString:NSURLAuthenticationMethodServerTrust]) {
SecTrustRef trust = [challenge.protectionSpace serverTrust];
SecTrustResultType trustResult;
OSStatus status = SecTrustEvaluate(trust, &trustResult);
if (status == noErr) {
if (trustResult == kSecTrustResultProceed
|| trustResult == kSecTrustResultUnspecified) {
// Success. server2 gets here
} else {
// Server authentication failure. server1 gets here
}
}
}
}
编辑我们软件的Android版本接受通配符证书就好了,所以我怀疑iOS的证书处理有特定的东西在这里发生。 Android客户端正在使用BrowserCompatHostnameVerifier
来验证证书,据我所知,该证书执行与SecPolicyCreateSSL
相同的功能 - 对浏览器执行的证书执行相同的检查。
答案 0 :(得分:4)
由于您也看到了与Safari相同的行为,因此可能是证书问题或您希望证书匹配的问题。请检查(或发布)证书的详细信息以及访问方式。示例:仅包含*.example.com
条目的证书将与foo.example.com
匹配,但不会与example.com
或bar.foo.example.com
匹配。此外,有关名称的任何信息都应该在SAN部分(主题替代名称)中,对此使用的通用名称是折旧的。
答案 1 :(得分:0)
我们在最新的 iOS 设备上遇到同样问题的另一个原因:Apple 不允许在域名中使用下划线 (_)。
没有下划线,一切都开始工作。