keytoolコマンドラインユーティリティを使用せずに新しいJava CA証明書をインポートするにはどうすればよいですか?
-
22-07-2019 - |
質問
エグゼクティブサマリー:Javaコードを使用してJavaに新しいルート証明書をインストールする方法
さまざまな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を使用していると思います。 Java内でkeytoolの機能を複製し、ルート証明書をプログラムでインストールするためにどのコマンドを使用できますか?
解決
それが可能かどうかはわかりませんが、この接続またはこのCAを許可する独自のTrustManagerを実装できます。 こちらは基本。
他のヒント
IMHO、Sunは、主に開発者が信頼できるCAのセットを変更できないようにするために、APIを介してkeytoolを公開していません。攻撃者がこのようなコードを悪用して独自のルート証明書をトラストストアに挿入し、トラストストアのまさにモデルを侵害することを非常に想像できます。
実際、KeyToolクラス(sun.security.toolsパッケージ)のソースを見ると、最終的なだけでなく、呼び出し元がコードからKeyToolクラスのインスタンスを作成できないようにするプライベートコンストラクタもあります。 。 KeyToolにはmainメソッドがあり、Keylineを初期化して通信できる唯一の方法はコマンドライン(つまりOSユーザー)になる可能性があります。
残っている唯一の(単純な)アプローチは次のとおりです。
- keytoolをアプリケーションからプロセスとして初期化し、コマンドライン引数を渡してルートCA証明書をインストールします。これだけでは悪い考えです。何が起きているのかをユーザーに通知することをお勧めします。
- keytoolの使用を避け、代わりにを使用してルートCAをインストールする方法の説明をユーザーに提供します。 Keyman または KeyTool IUI 。ここでのみ私自身のために言えば、私は後者を好む。
常にKeyToolをプロセス Runtime.exec(...)
として呼び出すことができます。
証明書をデスクトップマシン上の信頼されたルートのキーストアにインストールする場合は、そのための許可が必要です。 keytool でも同じです。信頼されたルートのキーストアにアクセスするにはパスワードが必要です。クイックnダーティにしたい場合は、次のことができます
- 証明書をファイルまたはバイトストリームなどに書き込みます
-
KeyTool
クラスを使用したインポート(sun.security.tools.KeyTool
)
ただし、証明書が有効でない場合、私見では信頼できません。それには正当な理由があると思います。
コマンドラインソリューション。 Macでは、Javaホーム/ Library / Java / Homeです。試してください:
$ sudo -i
# cd /Library/Java/Home
# keytool -import -trustcacerts -alias CAName -file CA.crt -keystore lib/security/cacerts
CANameをCAの名前に、CA.crtを証明書ファイルへのパスに置き換えます(PEMが機能します)。キーストアのパスワードの入力を求められます。デフォルトのパスワードは、リンクされた記事に記載されています。
RapidSSLのCA証明書の1つに対してこれを行わなければなりませんでした。
サンはこのコードを公開して、任意の証明書でhttpsを実行しているターゲットホストに基づいてcacertsファイルの更新バージョンを作成しました。
https://code.google.com/p/java-use-examples/source/browse/trunk/src/com/aw/ad/util/InstallCert.java
新しいcacertsは、現在のディレクトリでjssecacertsという名前になります。その新しいファイルをjre / lib / security / cacertsファイルにコピーするだけです。
新しいcacertsファイルのセキュリティについてコメントしません。