web-dev-qa-db-ja.com

PKIXパスの構築に失敗しましたが、証明書はcacertsにあります

私はまた説明されている問題を抱えています ここ 。証明書を作成してTomcatのキーストアに追加し、それをcacertsトラストストアにコピーしました。しかし、どういうわけか私はまだこのエラーが発生します。

私がしたこと:

1)keytool -genkey -alias cas -keyalg RSA -keystore cas.keystore -storepass changeit

2)keytool -exportcert -alias cas -file cas.crt -keystore cas.keystore

ステップ2)証明書をTomcatキーストアとcacertsに入れたかったので

3)keytool -import -alias cas -file cas.crt -keystore "C:\ Program Files\Java\jdk1.8.0_77\jre\lib\security\cacerts"

4)keytool -import -alias cas -file "C:\ Program Files\Java\jdk1.8.0_7\jre\bin\cas.crt" -keystore "D:\ portal\Apache-Tomcat-8.0.3\conf\portal.keystore」

したがって、ステップ3と4で、Tomcatキーストアとトラストストアcacertsに証明書を追加しました。

これで、トラストストアとキーストアを一覧表示できます

このコマンドで..

keytool -list -v -keystore "C:\ Program Files\Java\jdk1.8.0_77\jre\lib\security\cacerts" -alias cas

...私はこれを取得します:

Keystore-Kennwort eingeben:
Aliasname: cas
Erstellungsdatum: 09.09.2016
Eintragstyp: trustedCertEntry

Eigentümer: CN=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xxx
Aussteller: CN=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xxx
Seriennummer: xxx
Gültig von: Fri Sep 09 10:40:55 CEST 2016 bis: Thu Dec 08 09:40:55 CET 2016
Zertifikat-Fingerprints:
         MD5:  ....
         SHA1: ....
         SHA256: ....
         Signaturalgorithmusname: SHA256withRSA
         Version: 3

Erweiterungen:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [...
]
]

そしてこれで:

keytool -list -v -keystore "D:\ portal\Apache-Tomcat-8.0.30\conf\portal.keystore" -alias cas

私はこれを得る:

Keystore-Kennwort eingeben:

Keystore-Typ: JKS
Keystore-Provider: Sun

Keystore enthält 1 Eintrag

Aliasname: cas
Erstellungsdatum: 09.09.2016
Eintragstyp: trustedCertEntry

    Eigentümer: CN=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xxx
    Aussteller: CN=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xxx
Seriennummer: ...
Gültig von: Fri Sep 09 10:40:55 CEST 2016 bis: Thu Dec 08 09:40:55 CET 2016
Zertifikat-Fingerprints:
         MD5:  ...
         SHA1: ...
         SHA256: ...
         Signaturalgorithmusname: SHA256withRSA
         Version: 3

Erweiterungen:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
]

]

明確でない場合:証明書(cas)は同じです。

ですから、私の印象では、証明書は現在、Tomcatサーバーのキーストアとトラストストアcacertsにあります。しかし、CASサーバーに資格情報を入力してリダイレクトされると、どういうわけかこの例外が発生します(以下の完全なスタックトレース)。

HTTP Status 500 - 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

これらは私のtomcatsの私のコネクタですserver.xml

<Connector port="8743" protocol="org.Apache.coyote.http11.Http11Protocol" SSLEnabled="true"
               maxThreads="150" scheme="https" keystoreFile="${catalina.base}/conf/portal.keystore" keystorePass="changeit" 
               secure="true" connectionTimeout="240000" 
               clientAuth="false" sslProtocol="TLS" allowUnsafeLegacyRenegotiation="true" />

    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8309" protocol="AJP/1.3" redirectPort="8743" />

私の問題の考えられる原因は何ですか?最初に述べたような他のすべてのスレッドは、OPが証明書をcacertsファイルにインポートしなかったことを指摘していますが、私はインポートしました。

完全なスタックトレース:

09-Sep-2016 12:05:30.146 SEVERE [http-bio-8743-exec-4] org.Apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [default] in context with path [/cas-sample] threw exception
 Java.lang.RuntimeException: 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 org.jasig.cas.client.util.CommonUtils.getResponseFromServer(CommonUtils.Java:443)
    at org.jasig.cas.client.validation.AbstractCasProtocolUrlBasedTicketValidator.retrieveResponseFromServer(AbstractCasProtocolUrlBasedTicketValidator.Java:41)
    at org.jasig.cas.client.validation.AbstractUrlBasedTicketValidator.validate(AbstractUrlBasedTicketValidator.Java:193)
    at org.jasig.cas.client.validation.AbstractTicketValidationFilter.doFilter(AbstractTicketValidationFilter.Java:204)
    at org.Apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.Java:239)
    at org.Apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.Java:206)
    at org.Apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.Java:212)
    at org.Apache.catalina.core.StandardContextValve.invoke(StandardContextValve.Java:106)
    at org.Apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.Java:502)
    at org.Apache.catalina.core.StandardHostValve.invoke(StandardHostValve.Java:141)
    at org.Apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.Java:79)
    at org.Apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.Java:616)
    at org.Apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.Java:88)
    at org.Apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.Java:521)
    at org.Apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.Java:1096)
    at org.Apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.Java:674)
    at org.Apache.Tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.Java:279)
    at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1142)
    at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:617)
    at org.Apache.Tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.Java:61)
    at Java.lang.Thread.run(Thread.Java:745)
Caused by: 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.startHandshake(SSLSocketImpl.Java:1403)
    at Sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.Java:1387)
    at Sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.Java:559)
    at Sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.Java:185)
    at Sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.Java:1513)
    at Sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.Java:1441)
    at Sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.Java:254)
    at org.jasig.cas.client.util.CommonUtils.getResponseFromServer(CommonUtils.Java:429)
    ... 20 more
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)
    ... 33 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)
    ... 39 more
12
yemerra

私の問題はまったく予想外でした。キーストアの別の場所を指すオプションを持つsetenv.batが変更されたTomcatがありました。私はTomcatとアプリケーションサーバー全般についてあまり知らなかったので、以前はそれを理解できませんでした。

4
yemerra

Connector要素はキーストアを定義します。ここで秘密鍵とその証明書が検索されます。

例外はtruststoreに関するものです。これは、信頼できるCA証明書が存在する場所と見つからない場所です。

設定またはjavax.net.ssl.trustStoreシステムプロパティを介して、Tomcatが使用するトラストストアを何らかの方法で定義する必要があります。

2
user207421

Tomcat/binディレクトリに移動できます。 catalina.sh(またはOSによってはcatalina.bat)を変更します。

以下のプロパティをJava_OPTSに追加します。

Java_OPTS="$Java_OPTS -Djavax.net.ssl.trustStore=$CATALINA_HOME/certificates/truststore.ks -Djavax.net.ssl.trustStorePassword=truststorePassword -server"

最近、トラストストア/キーストアの問題を自分で解決する必要がありました。信頼/キーストアを簡単に表示/変更するのに非常に役立つと思ったツールは キーストアエクスプローラー です。

2
Andrew