簡體   English   中英

根據SSLeay格式的密鑰構造Java PrivateKey對象

[英]Construct a Java PrivateKey object from an SSLeay formatted key

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

相反,我正在尋找一種純Java解決方案,用於從SSLeay轉換為PKCS#8或其他可以構造PrivateKey的格式。

Googling顯示了幾個處理SSLeay密鑰的第三方庫(例如,一個來自“ Entrust”的密鑰),但不幸的是,此實現限制為不使用外部庫。 是的我知道。 甚至沒有下議院。

是否有人知道JSE 7標准庫中的任何工具可以幫助您解決此問題? 我不介意親自編寫轉換,但是很難找到SSLeay的精確規范。

謝謝您的指點!

請注意,這個答案只有在像我一樣受到限制的情況下才有用,以避免使用任何第三方庫。 如果被允許使用BouncyCastle或其他庫,那大概是一種更好的方法。

我收到的密鑰是編碼為PEM的OpenSSL(“傳統SSLeay”)DER格式的RSA密鑰。 我可以通過以下方式獲取Java java.security.PrivateKey對象:

  1. 編寫了一個僅處理DER標簽類型2(整數)的簡單DER解析器。 解析器必須處理讀取DER序列標簽(0x30)以及固定長度和可變長度的對象。
  2. 使用String.replace除去PEM字符串中的RSA密鑰標頭和頁腳。
  3. 使用DatatypeConverter.parseBase64Binary()從PEM字符串獲取字節數組。
  4. 使用DER解析器從數據中提取BigInteger :版本,模數,公共指數,私有指數,素數P,素數Q,素數指數P,素數Q和CRT系數(按此順序)。
  5. 從這些值創建了一個java.security.spec.RSAPrivateCrtKeySpec對象( keySpec )。
  6. PrivateKey key = KeyFactory.getInstance("RSA").generatePrivate(keySpec);

這出於我的目的而工作,但是不幸地是重新發明了兩個輪子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM