2009-10-30 15 views
8

要旨:Javaコードを使用してJavaに新しいルート証明書をインストールするにはどうすればよいですか?keytoolコマンドラインユーティリティを使用せずに新しいJava CA証明書をインポートするにはどうすればよいですか?

私たちはさまざまなWebサービスにアクセスするデスクトップアプリケーションを持っています。最近、1人がSSL証明書をTrustwaveによって署名されたものに切り替えました。 Trustwave社のSSL証明書は、通常のインターネットブラウザで受け入れられているが、Javaが前提のルート証明書が付属していないようだ、と私たちは、次のエラーメッセージで指定したWebサービスへのアクセス失った:私たちは一時的だ

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

をプロバイダをVerisignに戻すように説得することで猶予しますが、スイッチバックするときには準備が必要です。だから、必要に応じてTrustwaveのルート証明書を自動的にインストールするために私たちのデスクトップソフトウェアが必要です。私たちの顧客はkeytoolコマンドを使用するのに技術に精通しておらず、脆弱なソリューション(MacとPCのための別個の実装、Vistaの実行制限に対する苦闘、正しいJREのインストールの問題、など)。

私はkeytoolがJavaを内部的に使用していると思います。 keytoolの機能を複製してプログラムでルート証明書をインストールするためにJavaでどのようなコマンドを使用できますか?

答えて

2

可能かどうかわかりませんが、独自のTrustManagerを実装して、この接続またはこのCAを許可することができます。 Hereが基本です。

+0

それは私たちのために働くことができます。このリンクは、私たちが正確に望むものではない検証を完全に無効にする方法を示唆していますが、通常のTrustManagerにすべての通常のルート証明書と1つを試すものを作ることができます。ありがとう、これは有望そうです。 –

0

デスクトップマシンの信頼されたルートのキーストアに証明書をインストールするには、その証明書をインストールする権限が必要です。 keytoolと同じですが、信頼できるルートのキーストアにアクセスするにはパスワードが必要です。あなたは間に合わせのn-になりたい場合は、

  • ファイルやバイトストリームまたはKeyToolクラス(sun.security.tools.KeyTool

しかし、私見場合を使用してどんな

  • 輸入に証明書を書くことができます証明書が有効でない場合は、信頼できません。私はそれには正当な理由があると言います。

  • +0

    FirefoxとInternet Explorerで有効です。 Javaには、提供されるOSを使用するのではなく、独自のキーストアが付属しています.Javaバージョンには、SSL市場に最新のものが含まれていないと仮定します。 –

    +0

    これは妥当な場合があります。当社では、自社のCAを社内で使用しています。当然のことながら、デフォルトでは信頼されていません(ブラウザなど)。このCA証明書をインポートすることは、場所全体で単一証明書の例外を追加するよりはるかに簡単です。 – sfussenegger

    1

    IMHOは、主に開発者が信頼できるCAのセットを変更できないように、APIを使用してkeytoolを公開していません。私は、攻撃者がそのようなコードを悪用して自分のルート証明書をトラストストアに挿入し、トラストストアのモデルを損なうと想像することができます。

    実際、KeyToolクラス(sun.security.toolsパッケージ)のソースを見ると、最終的なだけでなく、呼び出し元がKeyToolクラスのインスタンスを作成できないようにする専用のコンストラクタもありますコード。 KeyToolにはmainメソッドがあり、CommandTool(したがってOSユーザー)はおそらくKeyToolを初期化して通信できる唯一の方法です。

    のみ(単純化)であろう左アプローチ:

    • アプリケーションからプロセスとしてキーツール初期化し、ルートCA証明書をインストールするためのコマンドライン引数を渡します。これだけでは悪い考えです。ユーザーに何が起こっているかを通知することをお勧めします。
    • keytoolの使用を避け、KeymanまたはKeyTool IUIを使用してルートCAをインストールする方法をユーザーに指示します。私だけここで話して、私は後者を好む。
    +1

    ユーザーの技術レベルでは、「あなたのアプリケーションが壊れている、修正する」というサポート質問の種類を忘れることのない唯一のオプションはインストールされています。 –

    +0

    アプリケーションがキーストアを変更できるかどうかの哲学的な問題に関しては、答えはもちろんあります。そうでなければ、キーツール自体は動作できませんでした。おそらくセキュリティ管理者によって操作へのアクセスを制御することができます。ああ、私は逃げる。この背後にある設計の決定は、実用的な解決策を探すほど重要ではありません。いずれにせよポインタに感謝します。 –

    +3

    私はあなたが望むすべてのルートCAを含むことができる独自のトラストストアを使用して、別の代替案を忘れてしまいました。 javax.net.ssl.trustStoreプロパティを使用して、JVMにそのトラストストアを使用させることができます。 –

    1

    いつでもKeyToolをプロセスRuntime.exec(...)として呼び出すことができます。

    0

    Command-line solution. Macでは、Javaホームは/ Library/Java/Homeです。試してみてください:

    $ sudo -i 
    # cd /Library/Java/Home 
    # keytool -import -trustcacerts -alias CAName -file CA.crt -keystore lib/security/cacerts 
    

    証明書ファイルへのパスを使用してCA、およびCA.crtの名前に置き換えてCANameの(PEMが動作します)。キーストアのパスワードを要求するプロンプトが表示されます。デフォルトのパスワードは、リンクされた記事に記載されています。

    RapidSSLのCA証明書の1つでこれを行う必要がありました。現在のディレクトリに

    https://code.google.com/p/java-use-examples/source/browse/trunk/src/com/aw/ad/util/InstallCert.java

    新しいcacertsファイルが命名されますjssecacerts:

    +0

    私の好きな部分は、keytoolを使わずにそれをやりたいと言ったところで、keytoolを使うように言ったのです;) –

    +0

    真。しかし、私はJava TrustManagerの作成を想像することはできませんし、何らかの形でそのアプリケーションを配布することは、複数の環境が混在していても、keytoolを使ったスクリプトソリューションよりも簡単です。 – farcepest

    0

    日には、任意の本命とHTTPSを実行している任意のターゲットホストに基づいて、あなたのcacertsファイルの更新バージョンを作成するには、このコードを公開しました。その新しいファイルをjre/lib/security/cacertsファイルにコピーするだけです。

    新しいcacertsファイルのセキュリティについては何もコメントしません。

    関連する問題