2014-11-03 11 views
9

Hallo ich einen öffentlichen Schlüssel aus Schlüsselspeicher mit Hilfe von Java-CodeLesen Sie den öffentlichen Schlüssel aus der Datei in Schlüsselspeicher

Ich schaffe einen Schlüsselspeicher

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

und Export von der Öffentlichkeit in eine andere Datei

keytool -export -alias mykeystore -keystore mykeystore.jks -rfc -file publickey.cert 
extrahieren möchten

Wie kann ich die öffentliche Schlüsselzeichenfolge aus Keystore oder der Datei publickey.cert mit dem Java-Code abrufen?

Danke.

UPDATE

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

Dann wird es geben, wie

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

Wenn ich cat publickey.cert tun, es zeigt diese

-----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----- 

Sie Schlüssel verschieden sind, auch in der Länge. Warum?

Antwort

10

Sie können eine Lösung finden, indem Sie nur für Ihre Frage googeln.

Beispiel von 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); 
    } 
    } 
} 

Siehe auch:

UPDATE:

Siehe Kommentare für zusätzliche Informationen zu dem Problem.

+0

Hallo Bitte beachten Sie die ** Update ** in der Frage – iCode

+1

@iProgrammer Hallo, die Frage am Ende zu beantworten Ihre Frage: Der Unterschied ist, dass das publickey.cert ein ganzes Zertifikat und nicht nur der Schlüssel selbst ist. Es enthält auch viele zusätzliche Informationen. Siehe http://en.wikipedia.org/wiki/Public_key_certificate#Contents_of_a_typical_digital_certificate –

+0

Ich habe das verstanden. Aber sehen Sie sich den öffentlichen Schlüssel an, den ich aus dem Java-Code und dem öffentlichen Schlüssel in der Datei public.cert erhalten habe. Überprüfen Sie zuerst die ersten Zeichen, Sie können verstehen, dass beide unterschiedlich sind. – iCode

0

Sobald Sie erfolgreich exportiert haben, können Sie es aus dem Schlüsselspeicher erhalten,

durch KeyPair(publicKey, (PrivateKey) key)

Ein Beispiel,

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); 
    } 
    } 

wird das neue Schlüssel, Wert Paar zurück.

Lesen Sie auch die ähnlichen Thread hier Get Private Key from Keystore

+0

Bitte beachten Sie das ** Update ** in Frage – iCode

+0

Sorry, ich kann den zweiten Teil in Ihrem Update können Sie klarer –

+0

Bitte sehen Sie den öffentlichen Schlüssel, den ich von Java-Code und den öffentlichen Schlüssel in der Datei public.cert erhalten. Überprüfen Sie zuerst die ersten Zeichen, Sie können verstehen, dass beide unterschiedlich sind. – iCode

3

Wenn es, dass Sie nur die öffentlichen Schlüssel-String ist wollen, ist es einfacher, die publickey.cert Datei zu bekommen, da es sich um eine einfache Textdatei ist. Unter der Annahme, dass Sie den vollständigen Pfad der Datei haben (wie „/home/users/iprogrammer/publickey.cert“ oder „D: \ Eigene Dateien \ publickey.cert“), die Sie tun so etwas wie:

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

Dieser Wille geben Sie die ganze Datei, einschließlich der -----BEGIN CERTIFICATE----- und -----END CERTIFICATE-----.

Sobald Sie die gesamte Datei haben, können Sie die BouncyCastle Bibliothek verwenden, es zu öffnen:

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

Dann kann ich die ganze Datei lesen. Es gibt Java-Sicherheitsfunktionen zum Lesen des öffentlichen Schlüssels aus Keystore – iCode

+0

Sie haben nach der öffentlichen Schlüsselzeichenfolge gefragt. Natürlich gibt es Möglichkeiten, aus dem Schlüsselspeicher zu lesen. Aber da du es bereits exportiert hast, habe ich dir den Weg gegeben, es zu lesen. – RealSkeptic

+0

Wenn er das Zertifikat als String lesen kann, könnte er die Klasse "PEMParser" von Bouncycastle verwenden. – EpicPandaForce

0

Wenn Sie die String-Version des PublicKey möchte:

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

0

der ersten Basis 64 enthält nur den Schlüssel

Base64.encodeBase64String(publicKey.getEncoded()) 

Die zweite Basis 64 enthält die gesamte öffentliche Zertifikat

Base64.encodeBase64String(cert.getEncoded()) 
0

Try this:

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

Während dieser Code die Frage beantworten könnte, wäre es besser, einen Kontext einzubeziehen, zu erklären, wie es funktioniert und wann es zu verwenden ist. Nur-Code-Antworten sind auf lange Sicht nicht nützlich. – glennsl

Verwandte Themen