为什么我的服务器的通配符SSL证书被拒绝?
我正在使用NSURLConnection
连接到通配符TLS证书(如“* .domain.com”)的服务器,当我在NSURLConnectionDelegate
的-connection:willSendRequestForAuthenticationChallenge:
方法中调用SecTrustEvaluate
时,证书被拒绝为无效。 另一台具有完全指定的TLS证书的服务器(如“server2.domain.com”)被接受。 两个证书都由同一个CA颁发,并且已经将CA证书添加到我的设备的可信证书列表中。
我在iPhone / iOS 8.1上看到了与Safari相同的行为。 具有通配符证书的服务器被报告为具有不可信证书,而其他服务器正常工作。 所以它看起来像iOS的默authentication书validation拒绝通配符证书。 这是这种情况吗?
有没有办法告诉SecEvaluateTrust
允许通配符证书? 这是我的-connection:willSendRequestForAuthenticationChallenge:
摘录-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
来validation证书,据我所知,它执行与SecPolicyCreateSSL
相同的function – 对浏览器执行的证书执行相同的检查。
既然你也看到了与Safari相同的行为,这可能是证书的问题,或者你期望证书匹配的问题。 请检查(或张贴)证书的详细信息以及如何访问证书。 示例:只包含*.example.com
条目的证书将匹配foo.example.com
,但不匹配example.com
或bar.foo.example.com
。 此外,关于名称的任何信息都应在SAN部分(主题替代名称)中,对此使用通用名称进行折旧。