2016-06-04 4 views
0

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!

+0

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

Antwort

1

Im zweiten Fall gibt es keinen privaten Schlüssel, nur ein Zertifikat. Sie müssen den KeyManager mit einem TrustStore initialisieren, der einen privaten Schlüsseleintrag enthält.

Was Sie tun, ergibt keinen Sinn. Sie können nicht dieselbe Datei wie einen KeyStore und einen Truststore verwenden. Es macht keinen Sinn.

Verwandte Themen