2

サンプルのWebアプリは、クライアントに代わってWebサービスを安全に呼び出します。これはローカル環境で機能するため、Herokuにデプロイしてみます。

私はProcfile次のように設定しました:

web: java $JAVA_OPTS -Djavax.net.debug=ssl -Djavax.net.ssl.trustStore=cacerts_custom.jks -Djavax.net.ssl.trustStorePassword=password -jar target/dependency/webapp-runner.jar --port $PORT target/*.war

そして、おかげで、ファイル-Djavax.net.debug=sslに追加したカスタムサーバー証明書がロードされていることがはっきりとわかります。cacerts

app web.1 - - trustStore is: cacerts_custom.jks
app web.1 - - trustStore type is : jks
app web.1 - - trustStore provider is :
app web.1 - - init truststore
app web.1 - - adding as trusted cert:
app web.1 - - Subject: me me me
app web.1 - - Issuer: me me me

しかし、私はまだこれらの例外を受け取り続けています:

com.sun.jersey.api.client.ClientHandlerException: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
  at com.sun.jersey.client.apache4.ApacheHttpClient4Handler.handle (ApacheHttpClient4Handler.java:184)
...
Caused by: javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
  at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:371)

app web.1 - - INFO: 1 * Client out-bound request
app web.1 - - 1 > GET https://webservice.com:80/gimmestuff
app web.1 - - 1 > Accept-Encoding: application/zip
app web.1 - -
app web.1 - - http-nio-31384-exec-5, setSoTimeout(0) called
app web.1 - - Allow unsafe renegotiation: false
app web.1 - - Allow legacy hello messages: true
app web.1 - - Is initial handshake: true
app web.1 - - Is secure renegotiation: false
app web.1 - - %% No cached client session
app web.1 - - *** ClientHello, TLSv1
app web.1 - - RandomCookie:  GMT: 1340484029 bytes = { 185, 85, 19, 4, 68, 226, 214, 134, 35, 143, 91, 59, 106, 156, 34, 20, 77, 75, 64, 92, 131, 186, 239, 23, 168, 188, 37, 157 }
app web.1 - - Session ID:  {}
app web.1 - - Cipher Suites: [SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_DES_CBC_SHA, SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV]
app web.1 - - Compression Methods:  { 0 }
app web.1 - - ***
app web.1 - - http-nio-31384-exec-5, WRITE: TLSv1 Handshake, length = 75
app web.1 - - http-nio-31384-exec-5, WRITE: SSLv2 client hello message, length = 101
app web.1 - - http-nio-31384-exec-5, READ: TLSv1 Alert, length = 2
app web.1 - - http-nio-31384-exec-5, RECV TLSv1 ALERT:  fatal, handshake_failure
app web.1 - - http-nio-31384-exec-5, called closeSocket()
app web.1 - - http-nio-31384-exec-5, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
app web.1 - - http-nio-31384-exec-5, IOException in getSession():  javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
app web.1 - - http-nio-31384-exec-5, called close()
app web.1 - - http-nio-31384-exec-5, called closeInternal(true)
app web.1 - - http-nio-31384-exec-5, called close()
app web.1 - - http-nio-31384-exec-5, called closeInternal(true)

だから、この時点で私は疑問に思っています:

  1. webapp-runner.jarcacerts_custom.jksファイルを使用するようにを構成するために他に何ができますか?
  2. Procfileまたはアプリサーバーを実行する他のHerokuレベルのコンポーネントに問題がある場合は?
  3. 他に何も問題がない場合、コードで何が間違っている可能性がありますか?

更新#1:

httpsでApachehttpclientを使用すると、ここでhttpclientに根本的な問題がある可能性がありますが、それが今日でも問題であるとは信じがたいです。調査して投稿しますが、誰かが答えを知っている場合は教えてください。


更新#2(2013年1月15日):

私が次のstackoverflowの投稿でそれが言うことを通り抜けると:

SSLHandshakeExceptionの受信:クライアントがすべての証明書を無視しているにもかかわらず、handshake_failure

これは、次のログが問題の兆候であることを示唆しています。

app[web.1]: http-nio-45949-exec-4, WRITE: TLSv1 Handshake, length = 75
app[web.1]: http-nio-45949-exec-4, WRITE: SSLv2 client hello message, length = 101
app[web.1]: http-nio-45949-exec-4, READ: TLSv1 Alert, length = 2
app[web.1]: http-nio-45949-exec-4, RECV TLSv1 ALERT:  fatal, handshake_failure

では、ここで何を非難するのでしょうか?サーバー証明書を提示している側?これは、ローカルでホストされているWebアプリがその側で動作できるためではありません...ローカル環境でのJDKと、SSLハンドシェイクやプロトコルの実装が大幅に異なるHerokuでのJDKを除きますか?

4

1 に答える 1

3

ライセンス上の理由から、Herokuが使用するOpenJDKビルドには、Java Cryptography Extensions(JCE)が含まれていません。一部のSSL証明書では、JCEを処理する必要があります。

次の記事の手順に従って、JCEをアプリに含めてJDKに含めることができます:https ://devcenter.heroku.com/articles/customizing-the-jdk

ここからJCEをダウンロードします:http ://www.oracle.com/technetwork/java/javase/downloads/index.html

于 2013-01-17T23:35:20.820 に答える