簡體   English   中英

如何以Putty或Puttygen可讀格式導出(PKCS#8?)私鑰?

[英]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.

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