NSURLCredentialStorage 和客户端证书认证

2023-12-01

从我在 MPMoviewPlayerController 的文档中看到的,NSURLCredentialStorage 可以设置为 NSURLConnection 身份验证挑战的替代方案(这对于从 URL 加载资源但抽象 NSURLConnection 并且不提供处理身份验证的委托的高级类很有用)挑战)。这看起来类似于在浏览器中安装证书并在某个地址需要时自动选择所需的证书。

为了测试这一点,我设置了自己的证书颁发机构、服务器证书和客户端证书(.p12 文件)。我已经设置了一个 https 服务器,并使用浏览器从一台单独的计算机成功测试了客户端证书。

现在我需要将证书集成到我的 iPhone 应用程序中。

我已经捆绑了 p12 文件,并在应用程序启动时执行以下操作:

NSString *thePath = [[NSBundle mainBundle] pathForResource:@"clientside" ofType:@"p12"];
NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:thePath];
CFDataRef inPKCS12Data = (CFDataRef)PKCS12Data;    
SecIdentityRef identity;
SecTrustRef trust;
extractIdentityAndTrust(inPKCS12Data, &identity, &trust);

SecCertificateRef certificate = NULL;
SecIdentityCopyCertificate (identity, &certificate); 

const void *certs[] = {certificate};
CFArrayRef certArray = CFArrayCreate(kCFAllocatorDefault, certs, 1, NULL);

NSURLCredential *credential = [NSURLCredential credentialWithIdentity:identity certificates:(NSArray*)certArray persistence:NSURLCredentialPersistencePermanent];

NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc]
                                         initWithHost: @"myhostname"
                                         port: 443
                                         protocol: @"https"
                                         realm: nil
                                         authenticationMethod: NSURLAuthenticationMethodClientCertificate];

[[NSURLCredentialStorage sharedCredentialStorage]
 setDefaultCredential: credential
 forProtectionSpace: protectionSpace];

extractIdentityAndTrust 函数只是从“iOS 的证书、密钥和信任服务任务”文档页面复制而来(我只是用自己的密码替换了证书密码)。

据我所知,身份和证书加载得很好。如果我在控制台中打印 NSURLCredential 对象,我会得到如下内容:<NSURLCredential: 0x140ea0>: (null)(我不知道这是否是一个好兆头)。

但是,当我执行 setDefaultCredential 时,应用程序崩溃而没有提供太多信息。

堆栈跟踪看起来像这样:

#0  0x350a41c8 in CFHash
#1  0x3515180c in __CFBasicHashStandardHashKey
#2  0x351534e4 in ___CFBasicHashFindBucket_Linear
#3  0x350a4000 in CFBasicHashFindBucket
#4  0x350a3ecc in CFDictionaryGetValue
#5  0x344a0df2 in URLCredentialStorage::setDefaultCredentialForProtectionSpace
#6  0x3446a5aa in CFURLCredentialStorageSetDefaultCredentialForProtectionSpace
#7  0x339ec79e in -[NSURLCredentialStorage setDefaultCredential:forProtectionSpace:]
#8  0x00002612 in -[AVPlayerExampleViewController awakeFromNib] at AVPlayerExampleViewController.m:84

在我看来,凭证中似乎没有设置某些内容。

关于如何解决这个问题有什么想法吗?

EDIT:

为了进行测试,我通过从 Mail 打开文件在 iPhone 上安装了证书。我可以通过 Safari 通过 https 访问页面,但不能通过我的应用程序访问。

唯一有效的是,如果我打开一个 NSURLConnection 到受保护域上的任何资源,响应 didReceiveAuthenticationChallenge (我加载我的凭据与上面的代码完全相同,只是我将其直接发送到 NSURLAuthenticationChallenge 的发件人),然后访问这些内容我真的需要使用更高级别的课程。


NSURLCredentialStorage 仅适用于用户名和密码 NSURLCredentials(不支持证书),这似乎是一个已知问题。不幸的是,文档没有提到这一点。

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

NSURLCredentialStorage 和客户端证书认证 的相关文章

