[英]How do you convert a .CSR / p10 / PKCS#10 file to .DER format in java?
[英]How to check if a file is pkcs#8 DER format in Java?
上傳文件時,我需要檢查文件是否為 Java 中的 pkcs#8 DER 格式,我想也許可以使用 PKCS8EncodedKeySpec 和 getFormat()。
class FileFormatePkcs8{
public static void main(String[] args) {
String filename = args[0];
try {
File f = new File(filename);
byte[] encodedKey = new byte[(int)f.length()];
PKCS8EncodedKeySpec pkcs8Key = new PKCS8EncodedKeySpec(encodedKey);
if(pkcs8Key.getFormat().equals("PKCS#8")) {
System.out.println("It's pkcs8.");
}
else {
System.out.println("It's not pkcs8.");
}
}
catch (Exception ex) {
System.out.println("exception:"+ex.getMessage());
}
}
}
所有輸入的文件都會得到“It's pkcs8”。 結果。 我意識到“PKCS8EncodedKeySpec”將創建 pkcs#8 密鑰,但我不知道使用哪個 class 來替換它。
請注意:PKCS#8 和 DER 都需要檢查,所以我認為 org.bouncycastle.openssl.PEMParser 可以忽略。 還是我走錯了路?
首先,您實際上根本沒有讀取文件的內容。 您只需創建一個與文件大小相同的空緩沖區。 由於此緩沖區不包含任何數據,因此非存在數據不是 PKCS8 格式,也不是 JKS 格式,也不是比特幣錢包格式,也不是任何其他格式。 (注意,您可以只使用byte[] data = Files.readAllBytes(Paths.get(filename))
而不是多個步驟)。
其次,有兩種 PKCS8 DER 格式。
OOTB Java僅當您知道密鑰適用的算法(RSA、DSA、ECDSA/ECDH 等)時才明顯支持 PKCS8 未加密(清除) PrivateKeyInfo
。 如果這樣做,只需為該算法調用KeyFactory.getInstance
,然后使用包含(據稱)PKCS8-clear 的PKCS8EncodedKeySpec
調用.generatePrivateKey
,如果它返回 PrivateKey 的適當子類(並且不拋出異常),則數據實際上是 PKCS8-clear並且適用於該算法。 如果您不知道算法,但只允許或可能使用有限的一組,您可以簡單地依次嘗試每個算法,看看是否有任何(以及哪個)有效。
否則,您必須自己解析 ASN.1(可能,但很重要),或者使用 BouncyCastle(但不是 PEM 部分):調用org.bouncycastle.asn1.pkcs.PrivateKeyInfo.getInstance(der)
並且如果它成功輸入數據要么是 PKCS8 清晰的,要么是非常好的模仿。
對於 PKCS8 加密,Java確實暴露了javax.crypto.EncryptedPrivateKeyInfo
; 只需在數據上調用構造函數,如果它不拋出數據,則看起來像 PKCS8 加密。 然而,這並沒有檢查這些數據是否可以被解密,並且在解密時實際上是一個私鑰,因為它應該是; 為此,如果您知道密碼,請使用epki.getKeySpec()
並結合檢查結果聲稱的 PKCS8-clear 如上所述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.