私はapache HttpClientを使って第三者にhttps api呼び出しを行うgrails 1.3.7アプリケーションを持っています。私が打っているサードパーティのURLには、有効な証明書があります。私は次のようにしてリクエストを作成して実行します。なぜjavax.net.ssl.SSLPeerUnverifiedExceptionが発生するのですか?ピアは本番環境でのみ認証されていますか?
HttpClient client = new DefaultHttpClient()
List<BasicNameValuePair> queryParams = new ArrayList<BasicNameValuePair>()
queryParams.add(new BasicNameValuePair("a_parameter", "a_parameter_value"))
URI uri = URIUtils.createURI("https", "third.party.address", 443, "/some/url/for/us", URLEncodedUtils.format(queryParams, "UTF-8"), null)
HttpGet httpGet = new HttpGet(uri)
try {
log.debug "Sending request to ${uri}"
return client.execute(httpGet)
} catch(HttpException e) {
log.error "HttpException during location lookup request: ${e}"
return
} catch(IOException e) {
log.error "IOException during location lookup request: ${e}"
return
}
これは、私のプロジェクトをdevモードで実行しているときにうまく動作します。私はまた、エラーなしでカールと私のブラウザから同じURLを直接呼び出すことができます。私のプロジェクトは、warファイルに組み込まれており、クライアントがHTTPSを使用して、米国に接続できるように定義された証明書/キーストアを持っているTomcatインスタンスに置かれているしかし、一度、私の要求は、次のIOExceptionで失敗を開始:
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
私はここで失敗のポイントを把握しようとしています。
なぜ、curlまたはmy devモードからのhttps要求が、https構成のtomcatインスタンスからのhttps要求と違うのですか?
tomcatインスタンスには公開されていませんが、ブラウザから接続すると証明書の問題は発生しません(クロールでは、証明書は大丈夫です
私はhttps/sslのエキスパートではありませんので、何が間違っているのか、なぜ間違っているのか、どうやって解決できるのかを説明しています。私は他の必要な情報を提供することができます。
---更新--- の下に提案し、出力は次のようなエラーが含まれて私はjavax.net.debug
を有効に:
java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be\
non-empty
私のグーグルでは、私はだから、この問題があると考えて作られていますTomcatを起動するときに次のJava OPTを使用して:
-Djavax.net.ssl.trustStore=/path/to/tomcat/conf/myStore.jks
それが本当ならば、どのように私は私がmyStore.jksに必要なものを追加することができ、誰もが幸せであるように、デフォルト値を上書きしませんか?
SSLデバッグを有効にするには、javax.net.debugプロパティを使用してください。http://www.herongyang.com/JDK/SSL-Socket-Communication-Debug-javax-net-debug.html –
私はそれを有効にすることによって提供された小さな情報で投稿を更新しました。 – twilbrand