null DockerのLiferay環境にHTTPSを設定する

以前のブログ にて、Dockerを利用したLiferay環境の構築方法を紹介しました。今回は、この環境にhttpsを設定する手法をご紹介します。

目標

  • ローカルからhttps://liferaytest.local にアクセスすることで、Dockerで起動しているliferay画面が表示されるようにする
  • ローカルからhttp://liferaytest.localにアクセスした場合、https://liferaytest.local にリダイレクトするようにする

注: ローカル環境の80ポートや443ポートを別の用途で使用している場合、競合してしまいます。本手順を試す際にそれらのポートを使用しているサービスやアプリケーションを停止させるか、今回使用するポートを別ポートとしてください(その場合はhttps://liferaytest.local:8443 などにアクセスすることとなります)

準備

hostsの設定

hostsファイルを開き、127.0.0.1 liferaytest.localを追加します。ファイルの場所はOSにより異なります。

  • MacやLinuxの場合: /etc/hosts
  • Windowsの場合: C:\windows\system32\drivers\etc\hosts

Dockerコンテナの起動

Liferay社提供のDockerイメージを用いてコンテナを作成し、起動します。このとき、以下のようにhttps用のポートとして443も開けておきます。また、本記事ではコンテナ名をliferay_test_httpsとします。

$ docker run -d -p 80:8080 -p 443:8443 --name liferay_test_https liferay/dxp:latest

 

設定

自己署名証明書の作成とインポート

本記事では、httpsの証明書として自己署名証明書を使用します。

  1. ルート権限のユーザとして、コンテナでBashシェルを開きます
    $ docker exec -it -u root liferay_test_https bash
  2. tomcatディレクトリに移動し、以下のコマンドを使用します。
    $ cd tomcat
    $ keytool -genkey -alias tomcat -keyalg RSA -keystore keystore
    
  3. パスワードの設定を求められるため、適当な値を入力します(本記事ではchangeit)
    Enter keystore password:
    Re-enter new password: 
  4. 続けて名前や組織などの入力を求められますが、今回はテスト用の自己証明書なので空欄のまま進めます。最後に入力値が問題ないか確認されるため、yと回答します。
    What is your first and last name?
      [Unknown]:
    What is the name of your organizational unit?
      [Unknown]:
    What is the name of your organization?
      [Unknown]:
    What is the name of your City or Locality?
      [Unknown]:
    What is the name of your State or Province?
      [Unknown]:
    What is the two-letter country code for this unit?
      [Unknown]:
    Is CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?
      [no]:  y
  5. サーバーの証明書をエクスポートするため、続けて以下のコマンドを実行します。コマンド実行時にパスワードを尋ねられるので、先ほど設定した値を入力します。実行後、tomcatディレクトリに証明書(server.crt)が作成されます。
    $ keytool -export -alias tomcat -keypass changeit -file server.crt -keystore keystore
    Enter keystore password: 
  6. 次に、以下のコマンドによりJDKのcacertsにインポートします。パスワードと、証明書を信用するかの確認を求められるので、それぞれ入力します。
    $ keytool -importcert -alias tomcat -file server.crt -keypass changeit -cacerts
    Enter keystore password:
    ...
    中略(作成した証明書の情報)
    ...
    Trust this certificate? [no]:  y
    Certificate was added to keystore
    

TomcatへのSSL設定

前項目に引き続き、ルート権限のユーザとして、コンテナでBashシェルを開いている状態で作業を行います。

  1. コンテナ内にテキストエディタが入っていないので、vimをインストールします
    $ apt-get update
    $ apt-get install -y vim
  2. /opt/liferay/tomcat/conf/server.xmlファイルを開き、以下の2点を書き換えます
    $ vi /opt/liferay/tomcat/conf/server.xml
    • 8443ポートに関するConnectorを記載します
      • 修正前の内容(8443ポートに関する内容がコメントアウトされている)
        <!--
        <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
            maxThreads="150" SSLEnabled="true">
            <SSLHostConfig>
                <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
                    type="RSA" />
            </SSLHostConfig>
        </Connector>
        -->
      • 修正後の内容(keystorePassの値は、keystore作成時に設定したパスワード)
        <Connector
            protocol="org.apache.coyote.http11.Http11NioProtocol"
            port="8443" maxThreads="200"
            scheme="https" secure="true" SSLEnabled="true"
            keystoreFile="/opt/liferay/tomcat/keystore" keystorePass="changeit"
            clientAuth="false" sslProtocol="TLS"/>
    • httpで8080ポートにアクセスできない場合に8443ポートにリダイレクトするという設定を、443ポートへのリダイレクトに修正します。
      • 修正前の内容(redirectPort="8443")
        <Connector port="8080" protocol="HTTP/1.1"
            connectionTimeout="20000"
            redirectPort="8443" URIEncoding="UTF-8" />
      • 修正後の内容(redirectPort="443")
        <Connector port="8080" protocol="HTTP/1.1"
            connectionTimeout="20000"
            redirectPort="443" URIEncoding="UTF-8" />
  3. /opt/liferay/tomcat/conf/web.xmlファイルを開き、最後の行(</web-app>)の上に、以下の内容を書き加え、httpでのアクセスを禁止します。
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Protected Context</web-resource-name>
                <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <user-data-constraint>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint>
  4. 変更した設定を反映するため、dockerコンテナを再起動します
    $exit #dockerコンテナから抜ける
    $docker exec liferay_test_https /opt/liferay/tomcat/bin/shutdown.sh #dockerコンテナ停止
    $docker ps #コンテナ停止を確認
    $docker start liferay_test_https #dockerコンテナ再開

動作確認

ローカルからhttps://liferaytest.localhttp://liferaytest.localにアクセスし、どちらでもhttps://liferaytest.localのURLでLiferayのTOP画面が表示されることを確認します。なお、自己署名証明書はほとんどのブラウザーで信頼されないため、警告メッセージが表示される場合があります。

今回の内容は以上となります。近年では本番環境ではhttpsがほぼ必須となっております。手元で簡単にhttpsでの挙動を確認したい際などにぜひお試しください。

関連記事
install

RANKING
2021.1.08
2020.12.28
2020.12.01
2020.10.30
2020.12.18