Let’s EncryptにSSL証明書の取得の申請し、ウェブサイトをSSL化する【無料で初めてのhttps】

Let’s EncryptにSSL証明書の取得の申請をして、Apacheに導入してサイトをSSL化します。Let’s EncryptのSSL証明書は無料で利用できますので、初めてサイトのSSL化をする方は参考にしてください。

目的

最終更新日:2021/4/28

ウェブサイトをSSL化をして、「http://(独自ドメイン)」「http://(www.独自ドメイン)」でアクセスしていたサイトを「https://(独自ドメイン)」「https://(www.独自ドメイン)」でもアクセスできるようにします。

SSL化するにはSSL証明書が必要ですが、今回は認証局(CA)のLet’s EncryptにSSL証明書の取得の申請をして導入します。認証局は有料の認証局が多いですが、Let’s Encryptは無料でSSL証明書を発行してくれますし、取得方法も簡単で時間をかけずにできるというメリットがあります。
そして、Let’s Encryptから証明書の取得を申請するために、Certbotというコマンドツールを使います。

また、今回サーバはAWSのec2を使っているのですが、ELBやACMは使用せずに、1つのec2内にあるウェブサーバにSSL証明書を導入してSSL化する事を想定しています。

環境と前提

■試した環境
ec2
amazon Linux2(CentOS7系)
Apache2.4

前提として、ec2にApacheをインストール済みである事、独自ドメインも取得済みである事、DNSのAレコードも設定済みで、「http://(独自ドメイン)」と「http://(www.独自ドメイン)」にアクセスできる状態である事です。

実際にやった事(Let’s EncryptのSSL証明書の取得し、Apacheに適用してサイトをSSL化する)

まずは、epelをインストールします。

$ sudo amazon-linux-extras install epel -y    

次に、Apacheの拡張モジュールmod_sslをインストールします。

$ sudo yum -y install mod_ssl 

mod_sslをインストールした時点で、/etc/httpd/conf.d/ssl.confファイルが作成され、apacheを再起動して「https://(独自ドメイン)」にブラウザからアクセスすると、保護されていない通信という警告が出ます。

次に、Let’s EncryptからSSL証明書を発行するためのクライアントツールのcertbotをインストールします。

$ sudo yum -y install certbot

インストールしたcertbotのバージョンは1.6でした。

$ certbot --version
certbot 1.6.0

ちなみにcertbotのコマンドヘルプは-hか--helpオプションで見れます。

$ certbot -h
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  certbot [SUBCOMMAND] [options] [-d DOMAIN] [-d DOMAIN] ...
~

そして、今回の本題です。CertbotでSSL証明書等の取得の申請をします。-dオプションでSSL証明書の取得を申請するドメインを指定し、-mオプションで自分のメールアドレスを指定します。
ですので、コマンドの(独自ドメイン)、(EMAIL)はそれぞれ置き換えてください。

