为什么我的服务器的通配符SSL证书被拒绝了?

时间:2014-10-21 17:28:31

标签: ios ssl ssl-certificate nsurlconnection secure-transport

我使用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相同的功能 - 对浏览器执行的证书执行相同的检查。

2 个答案:

答案 0 :(得分:4)

由于您也看到了与Safari相同的行为,因此可能是证书问题或您希望证书匹配的问题。请检查(或发布)证书的详细信息以及访问方式。示例:仅包含*.example.com条目的证书将与foo.example.com匹配,但不会与example.combar.foo.example.com匹配。此外,有关名称的任何信息都应该在SAN部分(主题替代名称)中,对此使用的通用名称是折旧的。

答案 1 :(得分:0)

我们在最新的 iOS 设备上遇到同样问题的另一个原因:Apple 不允许在域名中使用下划线 (_)

没有下划线,一切都开始工作。