java – 如何以Putty或Puttygen可读格式导出(PKCS#8?)私钥?

我正在编写一个使用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之前定义的原始aka遗留格式
– 对于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和当前的良好实践).

点赞