2

Apache HttpClient を使用してサードパーティに https API 呼び出しを行う grails 1.3.7 アプリケーションがあります。ヒットしているサードパーティの URL には有効な証明書があります。次のようにリクエストを作成して実行します。

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
}

プロジェクトを開発モードで実行している場合、これは正常に機能します。また、curl とブラウザから同じ URL をエラーなしで直接呼び出すこともできます。ただし、プロジェクトが war ファイルに組み込まれ、クライアントが https を使用して US に接続できるように証明書/キーストアが定義された tomcat インスタンスに置かれると、私の要求は次の IOException で失敗し始めます。

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

ここで障害点を見つけようとしています。

curl または開発者モードからの https 要求の作成が、https 構成の tomcat インスタンスからの https 要求の作成と異なるのはなぜですか?

Tomcat インスタンスは公開されていませんが、ブラウザーから接続しても証明書の問題はありません (詳細な curl 要求と同様に、chrome は証明書に問題がないことを示しています)。

私は決して https/ssl の専門家ではないので、何が間違っているのか、なぜ間違っているのか、どうすれば修正できるのかを説明する助けを求めています。他に必要な情報を提供できます。

---更新---以下に示すよう に有効にjavax.net.debugすると、出力に次のエラーが含まれていました。

java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be\
 non-empty

グーグルで調べたところ、この問題は、Tomcatの起動時に次のJavaオプションを使用しているためだと思いました。

-Djavax.net.ssl.trustStore=/path/to/tomcat/conf/myStore.jks

それが本当なら、myStore.jks に必要なものを追加し、デフォルトをオーバーライドせずに全員が満足できるようにするにはどうすればよいでしょうか?

4

2 に答える 2

2

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

于 2012-04-11T03:58:26.257 に答える
2

私にとっての解決策は、Java opt を使用して、デフォルトの Java トラストストアを独自のものでオーバーライドすることでした。これにより、myStore.jks にデフォルトのルート証明書がないため、サードパーティから送信された証明書が無効に見えるようになりました。

自己署名証明書をデフォルトの Java 証明書 (/lib/security/cacerts) に追加し、Java オプションを削除すると、すべて問題ありませんでした。

別の方法として、デフォルトの Java ストアのすべてをカスタム ストアに追加し、引き続き Java オプションを使用することもできます。状況に応じてより保守しやすい方を選択してください。

于 2012-04-12T21:27:16.250 に答える