[英]How can I export a (PKCS#8?) private key in Putty or Puttygen readable format?
我正在編寫一個使用AWS Java API創建新的Amazon Web Services服務器的工具。 創建服務器時,必須指定AWS在您的帳戶中存儲的公鑰中使用的SSH密鑰對。 您可以自己生成密鑰對並導入公鑰,或者您可以讓AWS生成密鑰對並下載私鑰。
我正在嘗試自己生成密鑰對,將公鑰導入AWS,使用新注冊的密鑰對條目啟動新服務器並在本地保存私鑰。 然后我想使用私有密鑰將Putty用於ssh到我的新服務器,可能首先將它傳遞給Puttygen進行轉換。
到目前為止,我已經生成了我的密鑰對,成功地將公鑰導入AWS並啟動了新服務器。 但是,我不能為我的生活似乎能夠以任何格式導出私鑰,Putty或Puttygen會接受。
這是我生成密鑰對並保存私鑰的代碼:
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
random.nextBytes(new byte[]{}); //toss out the first result to ensure it seeds randomly from the system.
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(KEY_LENGTH, random);
KeyPair keyPair = keyGen.genKeyPair();
BASE64Encoder encoder = new BASE64Encoder();
FileOutputStream out = null;
File keyPath = new File(_keyStorageDir, "private.pem");
try
{
out = new FileOutputStream(keyPath);
out.write(encoder.encode(keyPair.getPrivate().getEncoded()).getBytes());
}
finally
{
if(out != null)
out.close();
}
但是,當我嘗試在PuttyGen中導入密鑰時,我得到“無法加載密鑰(不是私鑰)”。 如果我嘗試添加----- BEGIN PRIVATE KEY -----及其相應的頁腳我得到“無法加載私鑰(無法識別的密鑰類型)。如果我嘗試RSA PRIVATE KEY我得到”無法加載私有密鑰(ASN.1解碼失敗)“。
調用keyPair.getPrivate().getFormat()
產生“PKCS#8”。 雖然我已經找到了使用OpenSSL工具從該格式轉換為pem格式的引用,但我還沒有找到任何關於如何在Java中實際執行此操作的內容。
如何以pem格式導出密鑰以便Puttygen可以讀取它?
現在不需要FYI或其他任何人,Puttygen也可以進口:
OpenSSH使用的格式(總是直到最近,仍然是默認),這是OpenSSL 在實現PKCS#8 之前定義的原始“遺留”格式 - 對於RSA,這是PKCS#1,相當於PKCS的一部分 # 8;
或'商業'SSH.COM使用的格式,完全不同於PKCS#8。
因此,您可以從RSAPrivateKey.getEncoded()
獲取PKCS#8,解析PKCS#8的字節以獲取PKCS#1部分,以及base64 / PEMify。 這實際上是你可能發現使用openssl rsa -in pkcs8 -out rsa
完成的建議。
但你找到的方法(使用Bouncy)更容易。 對於DSA或ECDSA,如果您想使用它們(最好只支持Java 8+,支持超過1024的DSA大小,符合186-3和當前的良好實踐),情況會更好。
啊哈!
訣竅是使用Bouncycastle的pem處理類。 這是一個有效的演示:
import org.bouncycastle.openssl.jcajce.JcaPEMWriter;
import java.io.File;
import java.io.FileWriter;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
public class Main
{
public static final int KEY_LENGTH = 2048;
public static void main(String[] args) throws Exception
{
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
random.nextBytes(new byte[]{}); //toss out the first result to ensure it seeds randomly from the system.
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(KEY_LENGTH, random);
java.security.KeyPair keyPair = keyGen.genKeyPair();
System.out.println("public format: " + keyPair.getPublic().getFormat());
System.out.println("public algorithm: " + keyPair.getPublic().getAlgorithm());
System.out.println("private format: " + keyPair.getPrivate().getFormat());
System.out.println("private algorithm: " + keyPair.getPrivate().getAlgorithm());
JcaPEMWriter writer = null;
File keyDir = new File("C:/misc/test_key");
try
{
writer = new JcaPEMWriter(new FileWriter(new File(keyDir, "private_bc.pem")));
writer.writeObject(keyPair.getPrivate());
}
finally
{
if(writer != null)
writer.close();
}
}
}
Puttygen無需投訴即可打開生成的私鑰!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.