我想用服务器进行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()
,而只返回crt
或der
等证书文件?
答案 0 :(得分:8)
iOS中的安全框架中没有明确支持CSR。但是,“手动”构建CSR并不困难 - 它只是iOS运行时可用的ASN.1 DER数据块。
这是伪代码:
SecKeyGeneratePair()
创建新的公钥/私钥getPublicKeyBits
方法以检索NSData形式的新公钥(请参阅https://developer.apple.com/library/ios/samplecode/CryptoExercise/Introduction/Intro.html)getPrivateKey
方法以从Keychain检索SecKeyRef 这将创建适当的CSR(以NSData的形式),可以发送给CA进行审批。
我的实现可以在GitHub上找到:http://github.com/ateska/ios-csr。
答案 1 :(得分:2)
对于以后遇到此问题的任何人,我都遇到过outfoxx's Shield library,这使得通过Swift创建CSR非常容易。