環境構築からWEBアプリ開発・スマホアプリ開発まで。ときには動画制作やゲームも。

supilog
すぴろぐ

Let’s EncryptでSSL証明書発行(CentOS7/nginx)

「Let’s Encrypt」を利用してSSL設定をしていきます。無料です。以前と違って、どのようなサイトを作る場合でも暗号化は必須なので、割とお世話になると思います。

前提

お持ちのドメインのDNS設定が完了してあるものとします。今回は、yourdomain.example.comというドメインを指定したものと仮定しましょう。

nginxの事前設定

インストール

まずSSLでない状態でアクセス可能な状態を作ります。nginxをインストールしていない場合は、インストールしましょう。

yum -y install nginx

バーチャルホスト設定

すでにバーチャルホストの設定が済んでいれば飛ばしてください。これからやる場合は、sites-availablesites-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を用いてバーチャルホストを管理しておくと、シムリンクを作成したり、外したりすることで、管理対象に入れるかどうかを選択できるので、とても便利です。ではまた。