2013-07-07 37 views
5

Tôi cố gắng để tải chìa khóa rsa ssh công cộng (id_rsa.pub) từ một tập tin:Cách tải khóa ssh công khai từ một tệp trong java?

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

nhưng tôi nhận

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: định dạng khóa không hợp lệ

Cách tải tệp này vào RSAPublicKey?

+0

Mã bạn có là chính xác, giả định tệp có định dạng đúng. Bạn đã tạo tệp như thế nào? – maybeWeCouldStealAVan

+0

@maybeWeCouldStealAVan "giả định tệp có định dạng chính xác" <- định dạng chính xác "là gì? – fge

+0

@meybeWeCouldStealAVan, tôi tạo cặp khóa với "ssh-keygen -t rsa -C" myEmail "-I X.509" –

Trả lời

6

Dữ liệu được mã hóa x509 phải ở định dạng DER. Bạn có thể tạo ra các phím như sử dụng OpenSSL: (Lưu ý, tín dụng để http://codeartisan.blogspot.com/2009/05/public-key-cryptography-in-java.html cho bồi dưỡng OpenSSL.)

Để tạo một khóa, sử dụng:

$ openssl genrsa -out private_key.pem 2048 

Hoặc, với một cụm từ mật khẩu:

$ openssl genrsa -aes256 -out private_key.pem 2048 

Hoặc, sử dụng ssh-keygen (theo gương của bạn):

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

Tôi sẽ giả sử bạn lưu chìa khóa như 'private_key.pem' Tạo một khóa công khai ở định dạng DER:

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

Một mảng byte chứa nội dung của file bây giờ sẽ được chấp nhận bởi X509EncodedKeySpec.

Nếu bạn muốn tải các khóa riêng, sử dụng OpenSSL để lưu một không được mã hóa bản sao của khóa riêng của bạn (không làm điều này trong một môi trường không an toàn):

$ 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`. 

Bạn cũng có thể tạo ra của bạn cặp khóa trong 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(); 
} 

Sau đó, bạn có thể sử dụng KeyPair.getPublic()KeyPair.getPrivate() để truy cập khóa của mình. Bạn có thể lưu hoặc tải chúng dưới dạng mảng byte với một cái gì đó như:

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)); 
} 
Các vấn đề liên quan