使用 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 的相关文章

  • 从 WildFly 安全地调用 EJB

    我正在尝试以企业 业务 方式重写我的旧应用程序 因此 我有一个带有登录模块的 Swing 客户端和从头开始创建的我自己的服务器 客户端使用ssl证书加密与服务器的TCP连接 我检查服务器上的客户端证书和客户端上的服务器证书 然后服务器使用数
  • 从 UIPickerView 的选定行设置 UIButton 的标题

    详细场景是这样的 我使用循环创建 10 个按钮并设置 0 9 的标签 点击每个按钮时 我将调用 UIPickerView 在其中加载来自不同数组的数据 到这里我就得到了预期的结果 但我希望 pickerView 中选定的行应设置为相应按钮的
  • 如何保护 iOS 应用程序免受任何操作系统攻击(在越狱设备上)

    我希望保护我的应用程序数据 以防任何操作系统攻击或越狱 iOS 设备上的未经授权的访问 在这种情况下 有什么方法可以检测此类威胁并保护应用程序数据 虽然我同意 jrturton 的说法 但如果您有想要保护的关键数据免受流氓应用程序 而不是用
  • iOS 中 NSDecimalNumber 的小数分隔符错误

    我尝试通过以下方式输出具有正确的小数分隔符的十进制数的描述 NSString strValue 9 94300 NSDecimalNumber decimalNumber NSDecimalNumber decimalNumberWithS
  • (Kiss)XML xpath 和默认命名空间

    我正在开发一个 iPhone 项目 需要解析一些 xml xml 可能包含也可能不包含默认名称空间 我需要知道如何解析 xml 以防它使用默认命名空间 由于我需要读取和写入 xml 因此我倾向于使用 KissXML 但我愿意接受建议 这是我
  • Maven:无法传输文件 XXX 返回代码为: 501 ,ReasonPhrase:HTTPS 必需

    我在构建 Maven 项目时收到意外的 501 错误代码 该消息显示需要 HTTPS 但我没有更改我的 settings xml 如何检查我的配置是否发生更改 我怎样才能让事情正常运转 其原因解释于Maven 依赖项失败并出现 501 错误
  • ios swift parse:从 3 个类收集数据

    我有这样的结构 User CardSet 带有指向 User objectId 的指针 user 和 col name 带有点 cards 的卡片到 Card Set objectId 和列 name 我想选择所有卡数据 包括当前用户的卡集
  • Objective-C NSString for 循环与characterAtIndex

    我试图逐个字符地循环遍历 NSString 但出现 EXC BAD ACCESS 错误 您知道如何正确执行此操作吗 我已经在谷歌上搜索了几个小时但无法弄清楚 这是我的代码 m self textLength self text length
  • 会话重新启动后 AVcapture 会话启动缓慢

    我有一个主视图控制器 它连接到具有 avcapturesession 的第二个视图控制器 我第一次从主视图控制器转向捕获会话控制器 大约需要 50 毫秒 使用 仪器 检查 然后我从捕获会话返回到主视图控制器 然后从主控制器返回到 avcap
  • AVAssetExportSession 无法导出从 iCloud 下载的视频

    我正在尝试创建从用户相册中选择的视频的缩小版本 输出的最大尺寸为 720p 因此 在检索视频时 我使用 mediumQualityFormat as the deliveryMode 如果用户设备中不存在原始视频或其中等质量版本 这会导致
  • UIViewControllerAnimatedTransitioning:旋转更改后黑屏片段

    我已经创建了一个视图控制器转换 只要我不更改设备方向 一切都正常 图 1 显示了应有的屏幕 然后我切换到下一个视图控制器 在其中更改方向 现在我回到第一个视图控制器并再次切换方向 然后我得到的结果如图 2 所示 出现黑色边框 请不要介意屏幕
  • iOS 7 上 Safari 浏览器的用户代理

    我只想在带有 Safari 浏览器的 iPhone 和 iPod 中打开我的网站 对于 Chrome Dolphin 等任何其他浏览器 它不应该打开 但目前我从几乎所有设备获得相同的用户代理 对于Safari User Agent Stri
  • Cocoa 应用程序菜单栏不可点击

    我正在我的可可应用程序中构建一个菜单栏 其中包含以下代码 implementation我的自定义应用程序CustomApplication void setUpMenuBar CustomApplication sharedApplicat
  • 贴纸包会在模拟器上使 iMessage 崩溃,但在 iPhone 上不会崩溃

    按照 Apple 的在线说明和视频在 Xcode 中创建了一个贴纸包 所有图像的尺寸均正确且远低于文件大小阈值 如果我在我的实体 iPhone 上构建并运行贴纸包 一切都会完美运行 如果我在模拟器上构建并运行贴纸包 对于任何模拟的 iPho
  • 在 UIWebView 中播放 Facebook 视频

    有谁知道如何在 Facebook 上播放视频UIWebView 我的应用程序将视频上 传到 Facebook 并检索视频的网址 我想将此网址嵌入到UIWebView播放 我已经为 youtube 解决了这个问题 但没有为 Facebook
  • TableViewController 的 viewDidLoad 未触发

    我一直在关注这个tutorial http www appcoda com ios programming sidebar navigation menu 有一个滑出式菜单 我添加了一个 TableViewController 它将显示文章
  • CoreBluetooth:检测设备超出范围/连接超时

    我正在设计一个 iOS 框架来处理多个 BLE 设备 均为同一类型 目前一切都运行良好 除了一件事 客户想要一个包含可用设备的列表 但是 我如何检测过去发现的设备何时不再可用 当我尝试连接到不再可用的设备时 会出现另一个问题 文档说 连接尝
  • 模态转场需要点击 2 次而不是 1 次

    我的 UITableView 需要点击 2 次才能显示所选单元格的详细信息页面 一次用于选择 另一次用于显示详细信息视图 我希望有一个 CLI 直接显示所单击单元格的详细视图 我在 UITableViewManager m 中使用此方法的模
  • 像 TraceGL 一样分析 Objective C 中的代码路径?

    TraceGL 是一个非常简洁的项目 它允许 JS 程序员跟踪 Javascript 中的代码路径 它看起来像这样 我想为 Objective C 构建类似的东西 我知道运行时使跟踪方法调用变得相当容易 但是我如何跟踪控制流 例如 在上面的
  • ios - 如何声明静态变量? [复制]

    这个问题在这里已经有答案了 C 中声明的静态变量如下 private const string Host http 80dfgf7c22634nbbfb82339d46 cloudapp net private const string S

随机推荐

  • 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