Let’s EncryptでSSL証明書発行(CentOS7/nginx)
「Let’s Encrypt」を利用してSSL設定をしていきます。無料です。以前と違って、どのようなサイトを作る場合でも暗号化は必須なので、割とお世話になると思います。
前提
お持ちのドメインのDNS設定が完了してあるものとします。今回は、yourdomain.example.comというドメインを指定したものと仮定しましょう。
nginxの事前設定
インストール
まずSSLでない状態でアクセス可能な状態を作ります。nginxをインストールしていない場合は、インストールしましょう。
yum -y install nginx
バーチャルホスト設定
すでにバーチャルホストの設定が済んでいれば飛ばしてください。これからやる場合は、sites-availableとsites-enabledを用いて以下のように作成してみましょう。
# sites-available, sites-enabledディレクトリ作成
mkdir /etc/nginx/sites-available
mkdir /etc/nginx/sites-enabled
# sites-availableには設定ファイルを配置
vi /etc/nginx/sites-available/ssl
---------------------
#=======================================
# for only ssl
#---------------------------------------
server {
listen 80;
server_name yourdomain.example.com;
root /usr/local/nginx/vhosts/yourdomain.example.com/htdocs;
}
---------------------
vi /etc/nginx/sites-available/yourdomain.example.com
※簡易的な設定になっています。
---------------------
#=======================================
# yourdomain.example.com
#---------------------------------------
server {
listen 80;
server_name yourdomain.example.com;
return 301 https://yourdomain.example.com$request_uri;
}
server {
listen 443 ssl http2;
server_name yourdomain.example.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.example.com/privkey.pem;
access_log /usr/local/nginx/vhosts/yourdomain.example.com/logs/ssl_access.log main;
error_log /usr/local/nginx/vhosts/yourdomain.example.com/logs/ssl_error.log warn;
root /usr/local/nginx/vhosts/yourdomain.example.com/htdocs;
index index.php index.html index.htm;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
}
---------------------
# シムリンク作成
cd /etc/nginx/sites-enabled
ln -s /etc/nginx/sites-available/ssl ./yourdomain.example.com
# /etc/nginx/nginx.conf
以下の1行を追加しておきます。
---------------------
include /etc/nginx/sites-enabled/*;
---------------------
# 再起動
systemctl restart nginx
Let’s encryptの作業です
いよいよ証明書の作業に入ります。
certbotインストール
yum -y install certbot
証明書の取得
certbot certonly --webroot -w ドキュメントルート -d ドメイン名
「ドキュメントルート」と「ドメイン名」は書き換えて実行してください。今回の例ですと、以下のような感じです。
certbot certonly --webroot -w /usr/local/apache/vhosts/yourdomain.example.com/htdocs -d yourdomain.example.com
【初回のみ】Emailや規約の同意
コマンドを実行すると、初回のみEmailアドレスの入力や規約の同意が求められます。確認していきます。
↓初回はEmailアドレスを聞かれます。ご自身のメールアドレスを入力しましょう。証明書の期限が近づいた時に、連絡をもらえたりします。
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel):
↓サービス規約読んで、同意してねと言われます。「Y」で次に行きましょう。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o:
↓こちらは、ニュースやキャンペーン情報を送りたいんだけど、メールアドレスを共有してもいいか。と聞かれているので、お好みで答えます。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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:
↓Congratulationsの表示が出たら、無事に取得完了です。
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/yourdomain.example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/yourdomain.example.com/privkey.pem
Your certificate will expire on 2021-05-22. To obtain a new or
tweaked version of this certificate in the future, simply run
certbot again. To non-interactively renew *all* of your
certificates, run "certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
取得できた証明書は、以下に配置されています。確認してみてください。
ls -la /etc/letsencrypt/live/yourdomain.example.com/
--------------------
-rw-r--r-- 1 root root 692 Feb 22 06:46 README
lrwxrwxrwx 1 root root 46 Feb 22 06:46 cert.pem -> ../../archive/yourdomain.example.com/cert1.pem
lrwxrwxrwx 1 root root 47 Feb 22 06:46 chain.pem -> ../../archive/yourdomain.example.com/chain1.pem
lrwxrwxrwx 1 root root 51 Feb 22 06:46 fullchain.pem -> ../../archive/yourdomain.example.com/fullchain1.pem
lrwxrwxrwx 1 root root 49 Feb 22 06:46 privkey.pem -> ../../archive/yourdomain.example.com/privkey1.pem
--------------------
nginxのシムリンクはりかえ
証明書が取得できたので、SSL用の設定ファイルに切り替えます。
# シムリンクはりかえ
cd /etc/nginx/sites-enabled
unlink ./yourdomain.example.com
ln -s /etc/nginx/sites-available/yourdomain.example.com ./yourdomain.example.com
# 再起動
systemctl restart nginx
ブラウザ確認
ブラウザより、お持ちのドメインにてアクセスしてみてください。設定が間違っていなければ、SSLアクセスが出来ているはずです。(ブラウザのアドレス欄に、鍵マークが付きます)
さいごに
SSL設定とは直接は関係ありませんが、sites-availableとsites-enabledを用いてバーチャルホストを管理しておくと、シムリンクを作成したり、外したりすることで、管理対象に入れるかどうかを選択できるので、とても便利です。ではまた。