2013-07-07 4 views
5

Я пытаюсь загрузить публичный ключ SSH RSA (id_rsa.pub) из файла:Как загрузить открытый ключ ssh из файла в java?

X509EncodedKeySpec spec = new X509EncodedKeySpec(readBytes(keyFile)); 
return (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(spec); 

, но я получаю

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: неверный формат ключа

Как загрузить этот файл в RSAPublicKey?

+0

Код, который у вас есть, верный, если файл находится в правильном формате. Как вы создали файл? – maybeWeCouldStealAVan

+0

@maybeWeCouldStealAVan «если файл находится в правильном формате» <- что это за «правильный формат»? – fge

+0

@meybeWeCouldStealAVan, я сгенерировал пару ключей с "ssh-keygen -t rsa -C" myEmail "-I X.509" –

ответ

6

Данные, закодированные x509, должны быть в формате DER. Вы можете производить такие ключи с помощью OpenSSL: (Примечание, кредит http://codeartisan.blogspot.com/2009/05/public-key-cryptography-in-java.html для освежения OpenSSL.)

Для генерации ключа используется:

$ openssl genrsa -out private_key.pem 2048 

Или, с кодовой фразой:

$ openssl genrsa -aes256 -out private_key.pem 2048 

Или, используя SSH-кейген (следуя вашему примеру):

$ ssh-keygen -t rsa -C "myEmail" -I X.509 

Я предполагаю, что вы сохранили ключ как «private_key.pem» Сформировать открытый ключ в формате DER:

$ openssl rsa -in private_key.pem -pubout -outform DER -out tst_public.der 

Массив байт, содержащий содержимое файла теперь будет принят на X509EncodedKeySpec.

Если вы хотите загрузить секретный ключ, используйте OpenSSL для сохранения незашифрованной копии секретного ключа (не сделать это в незащищенной среде):

$ openssl pkcs8 -topk8 -inform PEM -outform DER -in private_key.pem -out private_key.der -nocrypt 


You can then pass this file as a byte array to `PKCS8EncodedKeySpec`. 

Вы также можете создать свой пары ключей в Java:

private static int rsabits = 2048; // or higher, if you've got the cpu*time 
public static SecureRandom sr = new SecureRandom(); // reseed periodically 

public static KeyPair newKeyPair() throws NoSuchAlgorithmException { 
    KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA"); 
    generator.initialize(rsabits, sr); 
    return generator.generateKeyPair(); 
} 

Затем вы можете использовать KeyPair.getPublic() и KeyPair.getPrivate() для доступа ключей. Вы можете сохранить или загрузить их в виде байтовых массивов с чем-то вроде:

public static byte[] pubKeyToBytes(PublicKey key){ 
    return key.getEncoded(); // X509 for a public key 
} 
public static byte[] privKeyToBytes(PrivateKey key){ 
    return key.getEncoded(); // PKCS8 for a private key 
} 
public static PublicKey bytesToPubKey(byte[] bytes) throws InvalidKeySpecException, NoSuchAlgorithmException{ 
    return KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(bytes)); 
} 
public static PrivateKey bytesToPrivKey(byte[] bytes) throws InvalidKeySpecException, NoSuchAlgorithmException{ 
    return KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(bytes)); 
} 
Смежные вопросы