4

我想向需要客户端证书身份验证的服务器发出 HTTPS 请求。我研究了这个为 NSURLConnection Authentication Challenge 创建一个 SecCertificateRef。它按预期工作。

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

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

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

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

此外,一旦 iOS 客户端以某种方式收到签名证书,这有点离题了。我可以SecCertificateCreateWithData()用来检索一个SecCertificateRef(). 但是,要填写一个NSURLCredential. 我还需要SecIdentityRef使用来自 p12 文件的SecPKCS12Import(). 我怎样才能检索一个SecIdentityRef没有SecPKCS12Import()但只有一个证书文件,如crtor der

4

2 回答 2

10

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

于 2014-01-17T13:02:41.820 回答
2

对于以后遇到这种情况的任何人,我遇到了outfoxx 的 Shield 库,它使通过 Swift 创建 CSR 变得超级容易。

于 2020-06-09T22:55:17.287 回答