在iOS中,使用安全框架是否可以生成证书签名请求(.csr)?

4

我想使用需要客户端证书认证的服务器进行HTTPS请求。我查看了这个Creating a SecCertificateRef for NSURLConnection Authentication Challenge。它如预期一样工作。

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

但是,还有另一个选择。即iOS客户端应该制作证书签名请求(.CSR),并让第三方(服务器)签名它。

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

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

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


我最终构建了OpenSSL以生成CSR文件。为了在没有p12文件的情况下获取SecIdentityRef,我查看了这个 - Yeung
2个回答

12

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

以下是伪代码:

  1. 使用Security Framework中的SecKeyGeneratePair()创建新的公钥/私钥对
  2. 实现getPublicKeyBits方法以检索新公钥的NSData格式(请参见https://developer.apple.com/library/ios/samplecode/CryptoExercise/Introduction/Intro.html
  3. 实现getPrivateKey方法以从Keychain中检索SecKeyRef
  4. 遵循http://www.ietf.org/rfc/rfc2986.txt 构造NSMutableData中CSR的ASN.1 DER
  5. 使用CC_SHA1_*创建Certification Request Info(CSR的一部分)的签名哈希
  6. 使用SecKeyRawSign和私钥签署CSR

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

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


我非常有兴趣看到这个类,不需要打磨它。我已经尝试在iOS上生成CSR两天了。 - joakimb
@ateska 你知道怎么将这个保存为一个正确的文件吗? - Codezy
“proper file” 是什么意思 - 你可以将 NSData 内容直接转储到文件中 - 它将以 DER 格式作为 CSR。 - Ales Teska
@AlesTeska 我们能否像您在RSA中描述的那样,使用ecdsa-with-SHA256创建椭圆曲线CSR(https://github.com/ateska/ios-csr对我非常有帮助),我已经尝试过了,但是一直失败。您能否帮助我解决这个问题,告诉我应该如何操作? - Aleem
@AlesTeska,你能否更改你的库的许可证?这将非常有帮助(在应用商店使用GPL许可软件可能是非法的)。谢谢! - Ben Aubin
显示剩余4条评论

2
对于未来任何遇到这个问题的人,我发现 outfoxx's Shield library 可以通过 Swift 极其轻松地创建 CSR。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接