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;
}
Importieren Sie den Schlüssel in Ihren Keystore in JRE/JDK. – user1802604
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
@Rusty Worüber redest du? – EJP