1

这是获取公钥的代码。我需要将公钥转换为 OpenSSH 格式以将其添加到authorized_keysLinux 中的文件中。我怎样才能做到这一点?

KeyPairGenerator kpGen = KeyPairGenerator.getInstance("DSA", "BC");
kpGen.initialize(1024, new SecureRandom());
KeyPair keypair = kpGen.generateKeyPair();

我确实使用了PEMWriter. 但它没有以正确的格式给出输出字符串。

4

1 回答 1

2

@gotoalberto对另一个问题的回答:

如果你想反转这个过程,PublicKey即将 Java 对象编码为 Linuxauthorized_keys条目格式,可以使用以下代码:

/**
 * Encode PublicKey (DSA or RSA encoded) to authorized_keys like string
 *
 * @param publicKey DSA or RSA encoded
 * @param user username for output authorized_keys like string
 * @return authorized_keys like string
 * @throws IOException
 */
public static String encodePublicKey(PublicKey publicKey, String user)
        throws IOException {
    String publicKeyEncoded;
    if(publicKey.getAlgorithm().equals("RSA")){
        RSAPublicKey rsaPublicKey = (RSAPublicKey) publicKey;
        ByteArrayOutputStream byteOs = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(byteOs);
        dos.writeInt("ssh-rsa".getBytes().length);
        dos.write("ssh-rsa".getBytes());
        dos.writeInt(rsaPublicKey.getPublicExponent().toByteArray().length);
        dos.write(rsaPublicKey.getPublicExponent().toByteArray());
        dos.writeInt(rsaPublicKey.getModulus().toByteArray().length);
        dos.write(rsaPublicKey.getModulus().toByteArray());
        publicKeyEncoded = new String(
                Base64.encodeBase64(byteOs.toByteArray()));
        return "ssh-rsa " + publicKeyEncoded + " " + user;
    }
    else if(publicKey.getAlgorithm().equals("DSA")){
        DSAPublicKey dsaPublicKey = (DSAPublicKey) publicKey;
        DSAParams dsaParams = dsaPublicKey.getParams();

        ByteArrayOutputStream byteOs = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(byteOs);
        dos.writeInt("ssh-dss".getBytes().length);
        dos.write("ssh-dss".getBytes());
        dos.writeInt(dsaParams.getP().toByteArray().length);
        dos.write(dsaParams.getP().toByteArray());
        dos.writeInt(dsaParams.getQ().toByteArray().length);
        dos.write(dsaParams.getQ().toByteArray());
        dos.writeInt(dsaParams.getG().toByteArray().length);
        dos.write(dsaParams.getG().toByteArray());
        dos.writeInt(dsaPublicKey.getY().toByteArray().length);
        dos.write(dsaPublicKey.getY().toByteArray());
        publicKeyEncoded = new String(
                Base64.encodeBase64(byteOs.toByteArray()));
        return "ssh-dss " + publicKeyEncoded + " " + user;
    }
    else{
        throw new IllegalArgumentException(
                "Unknown public key encoding: " + publicKey.getAlgorithm());
    }
}

@gotoalberto 的代码仅适用于 RSA 和 DSA 密钥。如果您需要其他密钥,您必须自己添加它们。

于 2016-04-03T08:12:24.047 回答