Ich versuche, meinen eigenen HTTPS-Server zu erstellen, und ich habe zwei Code-Snippets erstellen:kann nicht SSL-Kontext von einem externen Zertifikat
Die ersten:
private SSLContext createSSLContext() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, UnrecoverableKeyException, KeyManagementException, NoSuchProviderException {
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(new FileInputStream("c:\\tmp\\clientkeystore.jks"), "123456".toCharArray());
// Create key manager
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
keyManagerFactory.init(keyStore, "123456".toCharArray());
KeyManager[] km = keyManagerFactory.getKeyManagers();
// Create trust manager
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
trustManagerFactory.init(keyStore);
TrustManager[] tm = trustManagerFactory.getTrustManagers();
// Initialize SSLContext
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(km, tm, null);
return sslContext;
}
Die zweite:
private SSLContext createSSLContext2() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, UnrecoverableKeyException, KeyManagementException, NoSuchProviderException {
String path = "c:/tmp/example.crt2";
byte[] certbytes = Files.readAllBytes(Paths.get(path));
ByteArrayInputStream derInputStream = new ByteArrayInputStream(certbytes);
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
X509Certificate cert = (X509Certificate) certificateFactory.generateCertificate(derInputStream);
String alias = cert.getSubjectX500Principal().getName();
KeyStore trustStore = KeyStore.getInstance("JKS");
trustStore.load(null, "".toCharArray());
trustStore.setCertificateEntry(alias, cert);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(trustStore, null);
KeyManager[] keyManagers = kmf.getKeyManagers();
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(trustStore);
TrustManager[] trustManagers = tmf.getTrustManagers();
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(keyManagers, trustManagers, null);
return sslContext;
}
Alles funktioniert gut mit dem ersten Snippet, jedoch würde ich gerne mehr bekommen - ich habe selbstsigniertes SSL-Zertifikat für meine lokale Domain erstellt und in der externen Datei gespeichert. Wenn ich versuche, das Zertifikat zu verwenden (example.crt2), hatte ich die folgende Ausnahme:
javax.net.ssl.SSLHandshakeException: no cipher suites in common at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1949) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:292)
und die volle Leistung von curl ist:
$ curl -k -vvv https://example.org:443 * Rebuilt URL to: https://example.org:443/ * timeout on name lookup is not supported * Trying 127.0.0.1... * Connected to example.org (127.0.0.1) port 443 (#0) * ALPN, offering http/1.1 * Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH * successfully set certificate verify locations: * CAfile: C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt CApath: none * TLSv1.2 (OUT), TLS header, Certificate Status (22): * TLSv1.2 (OUT), TLS handshake, Client hello (1): * TLSv1.2 (IN), TLS header, Unknown (21): * TLSv1.2 (IN), TLS alert, Server hello (2): * error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure * Closing connection 0 curl: (35) error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
Das Zertifikat in clientkeystore.jks wurde erzeugt durch die folgende Befehlszeile:
keytool -genkey ...
das Zertifikat für den zweiten Schnipsel wurde über Openssl generiert:
Was mache ich falsch? Bitte, hilf!
*** 'no shared cipher' *** könnte auf ein Problem mit einem EC-Schlüssel und die Verwendung von Domänenparametern anstelle einer benannten Kurve hinweisen. Siehe auch [Elliptische Kurven-Kryptographie | Benannte Kurven] (http://wiki.openssl.org/index.php/Elliptic_Curve_Cryptography#Named_Curves) im OpenSSL-Wiki. Sie müssen das Zertifikat angeben, das Probleme verursacht, um sicher zu wissen, ob dies das Problem ist. – jww