使用 NSURLConnection 通过自签名证书连接到 https 时出现 kSecTrustResultRecoverableTrustFailure

2024-01-03

我在这里看到了一些问题,但没有一个对我有帮助。人们解决的问题主要是重新生成服务器证书:kSecTrustResult RecoverableTrustFailure 的原因是什么? https://stackoverflow.com/questions/7715426/what-is-the-reason-of-ksectrustresultrecoverabletrustfailure/8937798#8937798

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

据我了解,我可以将客户端证书捆绑到应用程序中并使用它进行验证。我对吗?我可以在没有来自服务器的任何内部数据的情况下获得有效的客户端证书吗?

我在这里用谷歌搜索了一个教程http://www.indelible.org/ink/trusted-ssl-certificates 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 始终是 kSecTrustResult RecoverableTrustFailure。

我究竟做错了什么?谢谢。

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

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


假设我需要使用自签名证书与服务器建立 https 连接。我没有来自服务器的任何内部数据,例如其私钥。

在这种情况下,您需要安全多元化策略。古特曼在他的书中详细介绍了这一点工程安全 https://www.cs.auckland.ac.nz/~pgut001/pubs/book.pdf.

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

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


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

For kSecTrustResultUnspecified, see 技术问答 QA1360 https://developer.apple.com/library/mac/qa/qa1360/_index.html。本质上,它是一个可恢复的错误。问答说要提示用户。古特曼(和我)说要使用如上所述的安全多元化策略。

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

此外,安全多元化策略甚至适用于kSecTrustResultProceed。考虑:两者数码诺塔 http://en.wikipedia.org/wiki/DigiNotar and 信任波 http://www.computerworld.com/s/article/9224082/Trustwave_admits_issuing_man_in_the_middle_digital_certificate_Mozilla_debates_punishment破坏了 PKI{X},Cocoa/CocoaTouch 非常乐意返回kSecTrustResultProceed。这并不是 Cocoa/CocoaTouch 的错 - PKI{X} 存在架构缺陷。


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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 NSURLConnection 通过自签名证书连接到 https 时出现 kSecTrustResultRecoverableTrustFailure 的相关文章

