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

时间:2013-06-24 14:24:12

标签: ios ssl openssl ssl-certificate csr

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

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

然而,可能还有其他选择。那就是ios-client应该发出证书签名请求(.CSR)并让第三方(它是服务器)签名。

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

真的需要openssl来实现这个目标吗?

此外,有点偏离主题,一旦ios-client以某种方式取回签名证书。我可以使用SecCertificateCreateWithData()来检索SecCertificateRef()。但是,要填写NSURLCredential。我还需要来自p12文件的SecIdentityRef SecPKCS12Import()。如何在没有SecIdentityRef的情况下撤回SecPKCS12Import(),而只返回crtder等证书文件?

2 个答案:

答案 0 :(得分:8)

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方法以从Keychain检索SecKeyRef
  4. 按照http://www.ietf.org/rfc/rfc2986.txt在NSMutableData
  5. 中构建CSR的ASN.1 DER
  6. 使用CC_SHA1_ *创建认证请求信息(CSR的一部分)的签名哈希
  7. 使用SecKeyRawSign和私钥签署CSR
  8. 这将创建适当的CSR(以NSData的形式),可以发送给CA进行审批。

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

答案 1 :(得分:2)

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