2016-05-19 6 views
0

Ich habe Probleme ein gültiges Zertifikat zu konfigurieren (nicht selbstsignierten!) In Wildfly 9. Ich habe den HTTPS-Anschluss in Wildfly konfiguriert:Java weigert Zertifikat, das Browser akzeptiert

  <https-listener name="https" socket-binding="https" security-realm="UndertowRealm" /> 

Sicherheit Reich:

 <security-realm name="UndertowRealm"> 
      <server-identities> 
      <ssl> 
       <keystore path="domain.p12" relative-to="jboss.server.config.dir" keystore-password="password" 
       alias="appcert" /> 
      </ssl> 
      </server-identities> 
     </security-realm> 

und erzeugt die Schlüsselspeicher mit diesem Befehl:

 
openssl pkcs12 -export -in domain.crt -inkey domain.key -out domain.p12 -name appcert -CAfile cafile.crt -caname root 

Nun, wenn ich öffnen Sie die Anwendung in Der Browser funktioniert einwandfrei. Der Browser erkennt das Zertifikat als gültiges Zertifikat, ohne nach einer Ausnahme zu fragen, wie dies bei einem selbstsignierten Zertifikat der Fall wäre.

aber wenn ich versuche, auf die gleiche URL durch SSLPoke.java zu verbinden, erhalte ich die folgende Ausnahme:

 
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    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:296) 
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1509) 
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216) 
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979) 
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:914) 
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062) 
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) 
    at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:747) 
    at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123) 
    at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:138) 
    at SSLPoke.main(SSLPoke.java:26) 
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387) 
    at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) 
    at sun.security.validator.Validator.validate(Validator.java:260) 
    at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) 
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229) 
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124) 
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491) 
    ... 9 more 
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:141) 
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:126) 
    at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) 
    at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382) 
    ... 15 more 

Wenn ich das Zertifikat in dem Client importieren dieser Fehler weggeht, aber ich denke, Ich sollte das nicht tun müssen, da dies ein gültiges Zertifikat ist.

Der Testcode ist folgende:

 
import java.io.InputStream; 
import java.io.OutputStream; 

import javax.net.ssl.SSLSocket; 
import javax.net.ssl.SSLSocketFactory; 

/** Establish a SSL connection to a host and port, writes a byte and 
* prints the response. See 
* http://confluence.atlassian.com/display/JIRA/Connecting+to+SSL+services 
*/ 
public class SSLPoke { 
    public static void main(String[] args) { 

       if (args.length != 2) { 
         System.out.println("Usage: "+SSLPoke.class.getName()+" "); 
         System.exit(1); 
       } 
       try { 
         SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
         SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(args[0], Integer.parseInt(args[1])); 

         InputStream in = sslsocket.getInputStream(); 
         OutputStream out = sslsocket.getOutputStream(); 

         // Write a test byte to get a reaction :) 
         out.write(1); 

         while (in.available() > 0) { 
           System.out.print(in.read()); 
         } 
         System.out.println("Successfully connected"); 

       } catch (Exception exception) { 
         exception.printStackTrace(); 
       } 
     } 
} 

Warum ist das passiert, und was ist der richtige Weg, das SSL-Zertifikat zu installieren?

Antwort

0

Dies passiert, weil keines der Zertifikate in der Kette dem Java-Truststore vertraut.

Die allgemeinste Lösung wäre, das oben Zertifikat (die letzten in der Kette, die obersten Unterzeichner) die Einfuhr in die lib/security/cacerts Datei JRE.

1

Das Problem hier ist, dass Java standardmäßig mit einer sehr begrenzten Anzahl von Root-CA-Zertifikaten ausgeliefert wird. Es "akzeptiert" wesentlich weniger CAs als ein typischer Browser. Der einfachste Weg, das Problem zu lösen, besteht darin, eine Reihe von CA-Zertifikaten aus einem Browser wie Chrome oder Firefox zu exportieren und sie unter Verwendung von keytool in den Java-Keystore zu importieren.

Verwandte Themen