随机推荐

  • JavaScript 中的二进制到字符串

    我创建了一个 JavaScript 程序来将字符串转换为二进制 Input StackOverflow Output 1010011 1110100 1100001 1100011 1101011 1001111 1110110 11001
  • 将图表添加到 d3 中的工具提示

    我正在尝试向我的工具提示添加一个简单的条形图 它由两个变量组成 男性和女性 我希望有人能够帮助我将其放入工具提示中 而不是将其附加到当前附加的位置 我已经给了它一个要附加的特定区域 以便我知道它实际上正在显示 确实如此 但我不知道如何将其放
  • 使用 Python 请求选择表单

    我想使用一个能够填写表单和处理重定向的 python 库 主页 页面有一个表单 username user password pass 重定向 页面将我带到一个新页面 新 页面有一个指向最终页面的链接 最终 页面有一个表单 Field 1
  • cygwin - 无法执行二进制文件

    我正在尝试从我的 C 代码运行这两个 data 文件来完成我的作业 我已获得所有文件 并且仅用于实现程序的一些功能 所有内容都应该能够运行 make 命令进行编译 我以前运行的是 MAC 只是刚刚开始使用 Windows win 7 因为工
  • 通过 Node js 进行 ffmpeg mp3 流传输

    var fs require fs var child require child process var http require http var input file fs createReadStream remo mp3 http
  • 如何去除html中点击按钮周围的边框?

    我最近开始建立一个网站 并开始在上面制作按钮 但是 每当我单击该按钮时 我都会看到一个蓝色边框 例如this https i stack imgur com 6TGIX jpg 我应该如何摆脱这个边界 提前致谢 将此 css 添加到您的按钮
  • 移动屏幕锁定时广播接收器不会触发

    当我安装该应用程序时 一切正常 每次发送消息时 我都可以打印消息正文 直到锁定手机屏幕 之后 应用程序停止打印传入消息 我尝试了很多方法来克服这个问题 但没有成功 请帮我 public class SmsReceiveActivity ex
  • Polymer 1.0 观察者 - 不在数组上工作

    我设置了一个观察者来捕获数组属性上的所有聚合物识别事件 但我捕获它来捕获更改 在下面的示例中 我的观察者函数 bigup 仅在属性 bigs 首次初始化时才会被调用
  • Xcode 中两个具有重复符号的静态库

    我有两个静态库 它们似乎有重复的符号 TBXML o 并且无法编译 ld duplicate symbol OBJC METACLASS TBXML in Users Hoya Desktop SocialSync include SMUF
  • 使用 Android 手机作为 wifi 网络服务器

    我有一个疯狂的想法 我不知道是否可能 我想做的是将我的手机设置为wifi接入点 然后允许人们连接到它 但自己处理所有传入的http流量 So 手机 wifi 处于接入点模式 开放 wifi 网络 这个花絮有效 是的 我知道它没有得到官方支持
  • Silverlight MSBuild 任务 - Xap 复制到 ClientBin 后执行命令行

    我有一个silverlight项目安排如下 Examples Silverlight Bin Debug ExampleCode 多个子目录 Silverlight Web Bin Debug ClientBin Silverlight W
  • 由于 require-from-string,使用 npm 安装 Angular 时出错

    由于我无法安装 Angular 如何解决此错误 请参阅以下异常 C Users absin node gt npm install g angular cli npm ERR code ETARGET npm ERR notarget No
  • 在 Xcode 终端中运行时找不到“Cordova/CDVViewController.h”文件

    因此 当我尝试从 xcode 终端构建代码时 它失败了 并给出了 Cordova CDVViewController h 文件未找到的错误 但是当我从 xcode 构建此代码时 它构建得很好 在我的 Xcode 中 我已经完成了整个 Cor
  • 如何在 Spring Boot 2 中禁用管理端口的安全性

    我有 执行器 端点 在我的例子中manage 在端口 6565 上 是否可以仅针对特定端口禁用 Spring Boot 2 中的安全性 目前我只能将某些路径排除在安全之外 如果我现在在 manage 下的主应用程序端口 1337 下运行 E
  • Python 中字符串中的所有其他字母都大写吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我一直在尝试定义一个函数 它将大写所有其他字母 并考虑空格 例如 print function name Hello world 应该打印
  • JPA CriteriaBuilder - 按一对多关系中关联实体的数量排序

    我有两个处于一对多关系的实体 客户 和 订单 对于每个客户 我需要计算关联订单的数量 并按该数量对结果进行排序 在本机 postgres 查询中 它看起来像这样 select cust id count order id from cust
  • 使用过滤器和关键字搜索对象数组

    我有一个数组 过滤器和关键字 我想使用过滤器和关键字在该数组中搜索 以及对象的结果数组 就像第一个数组一样 var data email email protected cdn cgi l email protection nama Use
  • maven 排除父 pom 中定义的插件

    我有一个带有一些插件的父 pom 在我的子 pom 中 我想排除一个插件 我怎样才能做到这一点 我有类似的要求 在子 POM 中运行一些插件 但不在父 POM 中运行 我通过陈述实现了这一点
  • 如何在 github 存储库的子文件夹中搜索特定单词或条目

    我只是在寻找一个关于搜索单词的示例 在 github 的高级搜索中触发的正确命令 文件夹内特定存储库的 我想这将涉及 path 选项 但不确定如何使用它 作为示例 我需要在 jquery 测试套件中的以下位置搜索函数名称 clean 或 c
  • 使用 NSURLConnection 通过自签名证书连接到 https 时出现 kSecTrustResultRecoverableTrustFailure

    我在这里看到了一些问题 但没有一个对我有帮助 人们解决的问题主要是重新生成服务器证书 kSecTrustResult RecoverableTrustFailure 的原因是什么 https stackoverflow com questi