簡體   English   中英

如何以Java本機讀取OpenSSH或OpenSSL私鑰?

[英]How to read an OpenSSH or OpenSSL private key natively in Java?

我想在不使用BouncyCastle的情況下以Java本機讀取OpenSSL私鑰。

我已經對此進行了廣泛的搜索,但是找不到答案。 當您看到類似以下的鍵時:

-----BEGIN EC PRIVATE KEY-----
...base64 here....
-----END EC PRIVATE KEY-----

那是什么格式? 它似乎與OpenSSH密鑰具有相同的編碼(我認為)。 不是 pkcs8 ,盡管OpenSSL允許您使用帶有-topk8參數的pkcs8命令將其密鑰格式轉換為pkcs8

我當然不是唯一遇到此問題的人,但是盡管進行了廣泛的搜索,但我找不到答案。 謝謝!

編輯:建議的重復項都沒有談論使用純Java解決方案(沒有openssl)和沒有充氣城堡。 除非提出了確切的問題,否則請不要將其標記為重復項。

西方開發商很容易不知道在亞洲國家開展業務的方式。 例如,中國擁有完整的EC曲線集,這些曲線在OpenSSL和Bouncycastle中是聞所未聞的,用於企業間貿易,因此這兩個工具(OpenSSL和Bouncycastle)要么是很舊的版本,要么在以下版本中不可用所有。 諸如“ just use openssl”之類的答案既無用,也無建設性。

https://tools.ietf.org/html/rfc5915

  1. 橢圓曲線私鑰格式

    本節提供EC私鑰的語法。 計算上,EC私鑰是一個無符號整數,但為了表示,EC私鑰信息應具有ASN.1類型的ECPrivateKey:

ECPrivateKey ::= SEQUENCE {
 version        INTEGER { ecPrivkeyVer1(1) } (ecPrivkeyVer1),
 privateKey     OCTET STRING,
 parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,
 publicKey  [1] BIT STRING OPTIONAL
}

起始塊和結束塊之間的Base64塊是ASN.1編碼的私鑰數據,格式為他的答案中所述的bartonjs。 如果沒有圖書館來接管您的工作,則您必須自己進行加載。 例如,可以在此處找到有關如何為RSA執行此操作的示例。 通過將相應的算法名稱傳遞給KeyFactory.getInstance(...);可以類似的方式加載其他格式KeyFactory.getInstance(...); 為此,您必須在begin-block處解析文本,並從那里的名稱到用於創建工廠的算法名稱進行映射(大多數應與該塊中提供的相同) ,但我不確定問題中提供的示例中使用的橢圓曲線)。

需要將base64塊解碼為字節數組,以將其傳遞給KeySpec

暫無
暫無

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

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