2017-02-08 2 views
0

Wie würde ich eine Socket-Verbindung zwischen zwei Java SE-Anwendungen herstellen, bei denen der Schlüssel nicht von einem vertrauenswürdigen Speicher oder Zertifikat stammt, sondern in der Anwendung selbst fest codiert ist.Java TLS/SSL-Socket mit benutzerdefinierten öffentlichen privaten Schlüsseln?

z.B. Der öffentliche Schlüssel ist auf den Clients fest und der private Schlüssel auf dem Server fest. Wie würde ich es tun, während ich immer noch die Standard-TLS/SSL-Socket-API verwende?

+0

Importieren Sie den Schlüssel in Ihren Keystore in JRE/JDK. – user1802604

+0

Merken Sie sich den Hash des öffentlichen Schlüssels der anderen Seite und vergleichen Sie ihn bei jeder neuen Verbindung. Oder signieren Sie die Schlüssel mit Ihrer eigenen privaten Zertifizierungsstelle. Fügen Sie die Zertifizierungsstelle dem Trust Store hinzu. – rustyx

+0

@Rusty Worüber redest du? – EJP

Antwort

0

Sie können einen JKS(Java Key Store) aus den Zertifikat- und Schlüsseldateien generieren und in Ihre JRE importieren.

Sie können keytool zum Generieren von JKS und zum Importieren in Keystore verwenden.

den Befehl: keytool -import -alias <Your Alias> -file CertificateFile.cer -keystore <currentKeyStore>

standardmäßig Ihre currentKeyStore wären bei: JAVA_HOME-> JRE ->lib-> security-> cacerts

0

selbst signierten Zertifikat erstellen, private Schlüssel gehen zur Server-Zertifikat mit einem öffentlichen Schlüssel geht an Kunden. Danach müssen Sie SSLContext auf der Client-Seite korrekt einrichten. Dies kann grundsätzlich auf 3 Arten erreicht werden.

1 - Serverzertifikat CA (für selbstsigniertes CA == Zertifikat) in Client $JRE/lib/security/cacerts Datei hinzufügen. Das ist nicht sehr gut, denn nach JRE-Update auf dem Client können Sie diese Änderungen verlieren.

2 - Server-Zertifikat in Schlüsselspeicher setzen und Umgebungsvariablen (mit System.setProperty oder als -D Option Befehlszeile) javax.net.ssl.trustStore, javax.net.ssl.trustStorePassword und optional javax.net.ssl.trustStoreType, überprüfen Sie diese Antwort für Details https://stackoverflow.com/a/5871352/1516873

3 - Manuelle Einrichtung B.

private final SSLContext createSSLContext() 
     throws Exception { 

    CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
    FileInputStream in = new FileInputStream("path to server certificate.pem"); // server certificate in PEM format 
    KeyStore trustStore = KeyStore.getInstance("JKS"); 
    trustStore.load(null); 
    try { 
     X509Certificate cacert = (X509Certificate) cf.generateCertificate(in); 
     trustStore.setCertificateEntry("server_alias", cacert); 
    } finally { 
     IOUtils.closeQuietly(in); 
    } 

    TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); 
    tmf.init(trustStore); 

    SSLContext sslContext = SSLContext.getInstance("SSL"); // TLS e.g. 
    sslContext.init(null, tmf.getTrustManagers(), new SecureRandom()); 
    return sslContext; 
} 
Verwandte Themen