「SAVACAN」担当のMKです。
今回はLet’s Encryptでの無料SSL証明書の取得と自動更新について紹介します。
私がスペース・アイに入社した当時はhttpで運用しているWEBサイトがほとんどでしたが、今ではWEBサイトへのSSL導入はほぼ必須となっています。
有償のSSL証明書を購入すると費用がかかりますし、更新の度に手動で作業するのも手間ですよね。
そんな場合は、無料のSSL証明書を導入して更新も自動化してしまおう!
本記事の内容は、WEBサーバーの設定ができる方、SSL証明書を理解し、導入出来る方に向けた内容となっております。
Let’s Encryptとはどのような認証局か
初めにLet’s Encryptが何なのかからご説明します。
公式サイトにアクセスしてみると[フリーで自動化されたオープンな認証局です]と記載されています。
記載内容の通りで無償で更新まで自動化された誰でも利用できる認証局です!
主要スポンサーを見るとそうそうたる企業が名を連ねており、怪しいサービスではない事が見て取れます。
その他の特徴として以下のようなものがあります。
- 無料で利用可能
- 自動更新に対応
- 世界最大の認証局
- 4億を超えるウェブサイトで使用されている
- 証明書の有効期間は90日
- 完全自動化のためドメイン認証(DV)証明書のみ発行
- 企業認証(OV証明書)やEV証明書は提供していない
また、よくレンタルサーバーで無料SSL証明書が提供されていますが、ほぼLet’s Encryptが利用されています。
採用する際の注意点として、Let’s Encryptは全てのwebサイトの通信を暗号化する事を目的としたプロジェクトであり、その特徴からサイト提供者の身元信頼は必要最低限なものとなります。
提供者の信頼性確保まで求める場合は、OV証明書やEV証明書を検討した方が良いでしょう。
導入がとっても簡単で自動更新が可能、導入実績も十分!ということで手順の紹介です。
ここで紹介する手順は以下の環境での動作を確認しております。
Almalinux8.10
Apache/2.4.37
nginx/1.14.1
※前提としてSSL証明書を作成するドメインのDNS登録とWEBサーバーの設定が完了しているものとします。
パッケージインストール
Let’s EncryptはCertbotというツールに対応しており、これを使ってSSL証明書の発行と更新を行います。
初めにLet’s Encryptの証明書作成に必要なパッケージをインストールします。
・Apacheの場合
dnf -y install openssl openssl-devel httpd-devel certbot python3-certbot-apache
・Nginxの場合
dnf -y install openssl openssl-devel httpd-devel certbot python3-certbot-apache
openssl dhparam -out /etc/nginx/dhparam.pem 2048
次に証明書取得時のVirtualHostを設定します。
以下に紹介する記述はSSL証明書のファイル認証をするための最低限の記述になります。
・Apacheの場合
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName <YOUR_DOMAIN>
ErrorLog logs/error_log
CustomLog logs/access_log combined
</VirtualHost>
・Nginxの場合
server {
listen 80;
server_name <YOUR_DOMAIN>;
location / {
root /usr/share/nginx/html/;
}
}
設定が完了したらWEBサーバーを再起動して反映します。
Let’s Encryptは証明書の取得をするときに申請者がドメイン管理者か確認するために以下のURLにアクセスしファイル認証を行いますので、次の手順に進む前にWEBサーバーのルートディレクトリの下に[.well-known]というディレクトリを作成しておきます。
http://<YOUR_DOMAIN>/.well-known/acme-challenge/
ファイル認証での証明書取得
では証明書を作成します。
作成前に –dry-run のオプションを付けてテストします。
certbot certonly --webroot -w /var/www/html -d <YOUR_DOMAIN> -m <YOUR_MAIL ADDRESS> -t --agree-tos --dry-run
テスト結果に問題がなければ作成します。
・サブドメインやwwwなしのみで作成する場合は以下のコマンドで作成をします。
certbot certonly --webroot -w /var/www/html -d <YOUR_DOMAIN> -m <YOUR_MAIL ADDRESS> -t --agree-tos
・wwwなし、wwwあり両方の証明書を発行する場合は以下のコマンドで作成をします
certbot certonly --webroot -w /var/www/html -d <YOUR_DOMAIN> -d www.<YOUR_DOMAIN> -m <YOUR_MAIL ADDRESS> -t --agree-tos
証明書を発行するコマンドで入力するメールアドレスは有効期限が近づいたときのお知らせメールを受信しますので必ず有効なメールアドレスを入力してください。
実行すると対話式でメーリングリスト登録を聞かれますが必要がなければN(No)を入力します。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N
Account registered.
これだけで正規のSSL証明書が即時発行されます。超便利です。
証明書は以下のディレクトリに作成されますのでWEBサーバーの設定前に確認しておきましょう。
ls /etc/letsencrypt/live/<YOUR_DOMAIN>/
README cert.pem chain.pem fullchain.pem privkey.pem
ワイルドカード証明書取得
WEBサーバーへのSSL証明書設定の前にワイルドカード証明書の作成方法についても紹介しておきます。
ワイルドカード証明書の作成ではファイル認証ができないためDNS認証をする必要があります。
以下のコマンドを実行します。
certbot certonly --manual --server https://acme-v02.api.letsencrypt.org/directory --preferred-challenges dns -d *.<YOUR_DOMAIN> -m <YOUR_MAIL ADDRESS> -t --agree-tos --manual-public-ip-logging-ok
実行するとDNS認証用の以下のメッセージが出ます。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name:
_acme-challenge.<YOUR_DOMAIN>.
with the following value:
[ここにDNSに設定するTXTレコードが表示されます]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
この画面で Enter を押下する前に <YOUR_DOMAIN> を管理するDNSで
[_acme-challenge]というサブドメインを追加しTXTレコードに [コマンド実行時に表示されたレコード] を設定します。
DNS設定後にサーバーから以下のコマンドを実行して設定反映が確認できてから Enter を押下して証明書を作成します。
dig _acme-challenge.<YOUR_DOMAIN> TXT
ここまでの手順でワイルドカード証明書が作成されますが、証明書を更新する際も毎回DNSに[_acme-challenge]のTXTレコードを登録してDNS認証を通す必要がありますのでこのままでは自動更新できません。
自動更新を行うには、毎回発行されるTXTレコードをDNSへ登録、更新を行うためのプログラムを組む必要があります。
DNS側がプログラム連携に対応している事が必須となるため、環境によっては自動更新を行うことが難しい場合があります。
WEBサーバーへのSSL証明書設定
有償のSSL証明書と同じでVirtualHost内にSSL証明書ファイルの設置場所を記載するだけです。
・Apacheの場合(ssl.conf)
SSLCertificateFile /etc/letsencrypt/live/<YOUR_DOMAIN>/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/<YOUR_DOMAIN>/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/<YOUR_DOMAIN>/chain.pem
SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
・Nginxの場合(nginx.conf)
ssl_certificate /etc/letsencrypt/live/<YOUR_DOMAIN>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<YOUR_DOMAIN>/privkey.pem;
ssl_dhparam /etc/nginx/dhparam.pem;
WEBサーバーを再起動して設定を反映したら完了です!
ブラウザからSSL証明書を設定したドメインにアクセスしてLet’s EncryptのSSL証明書が使われていることを確認してみましょう。
ブラウザの証明書ビューアからLet’s Encryptが使われていることが確認できたら成功です!
自動更新を実施する
最後に自動更新を実施する方法についてご紹介します。
Almalinux8では証明書の自動更新がタイマーで実行されていますので手動で自動更新を設定する必要はありません。
運用に合わせて使い分けます。
下記コマンドにて停止と無効化ができます。
systemctl disable certbot-renew.timer
systemctl stop certbot-renew.timer
下記コマンドでタイマー登録から消えたか確認します。
systemctl list-timers
手動で自動更新を設定する場合、以下のコマンドをcronに登録するだけです。
/bin/certbot renew
証明書は有効期限まで30日未満になると更新されます。
参考例として以下の記述内容のcronを登録すると毎日AM 3:05に更新が実行され有効期限まで30日未満であれば更新されます。
5 3 * * * /bin/certbot renew &> /dev/null
以上で全ての手順が完了になります!
Let’s Encryptは無料で即時取得可能なため、開発環境やテスト用に手軽に導入出来てとても便利です。
個人サイトはもちろんの事、最近では企業サービスサイトでも採用が増えており常時SSL通信が広まってきました。
SSL証明書導入をご検討の際には、候補の1つとしてみても良いかと思います。