[英]Read private key from PFX file, decrypt the ciphertext with that private key
[英]How do i read the private key in java from a pfx certificate
我試圖讀取私鑰我java。我學會了為了做到這一點我必須從我的完整證書中提取私有密鑰的pfx格式。 我已經嘗試了下面的open ssl命令將pfx轉換為pem然后再轉換為pk8,但是當我嘗試在java中讀取密鑰時,它表示無效的密鑰格式
將pfx轉換為pem
openssl pkcs12 -in C:\Documents\xbox-token\conversion\xbox
token-FullCert.pfx -nocerts -out C:\Documents\xbox-token\conversion\xboxkey.pem
刪除密碼保護
openssl rsa -in C:\Documents\xbox-token\conversion\xboxkey.pem -out C:\Documents\xbox-token\conversion\xboxkey.pem
將pem轉換為pk8
openssl pkcs8 -topk8 -in C:\Documents\xbox-token\conversion\xboxkey.pem -out C:\Documents\xbox-token\conversion\xboxprv.pk8
在java代碼中
byte[] encodedPrivateKey=null;
File privateKeyFile = new File("C:/Documents/xbox-token/conversion/xboxprv.pk8");
FileInputStream inputStreamPrivateKey = null;
try {
inputStreamPrivateKey = new FileInputStream(privateKeyFile);
encodedPrivateKey = new byte[(int)privateKeyFile.length()];
inputStreamPrivateKey.read(encodedPrivateKey);
inputStreamPrivateKey.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Create the private key.
PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedPrivateKey);
System.out.println(encodedPrivateKey);
System.out.println(privateKeySpec);
RSAPrivateKey privateKey = null;
try {
privateKey = (RSAPrivateKey)KeyFactory.getInstance("RSA").generatePrivate(privateKeySpec);
} catch (InvalidKeySpecException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
我收到了java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:無效的密鑰格式
任何人都可以幫忙
我認為訣竅是用openssl做一點,然后讓keytool做所有真正的工作。 因此,使用openssl將您現有的證書和密鑰轉換為PKCS12文件。 使用openssl你會有類似的東西。
openssl pkcs12 \
-export -in cert.crt \
-inkey cert.key \
-certfile ica.crt \
-name "yourKey" \
-out cert.p12
然后神奇的是將.p12導入到您的密鑰庫中,就像它是另一個密鑰庫一樣。
$JAVA_HOME/bin/keytool \
-importkeystore -deststorepass secret \
-destkeypass secret -destkeystore $KEYSTORE \
-srckeystore cert.p12 \
-srcstoretype PKCS12 \
-srcstorepass secret \
-alias "yourKey"
您可以選擇在java中使用它,但我希望完整的答案涉及以下內容。
import java.security.KeyStore;
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
FileInputStream instream = new FileInputStream(new File("/your/keystore"));
trustStore.load(instream, "secret".toCharArray());
希望它有效!
如果您沒有為OpenSSL命令指定輸出格式,您將獲得PEM編碼的文件。 Java將期待DER編碼。 而不是你上次的openssl調用嘗試:
openssl pkcs8 -topk8 -inform=PEM -outform=DER
-in C:\Documents\xbox-token\conversion\xboxkey.pem
-out C:\Documents\xbox-token\conversion\xboxprv.pk8
不應該要求'-inform'參數(似乎是默認值),但'-outform'可能是。
如果要檢查您的格式:PEM文件是ASCII(Base64編碼),DER文件是二進制文件。 如果您的文本編輯器喜歡它,Java可能不會。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.