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

标签 ios ssl secure-transport

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

// 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 和 challenge.protectionSpace.host == @"devhost" 时,我已经使用“devhost”连接到开发服务器。我在这里做错了什么?

最佳答案

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

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

在我的例子中,服务器有一个“*.mydomain.tld”的证书,所以我调用

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

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

关于ios - 覆盖 TLS 服务器验证主机名似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23786259/

相关文章:

iOS - 移动图像时旋转图像

ios - 计算属性 getter 出错

java - Centos 中的 APNS NetworkIOException SSLHandshake 失败,Java 版本为 1.6.0_37

java - 带有 BouncyCaSTLeProvider 的 keystore : KeyStore integrity check failed

ios - Phonegap 上的 twilio 需要一个好的起点

ios - 如何在 Swift (iOS) 中使用 MKSnapshotter

c# - wcf https ssl 中的服务端点出错。找不到与具有绑定(bind) WebHttpBinding 的端点的方案 http 匹配的基址

ios - 为什么我的服务器证书被拒绝?

iOS 安全传输 TLS 扩展