gpt4 book ai didi

ios - 使用 NSURLConnection 使用自签名证书连接到 https 时的 kSecTrustResultRecoverableTrustFailure

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:04:37 25 4
gpt4 key购买 nike

我在这里看到了一些问题,但没有一个对我有帮助。人们主要解决重新生成服务器证书的问题:What is the reason of kSecTrustResultRecoverableTrustFailure?

假设我需要使用自签名证书与服务器建立 https 连接。我没有来自服务器的任何内部数据,例如它的私钥。例如服务器是 https://www.pcwebshop.co.uk/

据我所知,我可以将客户端证书捆绑到应用程序中并将其用于验证。我是否可以在没有来自服务器的任何内部数据的情况下获得有效的客户端证书?

我在这里搜索了一个教程 http://www.indelible.org/ink/trusted-ssl-certificates

这是我获取客户端证书的方式

openssl s_client \
-showcerts -connect "${HOST}:443" </dev/null 2>/dev/null | \
openssl x509 -outform DER >"../resources/${HOST}.der"

这是代码(几乎没有变化):

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
if ([self shouldTrustProtectionSpace:challenge.protectionSpace]) {
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]
forAuthenticationChallenge:challenge];
} else {
[challenge.sender performDefaultHandlingForAuthenticationChallenge:challenge];
}
}

- (BOOL)shouldTrustProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
// load up the bundled certificate
NSString *certPath = [[NSBundle mainBundle] pathForResource:protectionSpace.host ofType:@"der"];

if (certPath == nil)
return NO;

OSStatus status;
NSData *certData = [[NSData alloc] initWithContentsOfFile:certPath];
CFDataRef certDataRef = (__bridge_retained CFDataRef)certData;
SecCertificateRef cert = SecCertificateCreateWithData(NULL, certDataRef);

// establish a chain of trust anchored on our bundled certificate
CFArrayRef certArrayRef = CFArrayCreate(NULL, (void *)&cert, 1, NULL);
SecTrustRef serverTrust = protectionSpace.serverTrust;
status = SecTrustSetAnchorCertificates(serverTrust, certArrayRef);
// status == 0

// verify that trust
SecTrustResultType trustResult;
status = SecTrustEvaluate(serverTrust, &trustResult);
// status == 0

CFRelease(certArrayRef);
CFRelease(cert);
CFRelease(certDataRef);

return trustResult == kSecTrustResultUnspecified;
}

trustResult 始终是 kSecTrustResultRecoverableTrustFailure。

我做错了什么?谢谢。

更新:好的,我发现原因是“服务器的证书与 URL 不匹配”。

是否可以通过忽略服务器证书的 URL(主机名)从客户端解决问题?

最佳答案

Suppose I need to make a https connection to server with self-signed certificate. I don't have any internal data from the server such as its private keys.

在这种情况下,您需要一个安全多样化策略。 Gutmann 在他的书中对此进行了详细介绍 Engineering Security .

简而言之:在您第一次遇到证书时明智地验证它。您仍然可以使用大多数传统的 PKI/PKIX 测试。一旦证书通过所有测试(“受信任的根路径”除外),您就可以将其称为“受信任”。这种策略称为首次使用时信任或 TOFU。

在后续的连接中,你不再需要TOFU,因为你已经遇到了证书或公钥。在随后的连接中,您确保证书或公钥是连续的(即不变),IP 来自与之前遇到的相同区域等。如果证书发生变化,那么请确保它是因为自签名即将过期.警惕意外变化。


Here's the code (almost unchanged):
...
trustResult == trustResult == kSecTrustResultUnspecified

对于 kSecTrustResultUnspecified,请参阅 Technical Q&A QA1360 .本质上,这是一个可恢复的错误。问答说提示用户。 Gutmann(和我)建议使用如上所述的安全多元化策略。

您需要让用户脱离循环,因为他们总是会做出让他们尽快通过消息框的决定。不管他们回答对还是错都没有关系 - 他们想看跳舞的兔子。

此外,安全多样化策略甚至适用于kSecTrustResultProceed。考虑:两者 DiginotarTrustwave破坏了 PKI{X},Cocoa/CocoaTouch 非常乐意返回 kSecTrustResultProceed。这并不是 Cocoa/CocoaTouch 的错——PKI{X} 存在架构缺陷。


Is it possible to fix the issue from the client side by ignoring the URL (hostname) of the server's certificate?

这种做法违背了 PKI{X} 的目的。如果您愿意接受任何主机、任何公钥或任何签名,为什么还要首先使用 PKI{X}? PKI{X} 中 X509 的全部要点是使用受信任的第三方签名(在本例中为自签名)将实体或主机绑定(bind)到公钥。

如果您不关心绑定(bind),只需使用匿名 Diffie-Hellman 并结束安全剧院。

关于ios - 使用 NSURLConnection 使用自签名证书连接到 https 时的 kSecTrustResultRecoverableTrustFailure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24229926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com