覆盖TLS服务器验证主机名似乎不起作用

时间:2014-05-21 14:31:19

标签: ios ssl secure-transport

我正在尝试将我的应用程序连接到具有错误主机名的服务器证书的开发服务器,但它是由受信任的锚证书签名的。当我评估服务器信任对象时,它会按预期失败。我正在尝试更改服务器主机名的信任评估策略,但似乎没有帮助。

// In -connection:willSendRequestForAuthenticationChallenge:
// NSURLAuthenticationMethodServerTrust
SecTrustRef trust = [challenge.protectionSpace serverTrust];
SecTrustResultType trustResult;
SecTrustEvaluate(trust, &trustResult);
// trustResult == kSecTrustResultRecoverableTrustFailure

SecPolicyRef policyOverride = SecPolicyCreateSSL(true, (CFStringRef)@"devhost");
CFArrayRef policies = (CFArrayRef)@[policyOverride];
SecTrustSetPolicies(trust, policies);
CFRelease(policyOverride);
SecTrustEvaluate(trust, &trustResult);
// trustResult == kSecTrustResultRecoverableTrustFailure

据我所知,第二次调用SecTrustEvaluate()时,它应该返回kSecTrustResultUnspecified。我在初始化NSURLConnection时使用“devhost”连接到dev服务器,并且challenge.protectionSpace.host == @"devhost"也是如此。我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

我在调用SecPolicyCreateSSL时使用了错误的主机名。

使用SecPolicyCreateSSL覆盖主机名验证时,hostname参数应该是与您要验证的证书匹配的参数。然后验证假装您正在与之通信的主机具有新指定的主机名。

在我的情况下,服务器有“* .mydomain.tld”证书,所以我打电话

SecPolicyCreateSSL(true, (CFStringRef)@"devhost.mydomain.tld");

然后可以成功验证证书链。