gpt4 book ai didi

iOS 和 SSL : Unable to validate self-signed server certificate

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


我对使用 SSL channel 使用网络服务还很陌生。经过相当好的搜索后,我找到了一种使用 NSURLConnection 委托(delegate) API 执行 SSL/HTTPS 身份验证的方法。以下是执行实际身份验证操作的代码片段:

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
[self printLogToConsole:@"Authenticating...."];
[self printLogToConsole:[NSString stringWithFormat:@"\n%@\n", [challenge description]]];
NSLog(@"\n\nserverTrust: %@\n", [[challenge protectionSpace] serverTrust]);

/* Extract the server certificate for trust validation
*/
NSURLProtectionSpace *protectionSpace = [challenge protectionSpace];
assert(protectionSpace);
SecTrustRef trust = [protectionSpace serverTrust];
assert(trust);
CFRetain(trust); // Make sure this thing stays around until we're done with it
NSURLCredential *credential = [NSURLCredential credentialForTrust:trust];


/* On iOS
* we need to convert it to 'der' certificate. It can be done easily through Terminal as follows:
* $ openssl x509 -in certificate.pem -outform der -out rootcert.der
*/
NSString *path = [[NSBundle mainBundle] pathForResource:@"rootcert" ofType:@"der"];
assert(path);
NSData *data = [NSData dataWithContentsOfFile:path];
assert(data);

/* Set up the array of certificates, we will authenticate against and create credentials */
SecCertificateRef rtCertificate = SecCertificateCreateWithData(NULL, CFBridgingRetain(data));
const void *array[1] = { rtCertificate };
trustedCerts = CFArrayCreate(NULL, array, 1, &kCFTypeArrayCallBacks);
CFRelease(rtCertificate); // for completeness, really does not matter

/* Build up the trust anchor using our root cert */
int err;
SecTrustResultType trustResult = 0;
err = SecTrustSetAnchorCertificates(trust, trustedCerts);
if (err == noErr) {
err = SecTrustEvaluate(trust, &trustResult);
}
CFRelease(trust); // OK, now we're done with it

[self printLogToConsole:[NSString stringWithFormat:@"trustResult: %d\n", trustResult]];

/* http://developer.apple.com/library/mac/#qa/qa1360/_index.html
*/
BOOL trusted = (err == noErr) && ((trustResult == kSecTrustResultProceed) || (trustResult == kSecTrustResultConfirm) || (trustResult == kSecTrustResultUnspecified));

// Return based on whether we decided to trust or not
if (trusted) {
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
[self printLogToConsole:@"Success! Trust validation successful."];
} else {
[self printLogToConsole:@"Failed! Trust evaluation failed for service root certificate.\n"];
[[challenge sender] cancelAuthenticationChallenge:challenge];
}

但我收到以下错误:

2012-06-11 17:10:12.541 SecureLogin[3424:f803] Error during connection: Error Domain=NSURLErrorDomain Code=-1012 "The operation couldn’t be completed. (NSURLErrorDomain error -1012.)" UserInfo=0x682c790 {NSErrorFailingURLKey=https://staging.esecure.url/authentication/signin/merchants, NSErrorFailingURLStringKey=https://staging.esecure.url/authentication/signin/merchants}


我正在使用从服务器获得的相同证书并将其转换为“der”格式。我正在为 iOS 5.x 构建应用程序。我不确定我是否错过了什么。让我知道您的建议。

谢谢。

编辑在此处检查证书后输出的外观: Portecle app Examination


如果有什么问题,请告诉我。

谢谢。

最佳答案

我无法判断您的代码是否有效,因为我使用 RestKit 来使用 REST 接口(interface),但是导致 NSURLErrorDomain Code=-1012 的最常见问题是自签名证书没有指向 Web 服务地址的 subject alternative name 扩展名。

要检查您的证书,请下载 Portecle app ,如果您需要查看 ssl 证书,则非常有用。运行它并从菜单中选择“检查”->“检查证书”并导航到您的证书。您将看到有关您的证书的基本信息,现在按检查按钮,然后按主题备用名称,并确保您的 Web 服务的正确 IP 地址在那里。如果没有,您需要使用此信息重新创建证书。

关于iOS 和 SSL : Unable to validate self-signed server certificate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10979922/

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