こんにちは、hsです。
今回は、業務でWEBサーバをSSL通信に対応させる機会をいただきましたが、当時はサーバ証明書の意味すら知らない状況でした、、、、
そんな中、初めて「Let’s Encrypt」というサーバ証明書の発行を、無料で行えるサービスを使用したので紹介していきます。
※参考にさせていただいたサイト※
https://weblabo.oscasierra.net/letsencrypt-2/
Let’s Encryptについて
Let’s Encryptとは無料でWEBサーバのSSL証明書を発行することができるサービスです。
■SSL証明書の発行を行うとできること
1.サーバとWEBブラウザ間での通信を暗号化できる
通信内容を暗号化することで、第三者に通信内容を傍受される可能性が低くなります。
2.第三者によるデータ改ざんのリスクを低下させられる
通信内容の暗号化により、第三者が通信内容の改ざんを行うことが難しくなります。
3.接続先サーバのなりすましを防止できる
DNSサーバを改ざんすることで、例えば「avancesys.co.jp」へアクセスしても、攻撃者が用意したトラップサーバへ接続されてしまう攻撃があります。
ドメイン認証ではアクセス先URL(ドメイン)をアクセス先のサーバが所有するものか証明を行うため、この攻撃に対応することができます。
■Let’s EncryptのSSL証明書では行えないこと
ここまでいいこと尽くしのLet’s Encryptですが、Let’s Encryptでは基本的にドメイン認証のみ行うことができます。そのため組織認証と拡張認証は基本的に行えません。
★ドメイン認証と組織認証、拡張認証とは
ここではあまり詳しく解説しませんが、この3つは基本的に信頼性が異なります。
・ドメイン認証:ドメインが正規の所有者であることを証明します。
・組織認証:ドメイン認証に加えてドメインの所有者(組織)が実在することを証明します。
・拡張認証:組織認証の組織の実在証明をより厳格にしたものです。
環境
■環境は以下の通りです
・OS:AlmaLinux9
・WEBサーバ:Apache
・ドメイン:avancesys.co.jp(機密保持のため実際のドメインとは異なります)
・ブラウザ:Chrome(通信方式を確認するのみに使用)
手順
注意点:Let’s Encryptの使用にはドメイン名の取得が必須となります。
・今回は仮に「avancesys.co.jp」というドメインを使用した場合の手順を記述します。
1.証明書の発行に際し、WEBサーバのドキュメントルートが必要なため以下コマンドで検索します。
# cat /etc/httpd/conf/httpd.conf | grep "DocumentRoot \""
>/var/www/html
■「/var/www/html」がドキュメントルートです、後ほど必要なためどこかにメモしておきましょう!
※Apacheの設定ファイルは「/etc/httpd/conf」ディレクトリ内にありますが、特殊なインストールをした場合「httpd.conf」は他のディレクトリ内に入っている可能性があるため、パスは適宜変更してください。
2.Let’s Encryptの証明書発行に必要な「Certbot」をインストールします。
# dnf install -y epel-release
# dnf install -y certbot python3-certbot-apache
■私の環境ではepelリポジトリを新たに入れる必要があったため追加で対応を行っています。
※今回はAlmaLinuxを使用していますが、CentOS7以前を使用する場合には「python2-certbot-apache」が必要となりますので注意してください。
3.Apacheの暗号化を行うため「mod_ssl」をインストールします。
# dnf -y install mod_ssl
■インストールのみなので詳しい説明は省きます。
4.certbotを使用して証明書の発行を行います。
# certbot certonly --webroot -w /var/www/html -d avancesys.co.jp
>「メールアドレスを問われるため入力 ※必須ではない」
>「インストールへの同意が求められるため "y" を入力」
>「メーリングリストへの追加に同意するか聞かれるため "n" ※同意するとサービスや機能改善、イベント情報などが届く」
■コマンドに変数を入れる必要があるため解説を行います
「certbot certonly –webroot -w (ドキュメントルート) -d (ドメイン名)」という構成となっています。
・ドキュメントルート:手順1にてメモしたドキュメントルートを入力してください。
・ドメイン名:ご自身のWEBサーバに割り当てたドメイン名を入力してください。
※余談ですが、今まで何度か証明書発行を行いましたが、1度だけこのコマンドを実行した際にエラーが出たため、サーバの再起動を行い解決しました。
原因は不明なままのため、エラーが出た場合にサーバ再起動を試してみるといいかもしれません。
5.発行した証明書を確認、準備します。
# ls -l /etc/letsencrypt/live/avancesys.co.jp
> total 4
> lrwxrwxrwx 1 root root 53 Oct 20 10:16 cert.pem -> ../../archive/avancesys.co.jp/cert1.pem
> lrwxrwxrwx 1 root root 54 Oct 20 10:16 chain.pem -> ../../archive/avancesys.co.jp/chain1.pem
> lrwxrwxrwx 1 root root 58 Oct 20 10:16 fullchain.pem -> ../../archive/avancesys.co.jp/fullchain1.pem
> lrwxrwxrwx 1 root root 56 Oct 20 10:16 privkey.pem -> ../../archive/avancesys.co.jp/privkey1.pem
> -rw-r--r-- 1 root root 692 Oct 20 10:16 README
■「ls -l 」コマンドを使用して、サーバ証明書のパスを検索します。
→出力されたパスをもとに証明書のフルパスを作成します。
・出力されたシンボリックリンクの内「cert.pem」と「privkey.pem」、「chain.pem」3つのフルパスを取得します。
例:cert.pemの場合「/etc/letsencrypt/live/(ドメイン名)/cert.pem」
対象 | フルパス |
cert.pem | /etc/letsencrypt/live/avancesys.co.jp/cert.pem |
privkey.pem | /etc/letsencrypt/live/avancesys.co.jp/privkey.pem |
chain.pem | /etc/letsencrypt/live/avancesys.co.jp/chain.pem |
※「/avancesys.co.jp/cert1.pem」のように「1」がファイル名に入っていますが、今回Apacheへはシンボリックリンク先ではなく、シンボリックリンクを直接指定してください。
6.発行した証明書とApacheを紐づけます。
# vi /etc/httpd/conf.d/ssl.conf
> SSLCertificateFile /etc/letsencrypt/live/avancesys.co.jp/cert.pem
> SSLCertificateKeyFile /etc/letsencrypt/live/avancesys.co.jp/privkey.pem
> SSLCertificateChainFile /etc/letsencrypt/live/ptavancesys.co.jp/chain.pem
■ssl.confファイル内の以下の文が含まれる行を編集します
「SSLCertificateFile ***」
「SSLCertificateKeyFile ***」
「SSLCertificateChainFile ***」
※アスタリスク「***」は内容が一致していなくても問題ない箇所なので、例えば「SSLCertificateFile ***」の場合「SSLCertificateFile」が行内に含まれていればOKです。
7.証明書を適用します。
> systemctl restart httpd
■再起動が完了したら以下の手順に従い、証明書が適用されたか確認します
7-1.WEBブラウザで対象のURLへアクセスし、URL左側のボタンをクリックします。

