【问题标题】:Unprotected private ssh key generated by java prompts for passphrasejava 生成的未受保护的私有 ssh 密钥提示输入密码
【发布时间】:2020-07-28 16:47:09
【问题描述】:

我正在尝试使用 Java 生成一个 ssh 密钥对。对于私钥,没有设置密码。密钥作为 Base64 编码字符串保存到文件中。

问题是私钥似乎受密码保护。如果我使用命令ssh-keygen -y -f <private key file> 测试密钥,则不会显示公钥,而是要求输入密码。如果我只是按回车键,我会得到回复load failed。对于使用命令ssh-keygen -f <key file name> -t rsa -b 4096 生成的私钥,无需密码即可显示公钥。

我已经在 java 中生成了如下所示的密钥对。

    public static void main(String[] args) throws NoSuchAlgorithmException {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(4096);
        
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        String privateKey = generatePrivateKey(keyPair.getPrivate());
        
        saveKeyContent(privateKey);
    }
    
    private static String generatePrivateKey(PrivateKey privateKey) {
        Base64.Encoder encoder = Base64.getEncoder();
        
        String key = encoder.encodeToString(privateKey.getEncoded());
        
        
        return String.format("%s%n%s%n%s", "-----BEGIN RSA PRIVATE KEY-----", key, "-----END RSA PRIVATE KEY-----");
    }
    
    private static void saveKeyContent(String content) {
        try {
            Path filePath = new File("d:\\tmp\\").toPath().resolve("testKey");
            Files.write(filePath, content.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

感谢任何提示!

【问题讨论】:

  • base64 编码的 RSA 私钥数据是否有换行符? AFAIK 行长度必须正好是 64 个字符(最后一个字符除外),另请参阅此答案:crypto.stackexchange.com/a/52127/744
  • 可能是文件格式错误。格式有很多,为什么你认为你选对了?

标签: java ssh rsa private-key


【解决方案1】:

感谢所有cmets。

@Robert:实际上将行长更正为 64 个字符解决了这个问题。我还发现问题与 ssh-keygen 的版本有关。例如。在 Linux Mint 19.x 上,即使私钥行长度 > 64 个字符,也会显示公钥。如果你使用例如Redhat 6 a private key line length > 64 characters 不起作用。

【讨论】: