Movable Type環境のCentOSからRocky Linuxへの移行 SSL Storeの設定: パート2
前回の記事では、Rocky Linux 9.3 のサーバセットアップ手順を説明しました。
今回の記事では、SSL Storeの証明書を設定していきます。
環境
利用環境は、さくらのクラウドを利用しています。
- さくらのクラウド
- OS: CentOS 7 → Rocky Linux 9
SSLについて
SSL Store で購入した証明書を使います。
この記事では、ドメイン認証のFUJI SSLを利用しています。
SSLストアの証明書の手順
証明書を購入手続きが完了すると、info@fujissl.jp からメールが届きます。
- SSLサーバ証明書
- 中間証明書
- 秘密鍵
秘密鍵は、CSRを作成した際に作成したファイルを利用します。
以下のCSR生成ページで作成できます。
自分の環境では以下に配置しました。
- サーバ証明書:
/etc/httpd/conf/ssl-DomainName.crt/certificate.crt
- 中間証明書:
/etc/httpd/conf/ssl-DomainName.crt/bundle.crt
- 秘密鍵:
/etc/pki/tls/private/DomainName.pk
サーバ証明書と中間証明書は、apacheのconfに配置しました。
秘密鍵は pki/tls/private に配置しました。
ドキュメントでは、/etc/pki/tls/certs
に配置することが一般的のようです。
configの配置
自動更新用のための config ファイルを配置します。
配置場所は、/var/fujissl/sslstore-client-tool-0.0.2/conf
に配置しました。
var
配下に fujissl
ディレクトリを作成して 自動更新クライアントを wget/unzipして配置しました。
自動更新のクライアントのインストール先は fujissl
というディレクトリにしています。
インストール後、 sslstore-client-tool-0.0.2/
配下に conf
ディレクトリを作成し、domaiName.conf
を配置します。
config:
appid: <契約コード(APP-XXXXXXXXXXXXXXX)>
ordid: <注文コード(ORD-XXXXXXXXXXXXXXX)>
fqdn: <コモンネーム>
document_root: <ドキュメントルート>
backup_dir: <バックアップディレクトリ>
private_key: <秘密鍵ファイル設置場所>
certificate: <証明書ファイル設置場所>
ca_bundle: <中間証明書ファイル設置場所>
Firewallの設定
Rocky Linux 9.3 では、firewalld がデフォルトでインストールされています。
firewall-cmd コマンドを使って、SSLのポートを解放します。
firewall-cmd --add-service=https --zone=public --permanent
で https のポートを解放します。
--permanent
をつけることで、再起動後も設定が有効になります。
firewall-cmd --add-service=https --zone=public --permanent
firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: cockpit dhcpv6-client http https ssh
ports: XXXX/tcp 80/tcp 443/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
firewall-cmd --reload
Apacheの設定
SSLのVirtualHostの設定方法です。
前回設定した、Apacheの設定に追記していきます。
vi /etc/httpd/conf.d/virtualhost.conf
以下の設定を行っています。
基本的には 80ポートはリダイレクトして443ポートにアクセスするようにします。
80ポートの設定にリダイレクトの処理を加えておきます。
<VirtualHost *:80>
DocumentRoot /var/www/server1/html
ServerName server1.co.jp
ScriptAlias /cgi-bin/ /var/www/server1/cgi-bin/
<Directory "/var/www/server1">
AllowOverride All
Order allow,deny
Allow from all
Options ExecCGI FollowSymLinks Includes
AddType application/x-httpd-cgi .cgi .pl
AddHandler image/gif .gif
AddHandler image/jpg .jpg
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</Directory>
ErrorLog /var/www/server1/logs/error_log
TransferLog /var/www/server1/logs/access_log
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/server2/html
ServerName server2.co.jp
ScriptAlias /cgi-bin/ /var/www/server2/cgi-bin/
<Directory "/var/www/server2">
AllowOverride All
Order allow,deny
Allow from all
Options ExecCGI FollowSymLinks Includes
AddType application/x-httpd-cgi .cgi .pl
AddHandler image/gif .gif
AddHandler image/jpg .jpg
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</Directory>
ErrorLog /var/www/server2/logs/error_log
TransferLog /var/www/server2/logs/access_log
</VirtualHost>
暗号化は、以下のリンクを参考にしました。
SSLCertificateFile / SSLCertificateKeyFile / SSLCertificateChainFileはそれぞれのパスを入力します。
<VirtualHost *:443>
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder ON
SSLCipherSuite 暗号化
SSLCertificateFile /etc/httpd/conf/ssl-DomainName/certificate.crt # サーバ証明書パス
SSLCertificateKeyFile /etc/pki/tls/private/domainName.pk # 秘密鍵パス
SSLCertificateChainFile /etc/httpd/conf/ssl-DomainName/bundle.crt # 中間証明書パス
DocumentRoot /var/www/domainName.co.jp/html
ServerName domainName.co.jp
ServerAlias www.domainName.co.jp
ScriptAlias /cgi-bin/ /var/www/domainName.co.jp/cgi-bin/
ErrorDocument 404 /404.html
AddHandler text/html .html .htm .txt .css .js .svg .jpg .png .ico .gif
<Directory "/var/www/domainName.co.jp">
AllowOverride All
Order allow,deny
Allow from all
AddType application/x-httpd-cgi .cgi .pl
Options ExecCGI FollowSymLinks Includes
</Directory>
</VirtualHost>
設定が完了したら、SSLの設定を有効にします。
Listen 443 https
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout 3600
SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
SSLStrictSNIVHostCheck off
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCipherSuite "ECDHE-ECDSA-AES128-GCM-SHA256 ECDHE-ECDSA-AES256-GCM-SHA384 ECDHE-ECDSA-AES128-SHA ECDHE-ECDSA-AES256-SHA ECDHE-ECDSA-AES128-SHA256 ECDHE-ECDSA-AES256-SHA384 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-AES128-SHA ECDHE-RSA-AES256-SHA ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES256-SHA384 DHE-RSA-AES128-GCM-SHA256 DHE-RSA-AES256-GCM-SHA384 DHE-RSA-AES128-SHA DHE-RSA-AES256-SHA DHE-RSA-AES128-SHA256 DHE-RSA-AES256-SHA256 EDH-RSA-DES-CBC3-SHA"
SSLProxyCipherSuite "ECDHE-ECDSA-AES128-GCM-SHA256 ECDHE-ECDSA-AES256-GCM-SHA384 ECDHE-ECDSA-AES128-SHA ECDHE-ECDSA-AES256-SHA ECDHE-ECDSA-AES128-SHA256 ECDHE-ECDSA-AES256-SHA384 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-AES128-SHA ECDHE-RSA-AES256-SHA ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES256-SHA384 DHE-RSA-AES128-GCM-SHA256 DHE-RSA-AES256-GCM-SHA384 DHE-RSA-AES128-SHA DHE-RSA-AES256-SHA DHE-RSA-AES128-SHA256 DHE-RSA-AES256-SHA256 EDH-RSA-DES-CBC3-SHA"
SSLHonorCipherOrder on
SSLCompression off
SSLSessionTickets off
SSLUseStapling On
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache shmcb:/run/httpd/stapling_cache(128000)
Apacheを再起動します。
systemctl restart httpd.service
自動更新の設定
自動更新は、SSLストアにあるデジポットが入金されていることが前提になります。
毎月一回 定期cronを回して、証明書の更新を行います。入金されているタイミングで証明書が30日を超えると自動的に更新されます。
cronの設定
cronの設定は、以下のようにシェルスクリプトを実行する形にしました。
var/www/ssl/update-ssl.sh に配置しました。
autorenewコマンドでドメインの認証を行います。
#!/bin/bash
log=/var/www/ssl/log/$(date '+%Y%m%d-%H%M%S').log
exec &> >(awk '{print strftime("[%Y/%m/%d %H:%M:%S] "),$0 } { fflush() } ' >> $log)
/usr/bin/php /var/fujissl/sslstore-client-tool-0.0.2/bin/sslstore-client autorenew -c www.domainName.co.jp -f /var/fujissl/sslstore-client-tool-0.0.2/conf/domainName.conf
systemctl restart httpd.servic
実行権限を与えてcrontabに登録していきます。
chmod +x /var/www/ssl/update-ssl.sh
rootユーザでcrontabを設定します。
crotab -e
以下のように設定します。
自動更新は、毎日3時に実行するようにしています。
0 3 * * * /var/www/ssl/update-ssl.sh
- ドメイン認証は1日一回のみ
- autorenew コマンドを実行
- サーバを再起動(1回目の発行するために再起動が必要)
処理の流れ
- 証明書の有効期限が30日を切ると、管理画面より証明書の更新作業を行うことができるようになります。
- デジポットで3ドメイン分の入金があることを確認すること(入金がない場合、エラーが届くため毎月3月入金額を確認すること(https://www.ssl-store.jp/system/service.php/dashbord)
- 認証には2回コマンドを呼び出す必要があります。
- 1日目の
autorenew
コマンドで 登録待ち / 審査中 / 発行中 → 発行待ちステータスになります(初回の場合は、regist
) - 2日目の
autorenew
コマンドで発行待ちから有効
ステータスにかわります
- 1日目の
更新のセットアップドキュメントを確認して作業を進めます。
参考記事
まとめ
大まかな流れを書いていきました。
すでにCentOSで設定したファイルを見直しながら書きましたが、Rocky Linux 9.3 でも同じように設定できました。
証明書や中間証明書といった必要なファイルは、以前にrsyncで移行先に送る必要があります。
サーバ移行は遠い昔にやったことがありましたが、SSL関連の移行(購入しているSSL)は、始めての経験でした。
こちらでDNSを切り替えして、Apacheの設定が反映されていれば、証明書は更新されるはずです。
Discussion