ちなみにLet’s EncryptはSSL証明書の有効期限が迫ってくると、メールで期限の終了が迫っている事を通知してくれますので(メールタイトル:Let's Encrypt certificate expiration notice for domain "〜")、メールアドレスはちゃんと登録した方が良いと思います。

$ sudo certbot certonly --standalone -d (独自ドメイン) -d (www.独自ドメイン) -m (EMAIL)
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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 at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for (独自ドメイン)
http-01 challenge for (www.独自ドメイン)
Cleaning up challenges
Problem binding to port 80: Could not bind to IPv4 or IPv6.
->エラー、、、

IMPORTANT NOTES:
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.

Problem binding to port 80: Could not bind to IPv4 or IPv6.というエラーが発生しました。
どうやら、Apacheは停止して申請の実行をしないとダメなようなので停止してから再度実行します。

$ sudo certbot certonly --standalone -d (独自ドメイン) -d (www.独自ドメイン) -m (EMAIL)
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for (独自ドメイン)
http-01 challenge for (www.独自ドメイン)
Waiting for verification...
Challenge failed for domain (独自ドメイン)
Challenge failed for domain (www.独自ドメイン)
http-01 challenge for (独自ドメイン)
http-01 challenge for (www.独自ドメイン)
Cleaning up challenges
Some challenges have failed.
->またエラー

IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: (独自ドメイン)
   Type:   connection
   Detail: Fetching
   http://(独自ドメイン)/.well-known/acme-challenge/ksa__Pfo0-KDNXnTeup64ziIquNrIae2Cs:
   Timeout during connect (likely firewall problem)

   Domain: (www.独自ドメイン)
   Type:   connection
   Detail: Fetching
   http://(www.独自ドメイン)/.well-known/acme-challenge/5dxypCxi81_j9XwQ2xmD8UinY_HdY:
   Timeout during connect (likely firewall problem)

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A/AAAA record(s) for that domain
   contain(s) the right IP address. Additionally, please check that
   your computer has a publicly routable IP address and that no
   firewalls are preventing the server from communicating with the
   client. If you're using the webroot plugin, you should also verify
   that you are serving files from the webroot path you provided.   

また、エラーが発生しました。ec2のウェブサーバに外部からhttp/httpsアクセスできるようにしていなかったので、セキュリティグループのインバウンド設定でhttpとhttpsの0.0.0.0/0を追加して、再度実行します。

$ sudo certbot certonly --standalone -d (独自ドメイン) -d (www.独自ドメイン) -m (EMAIL)
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for (独自ドメイン)
http-01 challenge for (www.独自ドメイン)
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/(独自ドメイン)/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/(独自ドメイン)/privkey.pem
   Your cert will expire on 2020-10-28. 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

今度はエラーメッセージもなく、Congratulations!と出力されているのでうまくいったようです。
SSL証明書や秘密鍵などが作成されています。fullchain.pemがSSLサーバ証明書と中間証明書が結合されたファイルで、privkey.pemが秘密鍵のようです。
シンボリックリンクです。

$ sudo ls -lt  /etc/letsencrypt/live/(独自ドメイン)/
合計 4
-rw-r--r-- 1 root root 692  7月 30 10:03 README
lrwxrwxrwx 1 root root  34  7月 30 10:03 cert.pem -> ../../archive/(独自ドメイン)/cert1.pem
lrwxrwxrwx 1 root root  35  7月 30 10:03 chain.pem -> ../../archive/(独自ドメイン)/chain1.pem
lrwxrwxrwx 1 root root  39  7月 30 10:03 fullchain.pem -> ../../archive/(独自ドメイン)/fullchain1.pem
lrwxrwxrwx 1 root root  37  7月 30 10:03 privkey.pem -> ../../archive/(独自ドメイン)/privkey1.pem

そしてSSL証明書や秘密鍵の実体です。

$ sudo ls -lt /etc/letsencrypt/archive/(独自ドメイン)/
合計 16
-rw-r--r-- 1 root root 1919  7月 30 10:03 cert1.pem
-rw-r--r-- 1 root root 1647  7月 30 10:03 chain1.pem
-rw-r--r-- 1 root root 3566  7月 30 10:03 fullchain1.pem
-rw------- 1 root root 1704  7月 30 10:03 privkey1.pem

次に、取得したSSLサーバ証明書や秘密鍵をApacheに適用します。
そのために、/etc/httpd/conf.d/ssl.confファイルを編集します。 編集箇所はSSLCertificateFileとSSLCertificateKeyFileの2箇所です。
SSLCertificateFileはfullchain.pemファイルのパス、SSLCertificateKeyFileはprivkey.pemファイルのパスを指定します。

#SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateFile /etc/letsencrypt/live/(独自ドメイン)/fullchain.pem

#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
SSLCertificateKeyFile /etc/letsencrypt/live/(独自ドメイン)/privkey.pem

これで設定は完了しましたので、Apacheを起動します。
ブラウザから「https://(独自ドメイン)」にアクセスできるようになります。 また、urlの左にある鍵アイコンを押して証明書を見ると、発行元が“Let’s Encrypt Authority X3”のSSL証明書を見ることができます。

・2020/12/17追記
Let’s EncryptのSSL証明書の発行元表記が"Let's Encrypt Authority X3"から"R3"に変更されたようです。
Let’s EncryptのSSL証明書の発行元表記が'R3'に変更される

ちなみにcertbotコマンドでメールアドレスを指定したけど、返信とかは特にありませんでした。SSL証明書の有効期限が迫ってくると、アラートメールを送ってきてくれるようです。

最後に、そしてLet’s EncryptのSSL証明書の有効期限の終了に備えての更新方法(手動とcronによる自動)

最初はSSL証明書の導入についてネットで調べたり、Let's EncryptやCertbotのサイトを見たりして時間がかかりましたが、実際にやってみるとSSL証明書の取得と導入の設定でやった事は少しでとても簡単でした。慣れれば5分あればできそうです。
Let's Encrypt以外でSSL証明書を取得する場合、まずCSRと秘密鍵を自分で作成し、それからSSL証明書の申請を申し込み、認証や審査を受けるという流れになると思うので、Let's Encryptと比較すると手間と時間がかかります。Let's EncryptならSSL証明書と秘密鍵の作成がCertbotコマンド1つでできたので、やはり便利です。

あと、今回Let's EncryptのSSL証明書を初めて取得しましたが、Let’s EncryptのSSL証明書は有効期限は3ヶ月ですので、最低でも3ヶ月に1度はSSL証明書を更新する必要があります。

ですので別ページで、Let’s EncryptのSSL証明書の更新方法を書いています。コマンドラインで実行する手動での更新と、cronを使った自動更新の2つです。
Let’s EncryptのSSL証明書を更新する(手動と自動更新)