为什么我的服务器的通配符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.combar.foo.example.com 。 此外,关于名称的任何信息都应在SAN部分(主题替代名称)中,对此使用通用名称进行折旧。

Interesting Posts