Studio ilia

Wordpress、ゲームコンテンツ開発ブログ

CentOS 8に構築したApacheに無料SSL証明書の導入(Let’s Encrypt)

Let’s Encryptについて

サーバーとドメインさえあれば無料のSSL証明書を発行できるサービスです。
2016年4月に正式サービスが開始されて商用利用も可能なのです!

 

▼公式WEB

 

構築環境
  • CentOS Linux release 8.2.2004 (Core)
  • httpd 2.4.37-21
  • mod_ssl x86_64 1:2.4.37-21
  • ルータで「ポート 443」を開放

 

 

ルータのポート開放でSSL通信を受け入れる

SSL証明書の発行と組み込みを行う前に、サーバー側NWのルータのポートを開放して、外部からの通信がサーバーに届くようにします。

SSL通信で使われるポート番号は「443」になります。
ポートの設定方法はルータによって違いますが、概ね下記のような感じです。

 

プロトコル TCP / UDP
開始ポート番号 443
終了ポート番号 443
サーバーのローカルアドレス 192,168.x.x

 

▼通信イメージ

 

 

▼ルータの設定イメージ

 

 

certbot-autoコマンドの導入

Let’s EncryptでSSL証明書を取得するための「certbot-auto」をcurlコマンドを用いて導入します。

▼SSLモジュールをDLするリポジトリを追加

 

▼ApacheにSSLモジュールをインストール

 

▼certbotのDL

 

 

SSL証明書の取得

▼Let’s Encryptの有効期限
証明書の有効期限は90日です。90日毎に更新作業を再度実施する必要があります。

 

▼SSL証明書取得コマンドのパラメータ

–webroot 稼働中 Web サーバーの公開ディレクトリ配下を認証用の一時領域に使用
-w ドキュメントルート
-d 証明書を取得したい FQDN
FQDN (Fully Qualified Domain Name) ホスト名.ドメイン名を省略なしで表記

 

備考
  • ドキュメントルートはバーチャルホストで複数のホスト定義がある場合、該当のホスト定義を指定。
  • 証明書を取得したい FQDN が複数ある場合は、-d [証明書を取得したい FQDN] を複数指定。
  • 例 : srv.world/dlp.srv.world の二つについて取得する場合。
    ⇒ [-d srv.world -d dlp.srv.world]

 

▼ターミナルから取得コマンド実行(初回目)

 

 

備考
  • 「IMPORTANT NOTES」の下に「Congratulations」(おめでとう)表示で完了。
  • 「/etc/letsencrypt/live/example.com/」配下に証明書が取得されているとアナウンスが表示。
  • cert.pem ⇒ SSLサーバー証明書(公開鍵含む)
  • chain.pem ⇒ 中間証明書
  • fullchain.pem ⇒ cert.pem と chain.pem が結合されたファイル
  • privkey.pem ⇒ 公開鍵に対する秘密鍵

 

 

取得したSSL証明書をサーバーに更新

備考
  • 有効期限が 30日未満の証明書を全て更新
  • 有効期限の残り日数に関わらず更新したい場合は「–force-renew」を合わせて指定

 

▼更新処理を実行

最後に「success」となれば完了です。

 

 

SSLを有効にするライブラリのインストール

 

 

SSL証明書取得コマンドを実行(2回目以降)

2回目以降は特に何も聞かれずに完了します。

▼SSL証明書の取得コマンド実行

 

▼上記取得済のSSLをサーバーに更新

 

 

Apacheコンフィグ(ssl.conf)の修正

httpd.conf でバーチャルドメインの設定しているときは、下記 ssl.conf で管理すると、複数のファイルで管理することになり煩雑になるため管理がし辛くなります。
ssl.conf からバーチャルドメイン関連の設定をコメントアウトして無効にした後、httpd.conf側にSSLのバーチャルドメインの設定を記述します。

 

 

 

Apacheコンフィグ(httpd.conf)の修正

 

 

▼コンフィグの反映

 

 

状態確認

ssl_moduleが表示されていれば問題なし。

 

▼SSL証明書の有効期限を調べる

「2021年1月9日」まで有効。

 

▼ブラウザから下記で問題なくアクセスできることを確認
・http://example.com/
・https://example.com/

 

 

httpdを起動時にエラーが表示された場合

エラーの例1

AH00558: httpd: Could not reliably determine the server’s fully qualified domain name, using fe80::2:76ff:fe1b:26f5. Set the ‘ServerName’ directive globally to suppress this message
ssl_module (shared)

この場合は、「httpd.conf」にて「ServerName」が設定されていない時に表示。

 

エラーの例1

AH00548: NameVirtualHost has no effect and will be removed in the next release /etc/httpd/conf/httpd.conf:391
ssl_module (shared)

次のApacheのリリースでVirtualHostは書かなくても動作するという意味。
今回の場合だとhttpd.confの記述は下記が該当。
「NameVirtualHost 192.168.0.50」

 

 

cronでSSL証明書の自動更新

2回目以降のSSL証明書の更新は、コマンド1行で実行後にhttpdを再起動するだけで簡単に更新が行えます。
しかし、更新を忘れる事が多いと思うので、cronに登録して自動化したいと思います。

 

cronに登録する処理
  • 毎月1日の05:00にcronを実行
  • SSL証明書の自動更新
  • Apacheの再起動
  • cronの実行結果をメールで送信

 

▼cronファイルの編集

 

▼結果をメールで送信
MAILTO=”info@example.com”


▼毎月1日の05:00にcronを実行
00 5 1 * * root /usr/local/bin/certbot-auto renew && systemctl restart httpd

 

cronに備考

・certbot-auto renew コマンドで更新
&& で最初のコマンドが正常なら次のコマンドを実行
systemctl restart httpd でApacheを再起動

 

 

メールでcronの実行結果を確認

certbot-auto renew の実行後は設定したメールアドレスにログが出力されます。
実際に更新が完了した際は下記のように success と表示されます。

SSL証明書更新完了のメール内容

Congratulations, all renewals succeeded. The following certs have been renewed: /etc/letsencrypt/live/example.com/fullchain.pem (success)

更新直後に再度 certbot-auto renew を実行した際などは下記のように skipped となり表示され、更新は行われません。
尚、certbot-auto renew のコマンド自体は正常に走っているので、「&&」でつないだ2つ目のコマンドであるApacheの再起動も実行されます。

 

SSL証明書更新スキップのメール内容

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Processing /etc/letsencrypt/renewal/example.com.conf
– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –
Cert not yet due for renewal

– – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – – –

The following certs are not due for renewal yet:
/etc/letsencrypt/live/aki-e.com/example.com expires on 2021-04-12 (skipped)
No renewals were attempted.

 

Home
Profile
Menu
Search