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

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

※ 本ページはプロモーションが含まれています。

本ページの目的

最終更新日:2023/4/20

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

SSL化するにはSSL証明書が必要ですが、本ページでは認証局(CA)のLet’s EncryptにSSL証明書の取得の申請をして導入する方法について説明します。

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

環境と前提

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

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

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

certbotのインストールと、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証明書の有効期限は3ヶ月間で有効期限が迫ってくると、メールで期限の終了が迫っている事を通知してくれますので(メールタイトル: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.というエラーが発生しました。

(広告)アマゾンでITネットワーク関連の本を探す!

どうやら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!と出力されているので成功しました!

成功すると、「/etc/letsencrypt/live/(独自ドメイン)」ディレクトリにSSL証明書や秘密鍵などが作成されます。
fullchain.pemがSSLサーバ証明書と中間証明書が結合されたファイルで、privkey.pemが秘密鍵のようです。
(「/etc/letsencrypt/live/(独自ドメイン)」ディレクトリに生成されたファイル群はシンボリックリンクです。)

$ 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証明書や秘密鍵の実体は、/etc/letsencrypt/archive/(独自ドメイン)ディレクトリにあります。

$ 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

certbotでLet’s EncryptのSSL証明書の申請(取得)処理をする度に、実体ファイル名に付いているの数字番号は1,2,3,4…と増えていきます。

次に、取得した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'に変更される

ブラウザでLet’s EncryptのSSL証明書を確認した場合、発行元の発行者名の通称や一般名(CN)の表記が"R3"、発行元の組織はLet's Encryptとなっていると思います。

ちなみにcertbotコマンドでメールアドレスを指定したけど、Let’s EncryptのSSL証明書の取得時にはメールでのお知らせなどは特にありませんでした。(けど上でも書きましたが、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証明書を更新して期限を延長する必要があります。

ただ、3ヶ月に1度だけ更新処理が必要と言われても覚えていられないですし、いちいち有効期限を気にするのも手前なので、当然Let’s EncryptのSSL証明書の更新・延長処理を自動化して放置できるようにしておきたいところです。

ですので別ページで、Let’s EncryptのSSL証明書の更新方法について説明しています。コマンドラインで実行する手動での更新と、cronを使った自動更新の方法についてです。よければ参考にしてください。
Let’s EncryptのSSL証明書を更新する(手動と自動更新)

「http://〜」から「https://〜」 へのリダイレクト(転送)設定

Let’s EncryptのSSL証明書の取得と導入設定の方法についてはこれで終了です。これで、元々アクセスできるURLが「http://(独自ドメイン)」「http://www.(独自ドメイン)」だった場合、「https://(独自ドメイン)」「https://www.(独自ドメイン)」にもちゃんとアクセスできるようになりました。

あと、これはWebサイトの運用方針にもよると思いますが、WebサイトのURLがhttpとhttpsのどちらでもアクセスできる状態から、httpsだけアクセスできるようにしたいと考えるのが一般的かと思います。

その場合、httpにアクセスされたらhttpsへリダイレクト(転送)する、または、httpへのアクセスは拒否するなどの設定が必要です。

もしくは、「http://(独自ドメイン)/~」「http://www.(独自ドメイン)/~」「https://(独自ドメイン)/~」にアクセスされたら全部「https://www.(独自ドメイン)/~」へリダイレクトするとか。

リダイレクト設定については一概には言えないのでここでは細かい説明はしませんが、Apacheなら設定ファイルのhttpd.confやssl.confのVirtualHostタグ内で設定できると思います(RewriteEngineのリライト機能を使う)。

ネットで「Apache リダイレクト 設定 httpからhttps」みたいなキーワードで調べれば、設定方法について詳しく説明している情報が見つかると思います。