2012-07-18 246 views
1

有没有在iPhone开发的方式来从我的RSA公钥的X509证书(seckeyref)iPhone从RSA生成X509证书公钥

或有任何想法,我可以怎么我的公共密钥传输到一个java服务器?

感谢帕特里克

回答

0

不知道你的意思。如果你的意思是用RSA全证书,则:

SecCertificateRef cert = ... 
CFDataRef der = SecCertificateCopyData(cert); 

const unsigned char * ptr = CFDataGetBytePtr(der); 
int len = CFDataGetLength(der); 

// now write len bytes from ptr to a file, put it in a POST request 
// to the server, etc. 

,你可以在二进制写出来(作为DER文件),或者转换成的base64为PEM证书。 Java将喜欢DER文件/格式并接受它

FileInputStream certificateStream = new FileInputStream(aboveDerFileOrPost); 
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509"); 
java.security.cert.Certificate[] certs = {}; 
certs = certificateFactory.generateCertificates(certificateStream).toArray(); 
certificateStream.close(); 

排序方式。如果你的意思是你有一个原始的RSA公钥 - 现在你想添加X509的东西,使其成为一个证书,然后签署它 - 这是相当多的工作。 AFAIK需要使用openssl(或者至少我是这么做的)来创建x509结构;然后使用SecTransformExecute()或SecKeyRawSign()进行签名,以便不会违反密钥存储区上的安全规则。

+0

谢谢!你能告诉我如何从我的公钥创建SecCertificateRef(使用SecKeyGeneratePair生成SecKeyRef)吗?或者这是一个“原始RSA公钥”?在iOS上生成密钥对并将公钥传递给(java)服务器的常用方法是什么? – ElPatzo 2012-07-18 14:45:20

+0

这确实是一个原始对 - 它还没有证书信息。不确定你的用例是什么 - 但你可能真的想考虑一下,如果你不能使用openssl。解决苹果限制真的很痛苦。如果你沿着openssl路线走 - 你可以简单地从openssl发行版中取出'req.c';剥下它并使用它。 – 2012-07-18 15:19:30

+0

这个想法是:客户端拥有带服务器公钥(S +)的.pem证书。生成它自己的私人(C-)和公共(C +)密钥对。并将C +发送到服务器(在证书中或不在证书中)。在这个密钥交换之后,传输的数据应该被加密。在黑莓,Windows手机和Android这工作正常..但它几乎是不可能的iPhone – ElPatzo 2012-07-18 15:27:36