2016-04-03 15 views
0

Hier ist der Code, um den öffentlichen Schlüssel zu bekommen. Ich muss den öffentlichen Schlüssel in das OpenSSH-Format konvertieren, um ihn der authorized_keys Datei in Linux hinzuzufügen. Wie kann ich das machen?Wie konvertiere ich den PublicKey zu OpenSSH authorized_keys Format

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

habe ich PEMWriter verwenden. Aber es gab die Ausgabezeichenfolge nicht im richtigen Format.

Antwort

1

@gotoalberto's answer für eine andere Frage:

Wenn Sie den Prozess wollen umkehren, das heißt kodieren für ein PublicKey Java-Objekt auf einem Linux-authorized_keys Eingabeformat kann man diesen Code verwenden:

/** 
* 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()); 
    } 
} 

Der @ gotoalberto-Code ist nur für RSA- und DSA-Schlüssel implementiert. Wenn Sie andere Schlüssel benötigen, müssen Sie sie selbst hinzufügen.