19

私が書いた2つのJavaアプリがあるとPing.jarします。Pong.jarそれらは2つの別々のサーバーにデプロイされて実行され(Ping.jarにデプロイされsrv-01.myorg.com、にPong.jarデプロイされますsrv-02.myorg.com)、これら2つのアプリはSSLを介して相互に(双方向で)通信する必要があります。また、各アプリに独自のSSL証明書があると仮定しましょう。

  • Javaプログラマーである私は、どのようにコーディングPingし、Pong互いのSSL証明書を検証しますか?各CAは、たとえば、ヒットできるある種のRESTful APIを提供していますHttpClientか?Javaには独自の証明書検証APIがありますか?使用できるオープンソースのサードパーティのJARまたはサービスはありますか?

これをオンラインで検索したとき、ほとんど表示されなかったことに驚きました。

4

4 に答える 4

32

Java SE SSL / TLSクラス(SSLSocketまたはSSLEngine)を使用して接続している場合は、Java Secure Socket Extension(JSSE)を使用しています。

SSLContextこれを作成するために使用された、SSLSocketまたはに応じて、リモートパーティの証明書を検証しますSSLEngine

これは、信頼を確立する方法を指示するSSLContextことで初期化されます。TrustManager

特定の構成が必要でない限り、多くの場合、デフォルト値に依存できます。これは、PKIXアルゴリズム(RFC 3280)に依存して、一連のトラストアンカー(cacertsデフォルト)に対して証明書を検証します。cacerts、Oracle JREに同梱されているのは、証明書を追加できるJKSキーストアです。keytoolたとえば、証明書を明示的に追加できます。

(この回答X509TrustManagerで説明されているように)カスタムキーストアに基づいてプログラムで作成し、デフォルトのキーストアに影響を与えない特定のキーストアで使用することもできます。SSLContext

これに加えて、独自のプロトコルを使用している場合は、取得した証明書が探しているホスト名と一致することを確認する必要があります(RFC 6125を参照)。通常、取得したサブジェクト代替名を検索しX509Certificate(チェーンの最初のピア証明書をから取得しますSSLSession)、それが失敗した場合CNは、サブジェクト識別名でRDNを検索します。

于 2012-06-21T19:25:30.577 に答える
1

にを添付してイベントから証明書を取得するかHandshakeCompletedListenerSSLSocketからSSLSessionSSLSocket取得してセッションからピア証明書を取得することにより、ピア証明書を取得できます。

SSLは、ピアIDのプライバシー、整合性、および認証を提供します。そのピアIDがアプリケーションが期待するものであるかどうか、およびそのIDがアプリケーションで実行できることは、必要に応じてアプリケーションで確認する必要があります。これは「承認」ステップであり、SSLでは実行できません。

于 2012-06-22T00:15:04.133 に答える
0

AFAIK証明書の検証は、次の手順で構成する必要があります。

  1. 署名、現在の時刻に関する有効性、および特定の証明書を使用しているドメインに関する有効性を検証することによる、証明書のフォーマル検証。これらのことは、追加のネットワーク通信なしでチェックできます。
  2. 証明書が取り消されていないかどうかを確認します-これは@Brunoによって与えられた回答に欠けているものです(そうでなければ私は彼に同意します)。このチェックは、証明書に署名したCA(CAとのネットワーク通信)から新しいCRL(証明書失効リスト)を取得した後でのみ実行できると思います。
于 2020-05-13T09:24:25.820 に答える
-1

お互いの証明書を手動で確認する必要はありません。

各サーバー証明書を互いのcacertにインポートするだけで、両方のアプリケーションサーバーが自動的に相互を信頼します。

于 2012-06-21T18:56:15.700 に答える