WordPressを自前証明書でSSL化した記録

自前サーバーでWordPressのサイトを自前証明書を使ってSSL化した記録

動機

  • 『SSLを始めよう』でドメインも証明書も買ったけど、実質1か月ぐらいしか使わなかった
  • nginxのサイトも空っぽだし、、、なんかもったいない
    WordPress入れたらそれっぽくなるのでは
  • WordPressをSSL化する方法を調べたら以下の方法ばかりだった
    • Really Simple SSLプラグイン使う
    • レンタルサーバー側の設定をする 
    • 設定画面でhttpsにするだけ(?)

→ 自前サーバー(※1)で自前の証明書(※2)を使ってSSL化する方法がまとまっているのがなかった

※1:今回使用するのは、OracleCloudInfrastructure(OCI)のコンピュートインスタンス。ここでいう自前サーバーはレンタルサーバーではないという意。
※2:プラグインやらなんやらではなく、別で用意した証明書の意。

SSLをはじめよう ~「なんとなく」から「ちゃんとわかる!」へ~:mochikoAsTech
技術書典の会期以外の期間は、紙の本はBOOTHにて購入できます。---136ページ / B5サイズ / 電子版はPDF(フルカラー) / 紙の本は表紙カラー、本文モノクロSSLをはじめよう~「なんとなく」から「ちゃんとわかる!」へ~「DNS...

事前準備(準備してあったもの)

せっかくだから気軽に作っては壊ししたかったため、Dockerインストール済み

ドメイン(『SSLをはじめよう』を参考)
OCIのコンピュートインスタンスイメージ : Oracle-Linux-7.9-2022.01.24-0
シェイプ : VM.Standard.E2.1.Micro
(『SSLをはじめよう』を参考)
サーバー証明書FujiSSLで発行 有効期限1年
(『SSLをはじめよう』を参考)
上記インスタンスの任意のフォルダ(ここではsslフォルダ)に格納しておく
DockerCentOs7 最新版のdockerをインストールするを参考にインストール
Docker Compose(V2)Docker公式を参考にインストール

本題

WordPressコンテナの立ち上げ

クィックスタート: Compose と WordPressを参考にして2.まで実施する

3.のdocker-compose.ymlは、ポートが”8000:80″になっているので、HTTP通信とHTTPS通信用ポートを開けるように変更する

-       - "8000:80"
+       - "80:80"   # HTTPリダイレクト用(リダイレクトさせないなら不要)
+       - "443:443" # HTTPS通信用

docker-compose.ymlは次のようになる

version: '3'

services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    ports:
      - "80:80"
      - "443:443"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
volumes:
  db_data:

コンテナを起動する(※3)

※3:上記リンクでは”docker-compose up -d”となっているが、docker Compose V2をインストールしたので”docker compose up -d”としている

sudo docker compose up -d

証明書のコピー

コンテナ内で作業するため、コンテナIDを記録しておく

docker ps

/etc/apache2/conf/sslに証明書ファイルを置くことにしたので、フォルダを作成してコピー
コマンド中の<コンテナID>は上記で記録したコンテナID(※4)にする

※4:コンテナIDは一意になれば、そこまで指定すれば以降は省略可能。便利

docker exec -it <コンテナID> mkdir /etc/apache2/conf/
docker cp ssl <コンテナID>:/etc/apache2/conf/
[opc@docker my_wordpress]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0a08a7bb4206 wordpress:latest "docker-entrypoint.s…" 22 seconds ago Up 11 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp my_wordpress-wordpress-1
c6f6258e25c6 mysql:5.7 "docker-entrypoint.s…" 23 seconds ago Up 19 seconds 3306/tcp, 33060/tcp my_wordpress-db-1
[opc@docker my_wordpress]$ docker exec -it 0a mkdir /etc/apache2/conf/
[opc@docker my_wordpress]$ docker cp ssl 0a:/etc/apache2/conf/

SSL有効化と設定ファイルの編集

初期状態だとエディタ(※5)も入ってないので、入れておく

※5:使用するエディタはお好みで。今回はvimを入れた

docker exec -it <コンテナID> bash
apt update
apt install vim

設定ファイルを作成し、編集する

a2ensite default-ssl
vim /etc/apache2/sites-enabled/default-ssl.conf

ServerNameを追記し、SSLCertificateFileとSSLCertificateKeyFileにコピーした証明書を設定する

  ServerAdmin webmaster@localhost
+ ServerName example.net
  DocumentRoot /var/www/html
- SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
- SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
+ SSLCertificateFile    /etc/apache2/conf/ssl/startssl.crt
+ SSLCertificateKeyFile /etc/apache2/conf/ssl/startssl.key

SSLを有効化する

a2enmod ssl
root@0a08a7bb4206:/var/www/html# a2ensite default-ssl
Enabling site default-ssl.
To activate the new configuration, you need to run:
service apache2 reload
root@0a08a7bb4206:/var/www/html# vim /etc/apache2/sites-enabled/default-ssl.conf
root@0a08a7bb4206:/var/www/html# a2enmod ssl
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Enabling module socache_shmcb.
Enabling module ssl.
See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.
To activate the new configuration, you need to run:
service apache2 restart

設定ファイルの確認と再起動

設定にエラーがないか確認する

apache2ctl configtest
root@0a08a7bb4206:/var/www/html# apache2ctl configtest
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.31.0.3. Set the 'ServerName' directive globally to suppress this message
Syntax OK

画像のようにSyntax OKが表示されれば設定完了。a2enmodしたときに、apacheの再起動が必要と言われているので(service apache2 restart)、再起動する。

service apache2 restart

再起動できたら取得したドメインを指定してアクセス。WordPress画面が出てきて鍵マークが出てれば完了

使用したコマンド一覧

sudo docker compose up -d
docker ps
docker exec -it <コンテナID> mkdir /etc/apache2/conf/
docker cp ssl <コンテナID>:/etc/apache2/conf/
docker exec -it <コンテナID> bash
apt update
apt install vim
a2ensite default-ssl
vim /etc/apache2/sites-enabled/default-ssl.conf
a2enmod ssl
apache2ctl configtest
service apache2 restart

コメント

タイトルとURLをコピーしました