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

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

Support for Server* products ended on February 15th 2024. If you are running a Server product, you can visit the Atlassian Server end of support announcement to review your migration options.

*Fisheye および Crucible は除く

このページの内容はサポート対象外のプラットフォームに関連しています。したがって、アトラシアン サポートではこのページの記載内容のサポートの提供は保証されません。この資料は情報提供のみを目的として提供されています。内容はお客様自身の責任でご利用ください。

問題

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


ソリューション

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

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

  1. 証明書を取得します。google.com を、アプリケーションが接続しようとしているサーバーの FQDN に置き換えてください。

    openssl を使った方法

    Unix:

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

    Windows の場合:

    openssl s_client -connect google.com:443 -servername google.com < 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

    出力を 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-----
    keytool を使った方法

    keytool for fetching a certificate that does not support Server Name Indication (SNI). If you need to specify a server name to get the correct certificate, please use openssl instead.


    Unix:

    $JAVA_HOME/bin/keytool -printcert -sslserver google.com:443 -rfc >> public.crt

    Windows の場合:

    %JAVA_HOME%/bin/keytool -printcert -sslserver google.com:443 -rfc >> public.crt
  2. 証明書をインポートします。

    Java 8:

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


    Java 11:

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

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


    (info) Note: If the cacerts file already has a certificate for the same server name, the import may fail with the following error:

    keytool error: java.lang.Exception: Certificate not imported, alias already exist

    このような場合は、新しい証明書をインポートし直す前に、まず既存の証明書を cacerts から削除する必要があります。
    既存の証明書を削除するには、以下のコマンドを使用します。

    Java 8:

    <JAVA_HOME>/bin/keytool -delete -alias <server_name> -keystore <JAVA_HOME>/jre/lib/security/cacerts


    Java 11:

    <JAVA_HOME>/bin/keytool -delete -alias <server_name> -keystore <JAVA_HOME>/lib/security/cacerts
  3. アプリケーションを再起動します。
  4. ホストに接続できることをテストします。


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

Java は通常、システム全体のトラストストアを使用します。

  • Java 8: $JAVA_HOME/jre/lib/security/cacerts
  • Java 11: $JAVA_HOME/lib/security/cacerts

ただし、パラメータ「-Djavax.net.ssl.trustStore=/path/to/truststore」を指定することで別のトラストストアを使用することは可能です。/path/to/truststore は代替トラストストアの絶対ファイルパスです。Jira のスタートアップ変数を構成する方法については、こちらをご確認ください。

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

デバッグ

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

  • 証明書が誤ったトラストストアにインストールされている。
  • 接続しようとしている SSL サービスの証明書がキーストアに含まれていない。


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. ホストに接続できることをテストします。


説明 HTTPS 経由で 2 台のサーバーを接続する場合、それぞれのサーバーのパブリック SSL 証明書がもう片方に読み込まれている必要があります。
製品Jira、Confluence、Bamboo、Bitbucket
最終更新日 2023 年 11 月 29 日

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

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