題 嘗試使用PKCS8Generator生成的導入pem文件時無法加載私鑰(無法識別的數據類型)


我使用java(KeyPairGenerator)使用下面提到的規範創建KeyPair

  1. OpenSSH公鑰格式
  2. Base64編碼的DER格式
  3. RFC4716中指定的SSH公鑰文件格式

生成的公共是驗證並且私鑰存儲在pem文件中使用PKCS8Generator無效。當我嘗試導入puttygen amd中的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


3
2018-03-30 06:22


起源


不知道,但這應該可以去StackOverflow ...... - Jakuje


答案:


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支持到現在。)


3
2018-03-30 08:18