7

Tôi có mã sau:Có thể org.bouncycastle.openssl.PEMReader đọc java.security.PrivateKey không?

PrivateKey key = null; 
X509Certificate cert = null; 
KeyPair keyPair = null; 

final Reader reader = new StringReader(pem); 
try { 
    final PEMReader pemReader = new PEMReader(reader, new PasswordFinder() { 
     @Override 
     public char[] getPassword() { 
      return password == null ? null : password.toCharArray(); 
     } 
    }); 

    Object obj; 
    while ((obj = pemReader.readObject()) != null) { 
     if (obj instanceof X509Certificate) { 
      cert = (X509Certificate) obj; 
     } else if (obj instanceof PrivateKey) { 
      key = (PrivateKey) obj; 
     } else if (obj instanceof KeyPair) { 
      keyPair = (KeyPair) obj; 
     } 
    } 
} finally { 
    reader.close(); 
} 

Nó có bao giờ đọc PrivateKey không? Nói cách khác, có thể bất kỳ tệp PEM nào chỉ chứa khóa riêng tư thuần túy không? Nếu có, bạn có thể cung cấp cho tôi một tệp PEM mẫu không?

Cảm ơn bạn đã ủng hộ.

+2

Tôi không có mẫu trong tầm tay nhưng bạn có thể đọc tại đây: http://ospkibook.sourceforge.net/docs/OSPKI-2.4.7/OSPKI-html/sample-priv-key.htm . (hoặc đây là một nỗ lực để có được các khóa riêng từ mọi người :)) – albertjan

+0

Xem thêm * [Định dạng các khóa RSA cho OpenSSL trong Java] (http://stackoverflow.com/q/3660132/3474). * – erickson

Trả lời

6

Một tệp có thể chỉ chứa khóa riêng tư và có thể mã hóa hoặc xóa văn bản rõ ràng. OpenSSL thực hiện việc này mọi lúc.

Tôi đã xem xét mã cho PEMReader, tuy nhiên, có vẻ như nó sẽ trả lại KeyPair từ khóa riêng RSA (tệp khóa riêng tư chứa tất cả thông tin cần thiết cho khóa công khai tương ứng). Có vẻ như nó sẽ không bao giờ trở lại chỉ đơn giản là một PrivateKey từ readObject().

Đây là khóa riêng tư không phải mã hóa 1024 RSA từ OpenSSL.

-----BEGIN RSA PRIVATE KEY----- 
MIICXQIBAAKBgQC/oBTZGo0cgHHdZD8LgDpUVOPjsI58PrTJPtrlVT7kyznmzFEt 
TW9cqxlw6EOo09tTTrjikLDA2M5xzejbLGPb8sa7AzVhuHkChgGh9eZmphsnvq1W 
LjuXCk5yWOR9ziaBKKFeNXOsdvDp3eMDM+wz3vzn1wrGrg00jMvKP5kcpwIDAQAB 
AoGBAI9oJ/IKEszfu1cqLJxYzE5McXf2q8uDyhxJs9upHjZveNem1KGIr+y0B4gd 
6nSwiBUidu7nxb+tAWLd7IQKBnhKC3AtGNT7qTwnXelKsJhaok2+kEEuzjQYnmsP 
AreEsAi/FlHj/kAyjGBoQ4QLrx1sp2cDcBTP78PeJfZvm/RxAkEA7zVuumjrz3ui 
zmBzQI1pwD9F0REyE5zJfgUz5iDQbK2RRPhcQ9LCZdEJRU0vdWTBmmgadYwpg0uG 
hYFwCy7PWwJBAM0Tk+pMRwke0m4oiI4mKh0u4enHXE2RFMUtTMjGILHt8+m4Q7rd 
KGfO9/ylK82LhbT0Z/BeszbnneaAefkxFaUCQQDephVSXKZgkOuQvCWKSBXOYxZQ 
6nh52M2TBrSv1ospHMTCNYlrd5iJvG+smZM66XVqistV7ggVtQ6Y5Umsnv1RAkBW 
l/K4V1cTcdFXNIRcyZ60zewUw9qk4iMME1G94XNCzoBU6zqmN+Zs1wb9xlzVoRln 
TGBrLgGsqGaTQyK9500FAkBuKohFvOgFHSKOskiVu/swByWZANEZsoEPUx7V6vXH 
Tk+qftY64tt4AazHPVyVtsj1oqOv3zbulfnotFvU1nmp 
-----END RSA PRIVATE KEY----- 

Đây là khóa công khai tương ứng:

-----BEGIN PUBLIC KEY----- 
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/oBTZGo0cgHHdZD8LgDpUVOPj 
sI58PrTJPtrlVT7kyznmzFEtTW9cqxlw6EOo09tTTrjikLDA2M5xzejbLGPb8sa7 
AzVhuHkChgGh9eZmphsnvq1WLjuXCk5yWOR9ziaBKKFeNXOsdvDp3eMDM+wz3vzn 
1wrGrg00jMvKP5kcpwIDAQAB 
-----END PUBLIC KEY----- 

Một KeyStore có nghĩa là để được sử dụng để thực khóa công khai, tư nhân, và đối xứng trong một ứng dụng Java. Hầu hết các ứng dụng Java lưu trữ khóa riêng trong mã hóa PKCS # 8 (không phải là the same as the OpenSSL format) và khóa công khai được thể hiện bằng cấu trúc SubjectPublicKeyInfo (trong đó giống như OpenSSL).

+1

Cảm ơn bạn đã trả lời . Mẫu khóa riêng tư của bạn cũng chứa khóa công khai và do đó nó là một KeyPair. Bạn có thể trích xuất khóa công khai bằng: psl -pubout -pform PEM -pubout-PEM. Tôi đã tự hỏi nếu có thể có một PEM chỉ với một khóa riêng tư thuần túy, không có thông tin về khóa công khai. –

+0

@Martin Trên thực tế, những gì mẫu của tôi chứa là một 'RSAPrivateKey', như được định nghĩa PKCS # 1. Như tôi đã nói, nó * có * chứa số mũ công khai (cùng với các giá trị Định lý Còn lại của Trung Quốc), để tạo điều kiện phục hồi khóa công khai. Bất kỳ khóa riêng nào có thể được đọc bởi 'PEMReader' (hoặc các tiện ích OpenSSL) phải ở định dạng chuẩn này, mặc dù điều này có thể được đính kèm trong trình bao bọc PKCS # 8 hoặc PEM. Một số triển khai thực hiện SSH2 là không bình thường ở chỗ chúng không sử dụng khóa PKCS # 1. PEMReader sẽ ** không bao giờ ** trả lại một 'PrivateKey'; nó sẽ tăng một ngoại lệ nếu một khóa riêng không ở định dạng PKCS # 1. – erickson

Các vấn đề liên quan