我正在使用 java(KeyPairGenerator) 创建具有下面提到的规范的 KeyPair
- OpenSSH 公钥格式
- Base64 编码 DER 格式
- SSH 公钥文件格式如 RFC4716 中指定
生成的公钥是有效的,并且使用 PKCS8Generator 将私钥存储在 pem 文件中是无效的。当我尝试在 puttygen 中导入 pem 文件时,出现错误消息“无法加载私钥(无法识别的数据类型)”,下面是示例代码
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048, new SecureRandom());
KeyPair kp = kpg.generateKeyPair();
Key publicKey = kp.getPublic();
String publicKeyEncoded = "---- BEGIN SSH2 PUBLIC KEY ----" + "\n" +
new String(Base64.getEncoder().encode(publicKey.getEncoded())) + "\n"+
"---- END SSH2 PUBLIC KEY ----";
//Get Private Key and store to pem file.
Key privateKey = kp.getPrivate();
PKCS8Generator encryptorBuilder = new PKCS8Generator((PrivateKey) privateKey);
PEMWriter writer = new PEMWriter(new FileWriter(new File("D:/pk.pem")));
PemObject obj = encryptorBuilder.generate();
writer.writeObject(obj);
writer.flush();
writer.close();
你能帮我一下吗?V
答案1
PuTTY 不支持 PKCS#8 格式 - 仅支持“原始”PEM(PKCS#1)密钥和 SSH.com“类似 RFC4716”的私钥。(最新版本还支持新的 OpenSSH“bcrypt”格式。)
换句话说,该文件需要具有以下标题之一:
PuTTY-User-Key-File-2: <key_type>
(PuTTY .ppk)-----BEGIN RSA PRIVATE KEY-----
-----BEGIN DSA PRIVATE KEY-----
-----BEGIN EC PRIVATE KEY-----
---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----
(SSH.com)-----BEGIN OPENSSH PRIVATE KEY-----
(OpenSSH)
令人困惑的是,人们对 PKCS#1 和 PKCS#8 使用相同的“.pem”扩展名。
(PuTTYgen 缺乏支持的一个可能原因是 OpenSSH 的 ssh-keygen 总是写出 PKCS#1,所以没有人需要到目前为止支持 PKCS#8。)
答案2
对我来说,这个问题通过升级到最新版本的 PuTTYGen。我使用的是 0.63 版本,这个版本不支持新的 OpenSSH 格式。