2012-04-05 19 views
2

私は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に必要なものを追加することができ、誰もが幸せであるように、デフォルト値を上書きしませんか?

+0

SSLデバッグを有効にするには、javax.net.debugプロパティを使用してください。http://www.herongyang.com/JDK/SSL-Socket-Communication-Debug-javax-net-debug.html –

+0

私はそれを有効にすることによって提供された小さな情報で投稿を更新しました。 – twilbrand

答えて

2

私のための解決策は、私たちがjava optを使用してデフォルトのJavaトラストストアをオーバーライドしていたことに終わりました。これにより、myStore.jksにデフォルトのルート証明書がないため、第三者から送信された証明書が無効に見えるようになりました。

デフォルトのjava(/ lib/security/cacerts)に自己署名入りの証明書を追加し、java optを削除することで、すべてがうまくいきました。

代わりに、デフォルトのJavaストアのすべてをカスタムストアに追加し、引き続きjava optを使用することもできます。どちらの場合でも、あなたの状況に対してより保守性の高いものを見つけることができます。

2

私はこのエラーを何度も見ました。私は次のユーティリティを使用して、SSLを使用するサイトから証明書を取得しました。ここに行き、InstallCertをつかみなさい。このユーティリティをコンパイルして実行します。このユーティリティで生成されたファイルは、キーストアとして使用できます。

関連する問題