JVM にパブリック SSL 証明書をインポートする方法

プラットフォームについて: Server と Data Center のみ - この記事は、サーバーおよびデータセンター プラットフォームのアトラシアン製品にのみ適用されます。


問題

HTTPS 経由で 2 つのサーバーを接続する場合、各サーバーのパブリック SSL 証明書がもう片方のサーバーの JVM のトラストストアに追加されている必要があります。


ソリューション

JVM にパブリック SSL 証明書をインポートするには、2 つの方法があります。

Portecle の使用

  1. アプリケーションを実行しているサーバーに Portecle アプリをダウンロードしてインストールします。

    これはサードパーティ製のアプリケーションであり、アトラシアンのサポート対象外です。

  2. <JAVA_HOME> 変数が、アプリケーションが使用している Java と同じバージョンを指していることを確認します。詳細な情報については「JAVA_HOME の設定」ドキュメントをご参照ください。

     Linux / Unix サーバー上で実行している場合は、サーバーへの接続時に次のように X11 を転送することで GUI を利用できます。

    ssh -X user@server
  3. [Examine] メニューを選択し、[ Examine SSL/TLS Connection ] をクリックします。
  4. ターゲットとなるシステムの SSL ホストとポートを入力します。
  5. 読み込みが完了されるまで待ちます。完了したら、パブリック証明書を選択し、PEM をクリックします。
  6. 証明書をエクスポートし、保存します。
  7. メイン画面に戻り、[Open an existing keystore from disk] オプションを選択し、トラストストア ファイル (例: $JAVA_HOME/lib/security/cacerts) を選択して、パスワードを入力します (既定は changeit)。
  8. [Import a trusted certificate into the loaded keystore] ボタンを選択します。
  9. ステップ 6 で保存した証明書を選択し、適切なエイリアス (例: confluence) を付与して、信頼済みであることを確認します。
    1. 次のようなエラーが表示される可能性があります。 
    2. これが発生した場合、[OK] をクリックして証明書を信頼済みとして許可します。
  10. キーストアをディスクに保存します。
  11. アプリケーションを再起動します。
  12. ホストに接続できることをテストします。

コマンド ラインを使用したインストール

  1. 証明書を取得します (以下のコマンドの google.com を、Jira が接続しようとしているサーバーの FQDN に置き換えます)。
    Unix の場合:

    openssl s_client -connect google.com:443 -servername google.com:443 < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > public.crt

    Windows の場合:

    openssl s_client -connect google.com:443 -servername google.com:443 < NUL | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > public.crt

    リダイレクションが行われるドメインのページにいる場合、適切なドメインを読み込むよう、常に -servername <your_domain_name> を指定する必要があります。これを行わない場合、OpenSSL は、ドメインに所属するのが 2 番目の証明書だった場合も、受け取った最初の SSL 証明書を使用します。

    上記のコマンドは、環境に Sed for WindowsOpenSSL がインストールされている場合にのみ実行されます。Sed または OpenSSL をインストールしていないか、インストールする予定がない場合、代替手段として以下の手順を利用できます。次のコマンドを実行します。

    openssl s_client -connect google.com:443 -servername google.com:443

    出力を public.crt. というファイルに保存します。public.crt ファイルを編集し、BEGIN CERTIFCATEEND CERTIFICATE の間の内容だけを含むようにします。編集後は次のようになります。

    -----BEGIN CERTIFICATE-----
    < Certificate content as fetched by the command line. 
    Don't change this content, only remove what is before 
    and after the BEGIN CERTIFICATE and END CERTIFICATE. 
    That's what your Sed command is doing for you :-) >
    -----END CERTIFICATE-----
  2. 証明書をインポートします。

    <JAVA_HOME>/bin/keytool -import -alias <server_name> -keystore <JAVA_HOME>/jre/lib/security/cacerts -file public.crt

    必要に応じてパスワードを入力します (既定は changeit)。

  3. Restart your application
  4. ホストに接続できることをテストします。


トラストストアの代替ロケーション

Java は通常 $JAVA_HOME/jre/lib/security/cacerts にあるシステムレベルのキーストアを使用しますが、-Djavax.net.ssl.trustStore=/path/to/keystore パラメータを指定することで、異なるキーストアを使用できます。ここで "/path/to/truststore" は代替トラストストアの絶対パスです。Jira のスタートアップ変数を構成する方法については、こちらをご確認ください。

しかしながら、この設定は推奨されていません。これは、Java がカスタム キーストア (自己署名証明書を含む) を使用するように指定された場合、$JAVA_HOME/jre/lib/security/cacerts で見つかった署名認証局のルート証明書へのアクセスを持たず、CA が署名したほとんどの SSL サイトへのアクセスに失敗するためです。前述のように、新しい証明書 (自己署名証明書) をシステムレベルのキーストアに追加することをおすすめします。

デバッグ

次のような問題が発生する場合があります。

  • 証明書が誤ったトラストストアにインストールされている。
  • 接続しようとしている SSL サービスの証明書がキーストアに含まれていない。
説明HTTPS 経由で 2 台のサーバーを接続する場合、それぞれのサーバーのパブリック SSL 証明書がもう片方に読み込まれている必要があります。
製品Jira、Confluence、Bamboo、Bitbucket
最終更新日 2020 年 4 月 1 日

この内容はお役に立ちましたか?

はい
いいえ
この記事についてのフィードバックを送信する
Powered by Confluence and Scroll Viewport.