2016-04-03 101 views
0

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

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

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

回答

1

@gotoalberto's answer一个不同的问题:

如果想逆转这一过程,即PublicKey Java对象 编码到Linux authorized_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密钥。如果你需要其他键,你必须自己添加它们。

相关问题