2017-01-27 5 views
1

Ich habe einen Java-JAX-WS-Web-Service-Client codiert. Wenn ich versuche, einen Server zu treffen ein öffentlicher CA signiertes Zertifikat verwenden, erhalte ich Ausnahme einer SSL-Handshake:Java-Root-CA-Zertifikat vorhanden - SSL-Handshake-Ausnahme erhalten

com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: 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

ich weiter untersucht habe und habe auf der JVM-Netzwerk einge Tracing und entdecken, dass der Emittent des Servers öffentliches CA signiertes Zertifikat ist:

Issuer: CN=Symantec Class 3 Secure Server SHA256 SSL CA, OU=Symantec Trust Network, O=Symantec Corporation, C=US

ich, dass das root-CA-Zertifikat für diese Emittenten überprüft habe, ist:

CN=VeriSign Universal Root Certification Authority, OU="(c) 2008 VeriSign, Inc. - For authorized use only", OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US

Und ich habe auch über lügt verifiziert Trace, dass dieses Zertifikat tatsächlich geladen ist. Hier

ist ein Teil der SSL-Logging-Trace:

keyStore is : 
keyStore type is : jks 
keyStore provider is : 

init keystore 
init keymanager of type SunX509 
trustStore is: C:\Program Files\Java\jdk1.7.0_79\jre\lib\security\cacerts 
trustStore type is : jks 
trustStore provider is : 
init truststore 

[ omitted] 

     adding as trusted cert: 
     Subject: CN=VeriSign Universal Root Certification Authority, OU="(c) 2008 VeriSign 
, Inc. - For authorized use only", OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US 
     Issuer: CN=VeriSign Universal Root Certification Authority, OU="(c) 2008 VeriSign 
, Inc. - For authorized use only", OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US 
     Algorithm: RSA; Serial number: 0x401ac46421b30ebbe4121ac51d 
     Valid from Tue Apr 01 17:00:00 PDT 2008 until Tue Dec 01 15:59:59 PST 2037 
[ omitted] 

trigger seeding of SecureRandom 
done seeding SecureRandom 
Ignoring unavailable cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 
Ignoring unavailable cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA 
Ignoring unavailable cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA 
Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 
Ignoring unsupported cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 
Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 
Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 
Ignoring unsupported cipher suite: TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 
Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 
Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 
Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA256 
Ignoring unavailable cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 
Ignoring unsupported cipher suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 
Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 
Ignoring unavailable cipher suite: TLS_DHE_DSS_WITH_AES_256_CBC_SHA 
Ignoring unsupported cipher suite: TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 
Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 
Ignoring unsupported cipher suite: TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 
Ignoring unavailable cipher suite: TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA 
Ignoring unavailable cipher suite: TLS_RSA_WITH_AES_256_CBC_SHA 
Ignoring unsupported cipher suite: TLS_RSA_WITH_AES_128_CBC_SHA256 
Allow unsafe renegotiation: false 
Allow legacy hello messages: true 
Is initial handshake: true 
Is secure renegotiation: false 
main, setSoTimeout(0) called 
%% No cached client session 
*** ClientHello, TLSv1 
RandomCookie: GMT: 1468680588 bytes = 
Session ID: {} 
Cipher Suites: [ ... ] 
Compression Methods: { 0 } 
Extension elliptic_curves, curve names: 
Extension ec_point_formats, formats: [uncompressed] 
Extension server_name, server_name: [host_name: redacted] 
*** 
[write] MD5 and SHA1 hashes: len = 181 

[omitted] 

*** ServerHello, TLSv1 
RandomCookie: GMT: 1524806833 
Session ID: 
Cipher Suite: TLS_DHE_RSA_WITH_AES_128_CBC_SHA 
Compression Method: 0 
Extension renegotiation_info, renegotiated_connection: <empty> 
Extension server_name, server_name: 
*** 
%% Initialized: [Session-1, TLS_DHE_RSA_WITH_AES_128_CBC_SHA] 
** TLS_DHE_RSA_WITH_AES_128_CBC_SHA 
[read] MD5 and SHA1 hashes: len = 85 

[omitted] 

