2012-07-18 175 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