2013-05-08 75 views
0

我在從外部服務器接收的SSLeay格式私鑰和需要構造爲java.security.PrivateKey派生的對象的Java(JSE 7)應用程序的工作構造一個Java專用密鑰對象。由於密鑰是動態接收的,並且應用程序被禁止使用JNI,因此我無法使用openssl來轉換密鑰。從SSLeay的格式化鍵

相反,我正在尋找用於將從SSLeay的到PKCS#8或從中可以構造一個專用密鑰其他格式純Java解決方案。

谷歌搜索顯示了幾個可處理的SSLeay鍵第三方庫(例如,一個從「委託」),但在此實現很遺憾的是限制爲不使用外部庫。是的我知道。甚至不是Commons。

有沒有人知道JSE 7標準庫中的任何工具可以幫助解決這個問題?我不介意自己介入轉換,但很難找到SSLeay的精確規格。

謝謝你的指點!

回答

0

注意,這個答案只有有用的,如果一個約束,因爲我是,要避免使用任何第三方庫。如果你被允許使用BouncyCastle或其他庫,那大概是更好的方法。

我被接收的關鍵是OpenSSL中的RSA密鑰(「傳統的SSLeay」)編碼,以PEM DER格式。我能得到一個Java java.security.PrivateKey對象以下列方式:

  1. 寫一個簡單的DER解析器僅處理DER標籤2型(整數)。解析器必須處理讀取DER序列標記(0x30)和固定長度和可變長度的對象。
  2. 使用String.replace擺脫PEM字符串中的RSA密鑰頁眉和頁腳。
  3. 使用DatatypeConverter.parseBase64Binary()從PEM字符串中獲取字節數組。
  4. 使用的DER解析器從數據中提取BigInteger S:版本,模量,公開指數,私人指數,素數p,質數q,素指數P,原指數Q,和CRT係數(按該順序)。
  5. 從這些值中創建了一個java.security.spec.RSAPrivateCrtKeySpec對象(keySpec)。
  6. PrivateKey key = KeyFactory.getInstance("RSA").generatePrivate(keySpec);

這個工作對我而言,卻是一對輪子的一個不幸的再造。