7-2.「この接続は保護されています」をクリックします。

7-3.「証明書は有効です」をクリックします。

7-4.「発行日」が証明書の発行を行った日時とおおよそ同じとなっていることを確認します。
※リージョンの設定によって日付が異なる場合があります。

8.サーバ証明書を自動更新させます。
・Let’s Encryptは証明書の期限が3か月間(90日)です。
Let’s Encryptに限った話ではありませんが、証明書には期限があるため、期限が迫った場合に更新しなくてはなりません。
そのため、Let’s Encryptの補足として証明書の自動延長についての解説を行います。
8-1.サーバ証明書の更新コマンドの定期実行
crontab -u root -e
■「crontab」を使用して、Linux上で任意のコマンドを定期実行することができます
・上記のコマンドを実行すると、crontabの設定用のファイルが開きます。
00 02 01,15 * * certbot renew && systemctl restart httpd
■crontabにて上記のコマンドを入力して保存します
8-2.サーバ証明書の更新コマンドの解説
★「00 02 01,15 * *」について
これはcrontab上で任意のコマンドを実行する場合の時間指定です。
以下のような構成となっています
分 時 日 月 曜日 (任意のコマンド)
今回は「00 02 01,15 * *」となっており、アスタリスク「*」はすべてを表し「,」カンマを入れると2つの条件を入れることができます。
以上を踏まえると、「全ての曜日の毎月、1日もしくは15日の深夜2時0分」という条件になります。
★「certbot renew && systemctl restart httpd」について
これは証明書を自動的に更新し、適用させるコマンドになっています。
・「certbot renew」で証明書の更新を行います。
※このコマンドは証明書の有効期限が、残り30日を切った場合にのみ更新されます。そのためcrontabにて毎月2回実施しないと、31日まである月(8月31日など)の1日のみ更新を行い証明書の有効期限が31日までであった場合、証明書の有効期限は残り30日以上残っているため、8月1日時点では更新が行われず9月1日に更新が行われます。
そうしますと8月31日は証明書の期限が切れている状態になってしまうため注意です。
・「systemctl restart httpd」でApacheの再起動を行います。
「7.証明書を適用します。」でも行っているように証明書の内容に変更があった場合にApacheを再起動させる必要があります。
そのため、Apacheの再起動が走っても問題ない時間に設定してください。
※補足として証明書更新コマンドとApache再起動コマンドの間に「&&」が入っていますが、これは「&&」の前に記述されているコマンドが正常に完了したら「&&」の後に記述されているコマンドを実行するといった意味です。
まとめ
サーバ証明書の意味すら知らない状態から始めたため、終始グダグダな作業となってしまいましたが、何とか終わらせることができました。
Linuxコマンドの勉強にもなるため、WEBサーバ構築を行う場合はぜひ導入してみてください。
関連記事
-
第1回 Visual C++で作成したDLL内のクラスをC#で利用する方法
こんにちは、ILCです。 Visual C++ (以下 VC++)で作成されたDynamic...
公開日:2024.01.19 更新日:2024.01.19
tag : Windows
-
-
-
第1回 ラズパイを使用したBLE通信 ~ ディスプレイ、キーボード、マウスを接続しないで設定 前編 ~
こんにちは、GTです。よろしくお願いします。 最近業務でラズパイのBluetooth機能を使...
公開日:2021.12.24 更新日:2021.12.24
tag : Bluetooth Raspberry Pi
-
【新機能探訪】Android 13から導入された『アプリごとの言語設定』
こんにちは、KNSKです。よろしくお願いします。 今回は Android13の新機能である『...
公開日:2022.12.09 更新日:2022.12.09
tag : スマートデバイス
-
第3回 ラズパイを使用したBLE通信 ~ A/D変換・D/A変換を用いた入出力編 ~
こんにちは、GTです。よろしくお願いします。 第3回の今回は、ラズパイの入出力についてご紹介...
公開日:2023.02.24 更新日:2023.02.24
tag : Bluetooth BLE Raspberry Pi