このセクションでは、Let’s Encrypt の SSL証明書を使ったWebサイトのSSL化について紹介していきます。

今回作業は、OS が AlmaLinux で Webサービスが Nginx 、OpenSSL が既にインストールされている環境で実施しています。OpenSSL がインストールされていない場合には、別途インストールが必要となります。

必要なパッケージのインストール

EPEL レポジトリ をインストールします。

[user@pub-web ~]$ sudo dnf install epel-release
Last metadata expiration check: 2:41:44 ago on Mon Aug 14 07:38:59 2023.
Dependencies resolved.
================================================================================
 Package               Architecture    Version            Repository       Size
================================================================================
Installing:
 epel-release          noarch          9-2.el9            extras           17 k

Transaction Summary
================================================================================
Install  1 Package

Total download size: 17 k
Installed size: 23 k
Is this ok [y/N]: y
ーー(省略)ーー
Installed:
  epel-release-9-2.el9.noarch                                                   

Complete!
[user@pub-web ~]$ 

必要なパッケージをインストールします。 ここでは、Let’s Encrypt で SSL証明書を取得するのに必要なクライアントソフト certbot をインストールします。

[user@pub-web ~]$ sudo dnf install certbot python3-certbot-nginx
Extra Packages for Enterprise Linux 9 - x86_64  5.5 MB/s |  18 MB     00:03    
Last metadata expiration check: 0:00:05 ago on Mon Aug 14 10:21:32 2023.
Dependencies resolved.
================================================================================
 Package                    Arch       Version              Repository     Size
================================================================================
Installing:
 certbot                    noarch     2.6.0-1.el9          epel           18 k
 python3-certbot-nginx      noarch     2.6.0-1.el9          epel          156 k
Installing dependencies:
 fontawesome-fonts          noarch     1:4.7.0-13.el9       appstream     204 k
 fonts-filesystem           noarch     1:2.0.5-7.el9.1      baseos        9.0 k
 python3-acme               noarch     2.6.0-1.el9          epel          160 k
 python3-certbot            noarch     2.6.0-1.el9          epel          644 k
 python3-cffi               x86_64     1.14.5-5.el9         baseos        241 k
 python3-chardet            noarch     4.0.0-5.el9          baseos        209 k
 python3-configargparse     noarch     1.5.3-1.el9          epel           39 k
 python3-configobj          noarch     5.0.6-25.el9         appstream      62 k
 python3-cryptography       x86_64     36.0.1-2.el9         baseos        1.1 M
 python3-distro             noarch     1.5.0-7.el9          appstream      36 k
 python3-idna               noarch     2.10-7.el9           baseos         92 k
 python3-josepy             noarch     1.13.0-1.el9         epel           60 k
 python3-parsedatetime      noarch     2.6-5.el9            epel           79 k
 python3-ply                noarch     3.11-14.el9          baseos        103 k
 python3-pyOpenSSL          noarch     21.0.0-1.el9         epel           90 k
 python3-pycparser          noarch     2.20-6.el9           baseos        124 k
 python3-pyparsing          noarch     2.4.7-9.el9          baseos        149 k
 python3-pyrfc3339          noarch     1.1-11.el9           epel           18 k
 python3-pysocks            noarch     1.7.1-12.el9         baseos         34 k
 python3-pytz               noarch     2021.1-4.el9         appstream      48 k
 python3-requests           noarch     2.25.1-7.el9_2       baseos        113 k
 python3-setuptools         noarch     53.0.0-12.el9        baseos        839 k
 python3-urllib3            noarch     1.26.5-3.el9         baseos        188 k
Installing weak dependencies:
 python-josepy-doc          noarch     1.13.0-1.el9         epel           19 k

Transaction Summary
================================================================================
Install  26 Packages

Total download size: 4.8 M
Installed size: 21 M
Is this ok [y/N]: y
ーー(省略)ーー

Installed:
  certbot-2.6.0-1.el9.noarch                                                    
  fontawesome-fonts-1:4.7.0-13.el9.noarch                                       
  fonts-filesystem-1:2.0.5-7.el9.1.noarch                                       
  python-josepy-doc-1.13.0-1.el9.noarch                                         
  python3-acme-2.6.0-1.el9.noarch                                               
  python3-certbot-2.6.0-1.el9.noarch                                            
  python3-certbot-nginx-2.6.0-1.el9.noarch                                      
  python3-cffi-1.14.5-5.el9.x86_64                                              
  python3-chardet-4.0.0-5.el9.noarch                                            
  python3-configargparse-1.5.3-1.el9.noarch                                     
  python3-configobj-5.0.6-25.el9.noarch                                         
  python3-cryptography-36.0.1-2.el9.x86_64                                      
  python3-distro-1.5.0-7.el9.noarch                                             
  python3-idna-2.10-7.el9.noarch                                                
  python3-josepy-1.13.0-1.el9.noarch                                            
  python3-parsedatetime-2.6-5.el9.noarch                                        
  python3-ply-3.11-14.el9.noarch                                                
  python3-pyOpenSSL-21.0.0-1.el9.noarch                                         
  python3-pycparser-2.20-6.el9.noarch                                           
  python3-pyparsing-2.4.7-9.el9.noarch                                          
  python3-pyrfc3339-1.1-11.el9.noarch                                           
  python3-pysocks-1.7.1-12.el9.noarch                                           
  python3-pytz-2021.1-4.el9.noarch                                              
  python3-requests-2.25.1-7.el9_2.noarch                                        
  python3-setuptools-53.0.0-12.el9.noarch                                       
  python3-urllib3-1.26.5-3.el9.noarch                                           

Complete!
[user@pub-web ~]$ 

