【发布时间】:2014-11-12 09:23:56
【问题描述】:
这个问题显然很相似,但没有任何答案:Programmatically create a x509 certificate for iPhone without using OpenSSL
在我们的应用程序(服务器、客户端)中,我们正在实现客户端身份验证(基于 X509Certificate 的 SSL)。我们已经有办法生成keypair,创建PKCS10 Certificate Signing Request,由self-signed CA 签名并创建X509Certificate,然后发回。但是,要在 SSL 请求中使用此证书,private key 和 X509Certificate 必须导出到 PKCS12 (P12) keystore。
有没有人知道如何做到这一点,或者即使有可能?客户端必须生成P12文件(我们不想泄露私钥),客户端运行iOS,是移动设备。该解决方案适用于使用 BouncyCastle (SpongyCastle) 的 Android,但我们没有发现适用于 iOS。
编辑:在 Java 中,此导出通过以下方式完成:
ByteArrayOutputStream bos = new ByteArrayOutputStream();
KeyStore ks = KeyStore.getInstance("PKCS12", BouncyCastleProvider.PROVIDER_NAME);
ks.load(null);
ks.setKeyEntry("key-alias", (Key) key, password.toCharArray(),
new java.security.cert.Certificate[] { x509Certificate });
ks.store(bos, password.toCharArray());
bos.close();
return bos.toByteArray();
【问题讨论】:
-
您是否有任何理由不在服务器上使用 API 来完成这项工作?
-
@remus 是的,P12 文件是根据客户端的私钥和客户端的证书创建的,客户端不必将其私钥/公钥发送到服务器如果没有必要。如果它脱离你的手只是为了你可以使用它就不是真正的私人,是吗:)
-
'`但是,要在 SSL 请求中使用此证书,必须将私钥和 X509Certificate 导出到 PKCS12 (P12) keystone。这根本不正确。您可以使用 Security 框架生成密钥对并将其存储在 keychain/NSURLCredentialStorage 中。绝对不建议将私钥作为文件存储在文件系统上!
标签: ios objective-c ssl cryptography authentication