*** Certificate chain 
chain [0] = [ 
[ 
    Version: V3 
    Subject: CN=redacted, OU=redacted, O=redacted, L=redacted, ST=redacted, C=US 
    Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11 

    Key: Sun RSA public key, 2048 bits 
    modulus: 
    public exponent: 65537 
    Validity: [From: Sun Oct 16 17:00:00 PDT 2016, 
       To: Thu Nov 02 16:59:59 PDT 2017] 
    Issuer: CN=Symantec Class 3 Secure Server SHA256 SSL CA, 
      OU=Symantec Trust Network, O=Symantec Corporation, C=US 
    SerialNumber: [ ... ] 

Certificate Extensions: 9 
[1]: ObjectId: 1.3.6.1.4.1.11129.2.4.2 Criticality=false 
Extension unknown: DER encoded OCTET string = 

[omitted] 

*** 
%% Invalidated: [Session-1, TLS_DHE_RSA_WITH_AES_128_CBC_SHA] 
main, SEND TLSv1 ALERT: fatal, description = certificate_unknown 
main, WRITE: TLSv1 Alert, length = 2 
[Raw write]: length = 7 
0000: 15 03 01 00 02 02 2E        ....... 
main, called closeSocket() 
main, handling exception: javax.net.ssl.SSLHandshakeException: 

Hat jemand irgendwelche Vorschläge, was könnte dieses Problem verursachen?

Antwort

1

unable to find valid certification path to requested target bedeutet, dass der Client die Server-Zertifikat zu vertrauen aufgrund

  1. unvollständige Kette aus Blatt Zertifikat Wurzel- oder
  2. Stammzertifikat nicht vorhanden ist im Truststore

ich überprüft haben, dass Symantec Class 3 Secure Server SHA256 SSL CA von VeriSign Universal Root Certification Authority ausgegeben wird (siehe Symantec page)

Symantec & Verisign

Und Verisign Wurzel wird effektiv in jdk1.7.0_79 enthalten, so dass ich verwerfen 2). Daher ist meine Vermutung eine unvollständige Kette auf Serverseite.

Aktionen

  1. überprüfen Server in https://www.ssllabs.com für 'unvollständigen Kette Fehler' suchen.

  2. Stellen Sie sicher, dass die Zwischen CA wirklich Symantec Class 3 Secure Server SHA256 SSL CA mit der Seriennummer ist 69 87 94 19 d9 e3 62 70 74 9d bb e5 9d c6 68 5e

  3. auf Fehler in Schritt 1 herunterladen Symantec cert (von oben Link) und importieren Sie in Ihren Trusts

  4. Wenn das Zwischenzertifikat nicht die erwartete von Symantec, dann die CA-Stamm erhalten und importieren sie es in Ihr TruStore

EDITED SSL Vertrauen Überprüfung

Zertifikate werden in einer Hierarchie ausgegeben. Jedes Zertifikat wird vom Aussteller der oberen Ebene von der Stammzertifizierungsstelle bis zu den Blattzertifikaten signiert. Die digitale Signatur ermöglicht die Überprüfung der Zertifizierungskette.

Der SSL-Server muss das Zertifikat bereitstellen und die Kette (nicht einschließlich der Wurzel). Der Trust-Manager überprüft die Zertifizierungskette von Blatt zu Wurzel. Wenn jemand der Zertifikate in den Trusts gefunden wird, dann ist das Zertifikat „trusted“ (auch wenn es abgelaufen ist ...)

Sie sollen das Stamm-CA in den Trusts enthalten, nicht das Blatt

+0

mich So lassen verstehe das ein bisschen besser. Wenn in Ihrem Truststore Zertifikate in der Kette fehlen, kann das Zertifikat des Servers nicht überprüft werden, da der Pfad nicht gefunden werden kann. Ich würde annehmen, da es sich um eine Kette handelt und weil die Zertifikats-ROOT-Berechtigung vorhanden ist, würde das Blatt ODER das Zwischenzertifikat irgendeine Art von Verweis auf das Stamm-CA-Zertifikat haben. Wozu sonst ein ROOT-Zertifikat? Sollte das Root-CA-Zertifikat nicht die ultimative Verifizierung sein? Wenn nicht, warum enthalten Intermediate Certs und Leaf Certs nicht die Kettenreferenzen in sich selbst? – Matt1776

+0

Ich würde die Prämie auf Sie vergeben, weil Sie eine vollständigere Antwort zur Verfügung gestellt - aber Magnus hat auch mein Problem beantworten und zu lösen und bekamen zunächst darauf. Auch er hat weniger Rep. Danke, dass Sie sich die Zeit dafür genommen haben, Sie haben mir einige andere Tools und Möglichkeiten der Verifizierung gezeigt. Ich weis das zu schätzen. – Matt1776

+1

ich in der Antwort eine Erklärung über enthalten sind, wie Vertrauen Überprüfung funktioniert – pedrofb

2

Das Vertrauen Baum sieht aus wie

root-> VeriSign Universal Root Certification Authority 
chain-> Symantec Class 3 Secure Server SHA256 SSL CA 
leaf-> somewebsite 

Sie mehrere Ketten oder keine Ketten haben können. Browser neigen dazu, die Stammzertifikate sowie die beliebten Kettenzertifikate in ihren Trust Stores zu integrieren.

Aber es scheint, dass der Java Trust Store dieses bestimmte Kettenzertifikat fehlt.
Wenn Sie also versuchen, eine Verbindung zu ihm herzustellen, kann Java nicht wissen, dass das Blattzertifikat letztlich vom Stammzertifikat als vertrauenswürdig eingestuft wird, weil es keinen Pfad findet.
Es gibt zwei Möglichkeiten, dies zu umgehen. Im Idealfall würde der Server-Operator den Server so konfigurieren, dass er die Zertifikatskette darstellt. Wenn dies nicht möglich ist, können Sie das Kettenzertifikat einfach manuell in den Javas Trust Store importieren.

Download the cert
importieren

keytool -import -file Example.cer -keystore examplekeystore 
Verwandte Themen