【问题标题】:Is it possible to generate certificate signing request(.csr) using security framework in iOS?是否可以在 iOS 中使用安全框架生成证书签名请求(.csr)?
【发布时间】:2013-06-21 02:25:19
【问题描述】:

我想向需要客户端证书身份验证的服务器发出 HTTPS 请求。我调查了这个Creating a SecCertificateRef for NSURLConnection Authentication Challenge。它按预期工作。

但是,它需要准备包含私钥的 p12 文件。它将受到保护,因为它需要密码才能使用 SecPKCS12Import() 导入 p12 文件。

但是,可能还有其他选择。也就是说,iOS 客户端应该发出证书签名请求(.CSR)并让第三方(服务器)对其进行签名。

对于我的搜索,我发现我可以使用SecKeyGeneratePair() 来生成密钥对。但我没有看到任何生成 CSR 的 API。

我真的需要 OpenSSL 来实现这一点吗?

另外,有点离题了,一旦 iOS 客户端以某种方式收到签名证书。我可以使用SecCertificateCreateWithData() 来检索SecCertificateRef()。但是,要填写NSURLCredential。我还需要使用SecPKCS12Import() 来自p12 文件的SecIdentityRef。如何在没有 SecPKCS12Import() 的情况下检索 SecIdentityRef 而只是像 crtder 这样的证书文件?

【问题讨论】:

  • 我最终构建了OpenSSL 来生成CSR 文件。要在没有 p12 文件的情况下获得 SecIdentityRef,我查看了 this

标签: ios ssl openssl ssl-certificate csr


【解决方案1】:

iOS 的安全框架中没有明确支持 CSR。但是,“手动”构建 CSR 并不难 - 它只是 iOS 运行时可用的 ASN.1 DER 数据块。

这是它的伪代码:

  1. 使用安全框架中的SecKeyGeneratePair() 创建新的公钥/私钥
  2. 实现 getPublicKeyBits 方法以检索新公钥的 NSData 形式(参见 https://developer.apple.com/library/ios/samplecode/CryptoExercise/Introduction/Intro.html
  3. 实现getPrivateKey方法从钥匙串中检索SecKeyRef
  4. 按照http://www.ietf.org/rfc/rfc2986.txt在NSMutableData中构造CSR的ASN.1 DER
  5. 使用 CC_SHA1_* 创建认证请求信息的签名哈希(CSR 的一部分)
  6. 使用 SecKeyRawSign 和私钥签署 CSR

这将创建适当的 CSR(以 NSData 的形式),可以发送给 CA 以供批准。

我的实现在 GitHub 上可用:http://github.com/ateska/ios-csr

【讨论】:

  • 我对这门课很感兴趣,无需打磨。我已经尝试在 iOS 上生成 csr 2 天了。
  • @ateska 你知道如何将其保存为正确的文件吗?
  • “正确的文件”是什么意思 - 您可以将 NSData 内容转储到文件中 - 它将是 DER 格式的 CSR。
  • 有谁知道我应该使用哪个 OID 将电子邮件地址也插入到 CSR 中?我用的1.2.840.113549.1.9.1的那个不行。
  • @i-developer - 电子邮件是主题的一部分,而不是 CSR 的专用项目(最常见)。
【解决方案2】:

对于以后遇到此问题的任何人,我遇到了outfoxx's Shield library,这使得通过 Swift 创建 CSR 变得超级容易。

【讨论】:

    猜你喜欢
    • 2019-01-04
    • 2015-11-28
    • 2016-02-23
    • 2013-04-07
    • 2010-09-15
    • 2020-01-17
    • 2018-06-20
    相关资源
    最近更新 更多