尝试导入使用 PKCS8Generator 生成的 pem 文件时无法加载私钥(无法识别的数据类型)

尝试导入使用 PKCS8Generator 生成的 pem 文件时无法加载私钥(无法识别的数据类型)

我正在使用 java(KeyPairGenerator) 创建具有下面提到的规范的 KeyPair

  1. OpenSSH 公钥格式
  2. Base64 编码 DER 格式
  3. 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 格式。

相关内容