2014-11-03 20 views
9

Hi Tôi muốn trích xuất khóa công khai từ KeyStore sử dụng mã Javađọc khóa công khai từ tập tin trong keystore

tôi đang tạo ra một keystore

keytool -genkey -alias mykeystore -keyalg RSA -keystore mykeystore.jks -keysize 2048 

Và xuất khẩu công chúng vào một tập tin

keytool -export -alias mykeystore -keystore mykeystore.jks -rfc -file publickey.cert 

Làm cách nào để nhận chuỗi khóa công khai từ kho khóa hoặc tệp publickey.cert bằng mã Java?

Cảm ơn.

CẬP NHẬT

public static void main(String[] args) { 

    try { 

     FileInputStream is = new FileInputStream("/home/myuser/my-keystore/mykeystore.jks"); 
     KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     String password = "myuserpass"; 
     char[] passwd = password.toCharArray(); 
     keystore.load(is, passwd); 
     String alias = "mykeystore"; 
     Key key = keystore.getKey(alias, passwd); 
     if (key instanceof PrivateKey) { 
      // Get certificate of public key 
      Certificate cert = keystore.getCertificate(alias); 
      // Get public key 
      PublicKey publicKey = cert.getPublicKey(); 

      String publicKeyString = Base64.encodeBase64String(publicKey 
        .getEncoded()); 
      System.out.println(publicKeyString); 

     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Sau đó, nó được đưa ra như

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiG2FjSuXrraYuh0TyRNiUvVCyaFlb7VY9AFIMSDdcY0JgNF0c4YVQxYxUCbYzmkLZD/rrYMe/8nxkWV0TMz2Y7GnvichjtWHL1ui58uC0+RtFMkYJ+ftwt9qBy9hvb/rVFTsvT5/b6CQXD8a6bFveMUluQZISLCV7i11XYzp81+w6M7+2fJAwezIJnIrgwv1K9YDjWaToaNXe7hnzzy0s8AdkjTk197+hg8dRfbvkr8XAddNsEMPeUA5iY+5VEpRNI925ZT/dxnaABA0z6i4JbVjeLl8r7ySG9R/2w/j2G+/YSRQc9BmRHPa0tBgH7wvQM+WRwD9WmST+5qeBIfH3QIDAQAB 

Khi tôi làm cat publickey.cert, nó cho thấy này

-----BEGIN CERTIFICATE----- 
MIIDgTCCAmmgAwIBAgIEf7XoMDANBgkqhkiG9w0BAQsFADBxMQswCQYDVQQGEwJJTjESMBAGA1UE 
CBMJS2FybmF0YWthMRIwEAYDVQQHEwlCYW5nYWxvcmUxEjAQBgNVBAoTCU5ldHNjaXR1czESMBAG 
A1UECxMJTmV0c2NpdHVzMRIwEAYDVQQDEwlOZXRzY2l0dXMwHhcNMTQxMTAzMDkyNTM3WhcNMTUw 
MjAxMDkyNTM3WjBxMQswCQYDVQQGEwJJTjESMBAGA1UECBMJS2FybmF0YWthMRIwEAYDVQQHEwlC 
YW5nYWxvcmUxEjAQBgNVBAoTCU5ldHNjaXR1czESMBAGA1UECxMJTmV0c2NpdHVzMRIwEAYDVQQD 
EwlOZXRzY2l0dXMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCIbYWNK5eutpi6HRPJ 
E2JS9ULJoWVvtVj0AUgxIN1xjQmA0XRzhhVDFjFQJtjOaQtkP+utgx7/yfGRZXRMzPZjsae+JyGO 
1YcvW6Lny4LT5G0UyRgn5+3C32oHL2G9v+tUVOy9Pn9voJBcPxrpsW94xSW5BkhIsJXuLXVdjOnz 
X7Dozv7Z8kDB7MgmciuDC/Ur1gONZpOho1d7uGfPPLSzwB2SNOTX3v6GDx1F9u+SvxcB102wQw95 
QDmJj7lUSlE0j3bllP93GdoAEDTPqLgltWN4uXyvvJIb1H/bD+PYb79hJFBz0GZEc9rS0GAfvC9A 
z5ZHAP1aZJP7mp4Eh8fdAgMBAAGjITAfMB0GA1UdDgQWBBSvgDYtI/NGP8Y0EvsCHASjmr/PmzAN 
BgkqhkiG9w0BAQsFAAOCAQEACefje/dhmzEkBoA6OV934WtGXcBQNcb+9/qBGevUBG1cNJIyJddi 
dea2gFUB1rx/WffTrJyiOCApV8wXG+zmGm6YJenKnGG9sIQtOTibhs3ll7UN4S0n9xsD+1y7YD1c 
DNm9lI/3aFn1WUwPc3T4+RXE6XqkDB3geIvLUXaFUi+Y59XiLPHvk61kcopCGeoweX5yWVZ2Njp/ 
UUJIxQ6Ni3GvfPlxCxWtRe1MDAkhfT6/aAUr37lxtupHibzm9EAJdUEmAFHMhxkNCJiRDsasAiQ8 
7V5uBI3ucdSwh+gPaW8KoWlJpv5SGlAkwzq0lSrxyq2ukkC6ciPeKhUvWtHaPg== 
-----END CERTIFICATE----- 

Họ phím khác nhau, ngay cả trong chiều dài. Tại sao?

Trả lời

10

Bạn có thể tìm thấy giải pháp bằng cách chỉ cần googleling cho câu hỏi của bạn.

Ví dụ từ java2s.com:

import java.io.FileInputStream; 
import java.security.Key; 
import java.security.KeyPair; 
import java.security.KeyStore; 
import java.security.PrivateKey; 
import java.security.PublicKey; 
import java.security.cert.Certificate; 

public class Main { 
    public static void main(String[] argv) throws Exception { 
    FileInputStream is = new FileInputStream("your.keystore"); 

    KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
    keystore.load(is, "my-keystore-password".toCharArray()); 

    String alias = "myalias"; 

    Key key = keystore.getKey(alias, "password".toCharArray()); 
    if (key instanceof PrivateKey) { 
     // Get certificate of public key 
     Certificate cert = keystore.getCertificate(alias); 

     // Get public key 
     PublicKey publicKey = cert.getPublicKey(); 

     // Return a key pair 
     new KeyPair(publicKey, (PrivateKey) key); 
    } 
    } 
} 

Xem thêm:

UPDATE:

Xem nhận xét để biết thêm thông tin về sự cố.

+0

Hi Hãy xem ** cập nhật ** trong câu hỏi – iCode

+1

@iProgrammer Hi, để trả lời câu hỏi ở phần cuối của câu hỏi của bạn: Sự khác biệt là, publickey.cert là toàn bộ chứng chỉ và không chỉ chính khóa đó. Nó cũng chứa rất nhiều thông tin bổ sung. Xem http://en.wikipedia.org/wiki/Public_key_certificate#Contents_of_a_typical_digital_certificate –

+0

Tôi hiểu điều đó. Nhưng xem khóa công khai tôi nhận được từ mã java và khóa công khai trong tệp public.cert. Chỉ cần kiểm tra vài ký tự đầu tiên, bạn có thể hiểu cả hai đều khác nhau. – iCode

0

Một khi bạn đã xuất khẩu thành công, bạn có thể lấy nó từ các cửa hàng trọng điểm,

qua KeyPair(publicKey, (PrivateKey) key)

Một ví dụ,

FileInputStream is = new FileInputStream("publickey.cert"); 
    KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
    keystore.load(is, "my-keystore-password".toCharArray()); 
    String alias = "myalias"; 
    Key key = keystore.getKey(alias, "password".toCharArray()); 
    if (key instanceof PrivateKey) { 
     // Get certificate of public key 
     Certificate cert = keystore.getCertificate(alias); 
     // Get public key 
     PublicKey publicKey = cert.getPublicKey(); 

     // Return a key pair 
     new KeyPair(publicKey, (PrivateKey) key); 
    } 
    } 

sẽ trả lại mới quan trọng, giá trị cặp.

Cũng đọc thread tương tự ở đây Get Private Key from Keystore

+0

Xin vui lòng xem ** cập nhật ** trong câu hỏi – iCode

+0

xin lỗi tôi không thể phần thứ hai trong bản cập nhật của bạn, bạn có thể rõ ràng hơn –

+0

Vui lòng xem Khóa công khai tôi nhận được từ mã Java và khóa công khai trong tệp public.cert. Chỉ cần kiểm tra vài ký tự đầu tiên, bạn có thể hiểu cả hai đều khác nhau. – iCode

3

Nếu nó chỉ là chuỗi khóa công khai mà bạn muốn, thật dễ dàng để tải tệp publickey.cert, vì nó là một tập tin văn bản đơn giản. Giả sử rằng bạn có đường dẫn đầy đủ của tập tin (như "/home/users/iprogrammer/publickey.cert" hoặc "D: \ MyDocuments \ publickey.cert"), bạn làm như sau:

public String getPublicKeyString(Path path) throws IOException { 
    byte[] fileBytes = Files.readAllBytes(Paths.get(path)); 
    return new String(fileBytes, "US-ASCII"); 
} 

chí này cung cấp cho bạn toàn bộ tệp, bao gồm -----BEGIN CERTIFICATE----------END CERTIFICATE-----.

Một khi bạn có toàn bộ tập tin, bạn có thể sử dụng thư viện BouncyCastle để mở nó:

PEMParser pemParser = new PEMParser(new StringReader(certPEMData)); 
    Object parsedObj = pemParser.readObject(); 
    System.out.println("PemParser returned: " + parsedObj); 
    if (parsedObj instanceof X509CertificateHolder) 
    { 
     X509CertificateHolder x509CertificateHolder = (X509CertificateHolder) parsedObj; 
     return x509CertificateHolder.getSubjectPublicKeyInfo().getPublicKeyData().getString(); 
    } 
    else 
    { 
     throw new RuntimeException("The parsed object was not an X509CertificateHolder."); 
    } 
+0

Sau đó, tôi có thể đọc toàn bộ tập tin. Có các chức năng bảo mật Java để đọc khóa công khai từ kho khóa – iCode

+0

Bạn đã yêu cầu chuỗi khóa công khai. Tất nhiên có nhiều cách để đọc từ kho khóa. Nhưng vì bạn đã xuất nó, tôi đã cho bạn cách đọc nó. – RealSkeptic

+0

Trên thực tế, nếu anh ta có thể đọc Chứng chỉ như một Chuỗi như vậy, thì anh ta có thể sử dụng lớp 'PEMParser' từ Bouncycastle. – EpicPandaForce

0

Nếu bạn muốn các chuỗi phiên bản của PublicKey:

String publicKeyString value = "-----BEGIN PUBLIC KEY-----\n" + new String(Base64.encode(publicKey.getEncoded())) + "\n-----END PUBLIC KEY-----";

0

Đầu tiên cơ sở 64 chỉ chứa khóa

Base64.encodeBase64String(publicKey.getEncoded()) 

Các cơ sở thứ hai 64 chứa toàn bộ giấy chứng nhận công

Base64.encodeBase64String(cert.getEncoded()) 
0

Hãy thử điều này:

import java.security.KeyStore; 
import java.security.KeyStoreException; 
import java.security.NoSuchAlgorithmException; 
import java.security.cert.Certificate; 
import java.security.cert.CertificateException; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.util.Enumeration; 
import java.security.PublicKey; 
import java.util.Base64; 

//===================== 

try { 
    File file = new File("C:\\Program Files (x86)\\keyStoreFilehere.kstr"); 
    FileInputStream is = new FileInputStream(file); 
    KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
    String password = "password"; 
    keystore.load(is, password.toCharArray()); 
    Enumeration enumeration = keystore.aliases(); 
    while(enumeration.hasMoreElements()) { 
     String alias = (String)enumeration.nextElement(); 
     Certificate certificate = keystore.getCertificate(alias); 
     PublicKey publicKey = keystore.getCertificate(alias).getPublicKey(); 
     byte[] encodedCertKey = certificate.getEncoded(); 
     byte[] encodedPublicKey = publicKey.getEncoded(); 
     String b64PublicKey = Base64.getMimeEncoder().encodeToString(encodedPublicKey); 
     String b64CertKey = Base64.getMimeEncoder().encodeToString(encodedCertKey); 
     String publicKeyString = "-----BEGIN CERTIFICATE-----\n" 
          + b64PublicKey 
          + "\n-----END CERTIFICATE-----"; 

     String certKeyString = "-----BEGIN CERTIFICATE-----\n" 
          + b64CertKey 
          + "\n-----END CERTIFICATE-----"; 
     System.out.println(publicKeyString); 
     System.out.println(certKeyString); 
    } 

} catch (CertificateException | NoSuchAlgorithmException | KeyStoreException | IOException e) { 
      e.printStackTrace(); 
} 
+0

Trong khi mã này có thể trả lời câu hỏi, sẽ tốt hơn nếu đưa vào một số ngữ cảnh, giải thích cách hoạt động và thời điểm sử dụng nó. Câu trả lời chỉ có mã không hữu ích trong thời gian dài. – glennsl

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