2016-08-05 14 views
0

現在、REST APIのラッパーを作成中です。サイトでSSLがクラウドフレアプランを通過しています。 私はOkHttp3を使ってAPIを呼び出そうとしています。クラウドフレアは明らかに、Javaがデフォルトで(java.securityで)無効になっている古い暗号を使用しています。古い/安全でない暗号をJavaでプログラムで有効にする

私はこのスタックトレースを取得するAPIにPOSTリクエストをしよう:

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 okhttp3.internal.connection.RealConnection.connectTls(RealConnection.java:241) 
at okhttp3.internal.connection.RealConnection.establishProtocol(RealConnection.java:198) 
at okhttp3.internal.connection.RealConnection.buildConnection(RealConnection.java:174) 
at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:114) 
at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:193) 
at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:129) 
at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:98) 
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42) 
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) 
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) 
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:109) 
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) 
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) 
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93) 
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) 
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:124) 
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92) 
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67) 
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:170) 
at okhttp3.RealCall.execute(RealCall.java:60) 
at de.dootdoot.dubtrack4k.requesttypes.AbstractRequest.request(AbstractRequest.kt:28) 
at de.dootdoot.dubtrack4k.requesttypes.AbstractRequest.request(AbstractRequest.kt:23) 
at de.dootdoot.dubtrack4k.HttpRequester.post(HttpRequester.kt:26) 
at de.dootdoot.dubtrack4k.HttpRequester.request(HttpRequester.kt:14) 
at de.dootdoot.dubtrack4k.HttpRequester.request$default(HttpRequester.kt:11) 
at de.dootdoot.dubtrack4k.requests.LoginRequest.setURL(LoginRequest.kt:50) 
at de.dootdoot.dubtrack4k.requests.LoginRequest.request(LoginRequest.kt:17) 
at de.dootdoot.dubtrack4k.models.Account.login(Account.kt:10) 
at de.dootdoot.dubtrack4k.Dubtrack.login(Dubtrack.kt:19) 
at LoginTest.loginTest(LoginTest.kt:15) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
at org.junit.runner.JUnitCore.run(JUnitCore.java:160) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:119) 
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42) 
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:234) 
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:74) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:497) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144) 
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) 
... 65 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:146) 
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:131) 
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) 
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382) 
... 71 more 

は、だから私は少し周りを見て、SSLのデバッグを有効にする方法を発見してきました。 (それが何らかの理由でコードブロックにはなりませんのでHastebin)これは、このデバッグログの結果:

それはこの言うログの終わりに近い

http://hastebin.com/palomijisa.dos

%% Invalidated: [Session-1, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256] 
main, SEND TLSv1.2 ALERT: fatal, description = certificate_unknown 

私はいくつかの周りにGoogleを作った。どうやら、これはデフォルトで無効になっている古いアイディアなのですが、これはjava.securityの無効なアルゴリズムのセクションにリストされています。 私はAPIラッパーを書いているので、他の誰かがそれを使用することを許可しないので、私のマシンでこれを編集しても意味がありません。 私の質問は、ラッパーが入っているセッションだけでその証明書を許可する方法はありますか? 私はOkHttp3を少し見てきましたが、実際には暗号スイートはCipherSuiteクラスにリストされていますが、どのように使用するのか分かりません。 誰もこのようなシナリオでの経験はありますか? ありがとうございます!

+0

これは非常に奇妙に見えます。私はCloudFlare証明書に問題はなかったし、フラット・アウトで互換性がないと非常に懐疑的だ。 – chrylis

+0

これは、独自のAPIラッパーとDubtrack4J(OkHttp3も使用する)という既存のAPIラッパーの両方で発生します。これは、CloudFlare SSLを追加した後で初めて発生しました。投稿しようとしているURLは 'https://api.dubtrack 'です。fm/auth/dubtrack'を実行してください。 –

答えて

0

JVMがStartComをルートCAとして信頼しないため、証明書が拒否されるという問題があります。これは、デバッグ中にエラーがあるCN = StartComクラス2 IVサーバーCA、OU = StartCom認証局、O = StartCom(株)、C = IL

証明書は

件名によって署名されていますログイン

main, SEND TLSv1.2 ALERT: fatal, description = certificate_unknown 

ダウンロードhttps://aia.startssl.com/certs/ca.crt

手動一度あなたがそれをインポートすることができますいずれかパーマこのJVMインスタンスに追加します。クロムとOSXはすでにそれをサポートしているので、安全でなければなりません。

https://www.ailis.de/~k/uploads/scripts/import-startssl

keytool -keystore C:\Program Files\Java\jdk1.8.0_73\jre\lib\security\cacerts -storepass changeit -import -trustcacerts -alias startcom -file ca.crt 

または代わりに、あなたのプログラムで証明書をパッケージ化し、実行時にそれをロードします。これは私の提案されたルートだろう。

https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/CustomTrust.java

https://github.com/yschimke/oksocial/blob/master/src/main/java/com/baulsupp/oksocial/security/CertificateUtils.java

+0

これは正しいアプローチだと思われます。私は自動的に証明書をダウンロードし、Keytoolのmainメソッドをパラメータで直接呼び出します。私が今直面している問題は、コンソールからの確認が期待されることです。どうすればそれを自動化できるか考えていますか?私はすでに標準入力ストリームをByteInputStreamに置き換えようとしましたが、動作していないようです。 –

+0

そのビットを自動化すべきではありません。セキュリティメカニズムの目的を破ります。私は、ファイルから証明書を読み込む方法を示す答えへのリンクをいくつか追加し、それをあなたのクライアントにのみ使用しました。 –

+0

ええ、これらの例のおかげで私の問題を解決することができました。ありがとうございました! –

関連する問題