随机推荐

  • 实体框架仅返回一个值,但列表大小正确

    实体框架仅返回一个值 但列表大小正确 我有一个没有主 ID 的表 我需要获取或选择其中的所有值 我看到的是 当我使用 linq 进行选择时 对象的数量是正确的 但它一遍又一遍地是第一行 我只是在做这样的事情 List
  • 回溯如何与标记一起使用?

    我在互联网上进行了搜索 但找不到关于回填如何工作的正确解释 您能解释一下回溯是如何工作的吗 它如何与markers 我知道它有两种主要类型的标记 其中有下一个四边形 其中包含下一个列表 I found 这段代码 其中他们获取输入文件并使用
  • Shiny:通过单击 valueBox 触发弹出窗口

    我想通过单击在弹出窗口中显示数据表valueBox The valueBox本身应该作为actionButton 当我点击valueBox它应该在弹出窗口中呈现一个表格 如下图所示 任何人都可以帮忙解决这个代码吗 My code libra
  • 如何从 Auth::attempt() 检索更具体的错误

    我对 laravels Auth attempt 有一次奇怪的经历 我为用户制作了一个注册页面 一切正常 您可以 sign up 确认电邮 sign in etc 现在奇怪的部分是 Auth attempt 对于任何数据输入都可以正常工作
  • 如何停止Spring的默认输出?

    我是春天的新手 当我运行 Spring 批处理应用程序时 我期望只看到 Hello World 但相反 我得到以下附加详细信息 May 03 2012 12 28 42 PM org springframework context supp
  • 如何将关闭按钮添加到 UIModalPresentationFormSheet 中呈现的模态视图角?

    我想在某个角落添加一个浮动关闭 x 按钮UIModalPresentationPageSheet看法 效果如下 但是将其添加到父视图会使其显示在页面表后面 并且也无法点击 并将其添加到页面表将使其部分隐藏 因为它超出了视图区域 还有更好的解
  • Javascript:如何找到第一个重复值并返回其索引?

    我必须在数组中找到第一个重复值 然后在变量firstIndex 中返回其索引 这必须通过 for 循环来完成 for 循环应该在找到第一个重复项后停止 我知道这可能很简单 但我被困住了 到目前为止我已经有了这个 但它似乎不起作用 var n
  • SSL密钥交换加密技术[关闭]

    Closed 这个问题是无关 目前不接受答案 匿名 DH 临时 DH 和固定 DH 三种密钥交换算法有何区别 From 思科的文档 固定迪菲 赫尔曼 这是 Diffie Hellman 密钥交换 其中 服务器的证书包含 Diffie Hel
  • 从 UILabel Swift 中获取 Int

    我遇到的问题是 有大量以数字作为标签的按钮 所以我想我可以将标签视为整数 而不是为每个按钮创建一个操作 IBAction func NumberInput sender UIButton var input Int sender title
  • 使用 Foundation 6 的中间人

    我想将 Middleman 与出色的 Foundation 6 一起使用 Here是我在 Middleman 网站上找到的一个存储库 我安装了 Middleman 以及 Xcode 开发人员工具 当我跑步时middleman init T
  • 如何在android中的服务中调用振动器

    我正在尝试运行vibrator如果从我的应用程序调用服务 我将从Fragment但我不知道为什么振动器在服务内不起作用 我什至无法打印Toast 我的代码 从片段调用 Intent buzz new Intent getActivity L
  • Entity Framework Core 中动态更改架构

    UPD here这是我解决问题的方法 尽管它可能不是最好的 但它对我有用 我在使用 EF Core 时遇到问题 我想通过模式机制在项目数据库中分离不同公司的数据 我的问题是如何在运行时更改架构名称 我找到了类似的问题关于这个问题 但它仍然没
  • Google 图表:自定义刻度

    我想在 Google 图表的水平轴上设置自己的刻度 我包括了 hAxis ticks 根据文档 在我下面的尝试中 但它拒绝工作 因为刻度仍然不是整数 即使我指定它们是整数 我究竟做错了什么
  • 是否可以在未计算的上下文中从 STD 形成指向不可寻址函数的指针?

    如中所述命名空间 std 6 让 F 表示标准库函数 除非 F 被指定为可寻址函数 否则如果 C 程序显式或隐式尝试形成指向 F 的指针 则其行为是未指定的 可能是格式错误的 这对于以下程序意味着 include
  • 字符 Å Ö 没有显示在我的 DDL 中,我如何告诉 Restclient 使用特定的字符集?

    在我开始之前 这里是一个问题 应该是这样的 Bj rn Nilsson 相反 它显示奇怪的特殊字符 所有包含字符 和 的值都变成这样 我用 XML 格式的 API 中的值填充我的 DDL 其中包含所有值 并且我们还使用 Linq2Rest
  • 如何显示带有动态创建的姓名首字母的头像图标

    我有一个要求 通过传递名称 它应该返回头像 图标 其中包含该名称中包含的单词的第一个字母 例如 如果我通过 John Abraham 它应该返回一个带有 JA 的图标 我需要在 SAPUI5 控件中使用该图标 我对此没有任何想法 如何实施
  • Java 一行 if 不适用于打印[重复]

    这个问题在这里已经有答案了 如果你写这样的东西 boolean condition String out condition true false System out println out 有用 但如果你写 condition Syst
  • 正则表达式将所有字符都放在第一个空格的右侧?

    我正在尝试创建一个正则表达式 该表达式将匹配字符串中第一个空格之后 但不包括 的所有字符 输入文本 foo bar bacon 期望的比赛 bar bacon 到目前为止我发现的最接近的是 s 然而 这与 bar bacon 之外的第一个空
  • Eclipse 插件更新错误日志在哪里?

    当我尝试更新一个 Eclipse 插件时 它显示以下错误 但我在 Eclipse 文件夹下没有找到任何内容 日志路径在哪里 an error has occurred see the error log for details Thx 该日
  • NSURLCredentialStorage 和客户端证书认证

    从我在 MPMoviewPlayerController 的文档中看到的 NSURLCredentialStorage 可以设置为 NSURLConnection 身份验证挑战的替代方案 这对于从 URL 加载资源但抽象 NSURLConn