【问题标题】:Overriding TLS server validation hostname doesn't seem to be working覆盖 TLS 服务器验证主机名似乎不起作用
【发布时间】:2014-07-10 06:38:49
【问题描述】:

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

// 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”连接到开发服务器。我在这里做错了什么?

【问题讨论】:

    标签: ios ssl secure-transport


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 2019-10-18
      相关资源
      最近更新 更多