首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在iOS中验证(和要求)自签名证书

如何在iOS中验证(和要求)自签名证书
EN

Stack Overflow用户
提问于 2013-01-01 09:33:01
回答 2查看 6.3K关注 0票数 9

我想使用iOS中的代码附带的自签名证书创建到我的服务器的SSL连接。这样,我就不必担心更复杂的中间人攻击,在这种攻击中,有人可以访问高级别的“受信任”证书颁发机构。我在使用我认为是苹果的标准方式时遇到了问题。

通过过程found here生成证书

代码语言:javascript
运行
复制
# Create root CA & private key
openssl req -newkey rsa:4096 -sha512 -days 9999 -x509 -nodes -out root.pem.cer
# Create a certificate signing request
openssl req -newkey rsa:4096 -sha512 -nodes -out ssl.csr -keyout ssl.key
# Create an OpenSSL Configuration file from http://svasey.org/projects/software-usage-notes/ssl_en.html
vim openssl.conf
# Create the indexes
touch certindex
echo 000a > certserial
echo 000a > crlnumber
# Generate SSL certificate 
openssl ca -batch -config openssl.conf -notext -in ssl.csr -out ssl.pem.cer
# Create Certificate Revocation List
openssl ca -config openssl.conf -gencrl -keyfile privkey.pem -cert root.pem.cer -out root.crl.pem
openssl crl -inform PEM -in root.crl.pem -outform DER -out root.crl && rm root.crl.pem

和iOS代码:

代码语言:javascript
运行
复制
- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
  NSURLProtectionSpace *protectionSpace = [challenge protectionSpace];
  if ([protectionSpace authenticationMethod] == NSURLAuthenticationMethodServerTrust) {
    // Load anchor cert.. also tried this with both certs and it doesn't seem to matter
    NSString *path = [[NSBundle mainBundle] pathForResource:@"root.der" ofType:@"crt"];
    NSData *data = [[NSData alloc] initWithContentsOfFile:path];
    SecCertificateRef anchorCert = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef)data);
    CFMutableArrayRef anchorCerts = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
    CFArrayAppendValue(anchorCerts, anchorCert);

    // Set anchor cert
    SecTrustRef trust = [protectionSpace serverTrust];
    SecTrustSetAnchorCertificates(trust, anchorCerts);
    SecTrustSetAnchorCertificatesOnly(trust, YES); // only use that certificate
    CFRelease(anchorCert);
    CFRelease(anchorCerts);

    // Validate cert
    SecTrustResultType secresult = kSecTrustResultInvalid;
    if (SecTrustEvaluate(trust, &secresult) != errSecSuccess) {
      [challenge.sender cancelAuthenticationChallenge:challenge];
      return;
    }

    switch (secresult) {
      case kSecTrustResultInvalid:
      case kSecTrustResultDeny:
      case kSecTrustResultFatalTrustFailure:
      case kSecTrustResultOtherError:
      case kSecTrustResultRecoverableTrustFailure: { 
        // !!! It's always kSecTrustResultRecoverableTrustFailure, aka 5
        NSLog(@"Failing due to result: %lu", secresult);
        [challenge.sender cancelAuthenticationChallenge:challenge];
        return;
      }

      case kSecTrustResultUnspecified: // The OS trusts this certificate implicitly.
      case kSecTrustResultProceed: { // The user explicitly told the OS to trust it.
        NSURLCredential *credential = [NSURLCredential credentialForTrust:trust];
        [challenge.sender useCredential:credential forAuthenticationChallenge:challenge];
        return;
      }
      default: ;
        /* It's somebody else's key. Fall through. */
    }
    /* The server sent a key other than the trusted key. */
    [connection cancel];

    // Perform other cleanup here, as needed.
  } else {
    NSLog(@"In weird space... not handling authentication method: %@", [protectionSpace authenticationMethod]);
    [connection cancel];
  }
}

我总是得到kSecTrustResultRecoverableTrustFailure作为结果。我不认为这是本地主机的问题,因为我也尝试过使用苹果的代码来改变这一点。该怎么办呢?

谢谢!

EN

Stack Overflow用户

发布于 2013-01-01 18:04:41

如果信任结果为kSecTrustResultRecoverableTrustFailure,则您可能能够从故障中恢复。

以下是解决方法。

https://developer.apple.com/library/mac/#documentation/security/conceptual/CertKeyTrustProgGuide/iPhone_Tasks/iPhone_Tasks.html#//apple_ref/doc/uid/TP40001358-CH208-SW8

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14107280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档