SSL証明書の発行

certbot を使って、Let’s Encrypt で SSL証明書を発行していきます。まず最初に、自身のメールアドレスの入力を求められるので、メールアドレスを入力します。

[user@pub-web ~]$ sudo certbot --nginx
Saving debug log to /var/log/letsencrypt/letsencrypt.log

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: Y

Let’s Encryptパートナーにメールアドレスを公開していいか聞かれるので、N とします(公開しても良ければ、Y)。

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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

証明書を発行したいドメイン名が聞かれるので、自身のドメイン名を入力します。
正常であれば、ここで SSL証明書が自動的に発行されます。

Please enter the domain name(s) you would like on your certificate (comma and/or
space separated) (Enter 'c' to cancel): 証明書を発行したい自身のドメイン名を入力

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/(自身ドメイン名)/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/(自身ドメイン名)/privkey.pem

These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for (自身ドメイン名) to /etc/nginx/conf.d/default.conf
Congratulations! You have successfully enabled HTTPS on https://(自身ドメイン名)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
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
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

以下は、Let’s Encrypt の実行環境です。Let’s Encrypt で発行されるSSL証明書などは このディレクトリ配下に作成されます。

options-ssl-nginx.conf は Nginx の SSLに関連する設定ファイルです。
ssl-dhparams.pem は Diffie-Helmanの鍵交換アルゴリズムで使われる素数を格納しているファイルです。
発行された SSL証明書に必要な実ファイルは archive ディレクトリに保存され、これまで発行されたSSL証明書の中で、最新のSSL証明書へのシンボリックリンクが live ディレクトリで作成されています。

[user@pub-web ~]$ sudo ls -la /etc/letsencrypt/
drwxr-xr-x.  7 root root 4096 Aug 20 02:42 .
drwxr-xr-x. 84 root root 8192 Aug 20 01:30 ..
-rw-r--r--.  1 root root   64 Aug 14 10:23 .updated-options-ssl-nginx-conf-digest.txt
-rw-r--r--.  1 root root   64 Aug 14 10:23 .updated-ssl-dhparams-pem-digest.txt
drwx------.  4 root root   86 Aug 14 10:41 accounts
drwx------.  3 root root   29 Aug 20 02:42 archive
-rw-r--r--.  1 root root  152 May 22 13:45 cli.ini
drwx------.  3 root root   43 Aug 20 02:42 live
-rw-r--r--.  1 root root  774 Aug 14 10:23 options-ssl-nginx.conf
drwxr-xr-x.  2 root root   34 Aug 20 02:42 renewal
drwxr-xr-x.  5 root root   43 Aug 14 10:23 renewal-hooks
-rw-r--r--.  1 root root  424 Aug 14 10:23 ssl-dhparams.pem
[user@pub-web ~]$ 

以下は、archive ディレクトリ内です。ここに実ファイルが格納されています。

[user@pub-web ~]$ sudo ls -la /etc/letsencrypt/archive/(証明書を発行したドメイン名)
total 20
drwxr-xr-x. 2 root root   83 Aug 20 02:42 .
drwx------. 3 root root   29 Aug 20 02:42 ..
-rw-r--r--. 1 root root 1493 Aug 20 02:42 cert1.pem
-rw-r--r--. 1 root root 3749 Aug 20 02:42 chain1.pem
-rw-r--r--. 1 root root 5242 Aug 20 02:42 fullchain1.pem
-rw-------. 1 root root  241 Aug 20 02:42 privkey1.pem
[user@pub-web ~]$ 

以下は、live ディレクトリ内です。ここに最新のSSL証明書へのシンボリックリンクが作成されています。証明書が更新される中で常に最新のSSL証明書を参照するように、Nginx では live ディレクトリのシンボリックリンクを参照する設定をします。

[user@pub-web ~]$ sudo ls -la /etc/letsencrypt/live/(証明書を発行したドメイン名)
total 4
drwxr-xr-x. 2 root root  93 Aug 20 02:42 .
drwx------. 3 root root  43 Aug 20 02:42 ..
-rw-r--r--. 1 root root 692 Aug 20 02:42 README
lrwxrwxrwx. 1 root root  39 Aug 20 02:42 cert.pem -> ../../archive/dorabenri.f5.si/cert1.pem
lrwxrwxrwx. 1 root root  40 Aug 20 02:42 chain.pem -> ../../archive/dorabenri.f5.si/chain1.pem
lrwxrwxrwx. 1 root root  44 Aug 20 02:42 fullchain.pem -> ../../archive/dorabenri.f5.si/fullchain1.pem
lrwxrwxrwx. 1 root root  42 Aug 20 02:42 privkey.pem -> ../../archive/dorabenri.f5.si/privkey1.pem
[user@pub-web ~]$ 

NginxでのSSL設定

server ディレクティブ で SSL に関わる設定を行います。ここでは、証明書公開鍵と秘密鍵はLet’s Encrypt の実行環境の liveディレクトリを参照しています。また、Let’s Encrypt の実行環境にある options-ssl-nginx.conf と ssl-dhparams.pem を参照しています。

server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;

    server_name  (自ドメイン名);

    ssl_certificate /etc/letsencrypt/live/(自ドメイン名)/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/(自ドメイン名)/privkey.pem;

    #loading ssl settings in Let's Encrypt
    include /etc/letsencrypt/options-ssl-nginx.conf;

    #loading the Diffie-Helman key exchange algorithm in Let's Encrypt
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    ーー(省略)ーー
}

Nginx サービスを再起動し、正常であればこの時点でHTTPSでWebサイトが開きます。

[user@pub-web ~]$ sudo systemctl restart nginx
[user@pub-web ~]$