※当ブログは2024年に運用開始を予定しております、当社の新しい電子証明書発行・管理プラットフォーム「Atlas」に関連する内容となっています。新プラットフォーム「Atlas」の活用方法を事前にお伝えするために、提供開始に先行して当ブログを公開いたします。

CertbotとはLet’s Encryptが提供する、クライアントソフトウェアです。 
Certbotを利用することでSSLサーバ証明書に関する以下のような作業を自動化することが可能です。 

  • 鍵ペアの作成
  • CSRの作成・認証局への送信
  • ドメイン名利用権の検証 (HTTP / DNS認証)
  • 証明書の設定・更新

そこで今回は、CertbotとACMEに対応したAtlasを連携し、LinuxのRHEL9×Apacheのウェブサイトに、SSLサーバ証明書を自動で設置する方法をご案内します。

※本例はあくまで検証用として作成した弊社の独自の環境を前提としております。 実際に提供いたしますAtlasの機能によっては、挙動や用いるコマンド等が変更となる場合もございますので、参考までにご覧ください。
※既にSSLサーバ証明書を設置済みの環境でも、同様の手順にて導入できることを確認済みです。

使用した環境
OS:AWS RHEL9
ウェブサーバアプリケーション:Apache
Atlasのアカウント及び、API Key、MAC Key※後述
Certbot

CertbotをLinux環境にインストール

① Linuxを起動し、管理者権限で以下のコマンドを実行します。


■コマンド例
# dnf -y install certbot 
# dnf -y install python3-certbot-apache ←certbot runコマンドを実行する本例においては必須

 

② Certbotがインストールされたことを確認します。

インストール①.png

AtlasポータルからAPI Key (EAB Key ID)とMAC Key (HMAC Key) を取得

① Atlasポータルにログインします。

Key取得①.png

② Atlasポータルにログイン後、左メニューから「Access Credentials」を展開し、 API Credentialsを選択します。

Key取得②.png

③ API Credentials メニューから登録済みのACME MAC Keyメニューを確認します。

④ 登録済みのACMEキーの右上にカーソルを合わせ、「・・・」を選択します。

Key取得③.png

⑤ 「Manage ACME MAC」を選択します。

Key取得④.png

⑥ 「ACME MAC」と「Key ID」を確認します。 

Key取得⑤.png

CertbotとAtlasのアカウントを連携

以下の手順で CertbotにGlobalsign Atlasのキー情報を入力し、アカウントを登録します。

①以下のコマンドを実行します。


■コマンド例
#certbot register -m 'mail@example.jp' --agree-tos --eab-kid 'KeyID' --eab-hmac-key 'MACkey' --server 'https://acme.sample.jp/getDirectory'

② 「Account registered.」というメッセージが表示されていることを確認します。
※こちらは「No」を選択いただいても問題ございません。

アカウント連携①.png

ACMEアカウントに関連する Certbotのサブコマンド・オプション(一部)

コマンド 説明
register ACMEアカウントを作成します。
-m ’MAIL’ ACMEアカウントに設定するメールアドレスを指定します。
(コマンドラインでのオプション指定は任意ですが、指定しない場合にはインタラクティブに入力を求められます)
--agree-tos Globalsignの利用規約に同意します。
(コマンドラインでのオプション指定は任意ですが、指定しない場合にはインタラクティブに入力を求められます)
--eab-kid ’KID’ ACMEアカウントの認証情報を指定します。(Key ID)
※アトラスポータルから取得
--eab-hmac-key ’HMAC-KEY’ ACMEアカウントの認証情報を指定します。 (ACME MAC)
※アトラスポータルから取得
--server ’SERVER’ 申請先のサーバホストを指定します。
以下のような固定値を入力してください。
サンプル:'https://acme.globalsign.com/directory'

証明書の発行とバインド

① 以下のコマンドを実行します。


■コマンド例
#certbot run --apache -d example.com, www.example.com --key-type rsa --server 'https://sample.jp/DV/getDirectory'

② コマンドの実行結果を確認します。


Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Requesting a certificate for sample.com
Performing the following challenges:
http-01 challenge for sample.com
Waiting for verification...
Cleaning up challenges
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/sample.com /fullchain.pem
Key is saved at: /etc/letsencrypt/live/sample.com /privkey.pem
This certificate expires on 2023-12-28.
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
Deploying Certificate to VirtualHost /etc/httpd/conf.d/ssl.conf
Successfully deployed certificate for sample.com to /etc/httpd/conf.d/ssl.conf
Redirecting vhost in /etc/httpd/conf.d/vhost-ssl.conf to ssl vhost in /etc/httpd/conf.d/ssl.conf
Congratulations! You have successfully enabled HTTPS on https://sample.com

「Successfully received certificate.」メッセージが表示されれば、証明書の発行は完了です。

発行された証明書は通常、以下のディレクトリで確認できます。


証明書 : /etc/letsencrypt/live/${FQDN}/fullchain.pem
秘密鍵 : /etc/letsencrypt/live/${FQDN}/privkey.pem

※ ${FQDN} は、証明書を設定するウェブサーバのFQDNを示します。
※ /etc/letsencrypt は、Certbotがデフォルト設定で生成するディレクトリです。

③ 最後に、発行されたSSLサーバ証明書がウェブサイトに設置されているか、確認します。

Atlasから発行されたSSLサーバ証明書が自動で設置されています。

バインド①.png

証明書発行に関連する Certbotのサブコマンド・オプション(一部)

コマンド 説明
-d 証明書を発行するFQDNを指定します。カンマで区切ることで複数指定が可能です。
--apache apacheプラグインを利用して、証明書の発行とインストールを自動化します。利用する認証方法はファイル認証となります。
--key-type rsaを指定します。
※Certbot 2.0.0以降、指定しない場合申請エラーになります。

自動更新の設定

Atlas経由のSSLサーバ証明書の有効期間は3ヶ月ですので、 3ヶ月に1度だけSSLサーバ証明書の取得申請(上述の証明書取得コマンドを実行)をすれば事実上の更新となりますが、cronを用いた自動更新設定を実施します。
cronの登録は以下のようにしました。

1.下記コマンドを実施しcronの設定画面を開きます


crontab -e

2.下記の内容を記述


* * * * * sudo certbot renew

「*」に指定する値は実施する日時を指定します。詳細は下記をご参考ください。

*の位置(左から) 頻度 指定可能な値
1 0~59
2 0~23
3 0~31
4 0~12
5 曜日 0~7 (0、7日曜、1月曜、以降順に続く)

例1:毎月2日と26日、07時05分に実行する場合


5 7 2,26 * * sudo certbot renew

例2:3月、6月、9月、12月の15日、07時10分に実行する場合


10 7 15 3,6,9,12 * sudo certbot renew

※certbot renewを実行する前にApacheを停止する必要がある場合は、cronで実行するcertbot renewコマンドには「--pre-hook ""systemctl stop httpd""」を付けるように注意してください。

補足

下記コマンドにて証明書の有効期間が30日以上残っている場合でも、強制的に更新が可能です。 緊急で証明書の入れ替えが必要になった場合等に、本オプションを指定してください。
※大量の証明書発行が継続して行われた場合、サーバ側で申請を制限する場合があります。


Certbot renew -force-renewal

cronの自動更新を事前にテストしたい場合は、以下のディレクトリにある設定ファイルの記述を変更してください。


/etc/letsencrypt/renewal/{FQDN}.conf 
# renew_before_expiry = 30 days

コメントアウトを外し、30を90に変更することで、即日自動更新のテストができます。

まとめ

本記事でご紹介しました設定により、 Certbotによる証明書の申請から発行、更新の自動化までの一連の手続きを自動化することができました。

Certbotはオプションが多く、複雑に見えますが、ドキュメントを見ながら正しくコマンドを実行していくことで、想像以上に簡単に導入することが可能です。

※本記事では割愛しましたが、Linuxへの追加パッケージのインストールや、 Certbotで発行した証明書を受け付けるためにVirtualHostを書く等の細かな設定は環境毎にあるかと思います。

また、既にLet's Encryptを用いたSSL/TLS証明書の運用を行っている場合は、SSLサーバ証明書のリクエスト先を変えるだけで Certbotの設定の流用が可能なので、導入のハードルはより一層下がります。

Certbotを利用することでSSLサーバ証明書の更新の自動化が行えるため、大幅な管理コストの削減が可能となり、今後SSLサーバ証明書のライフサイクルが短くなった場合にも、備えることができます。

また、ウェブ管理者は運用で一番の懸念となる「サーバ証明書の有効期限切れ」を気にすることなく運用することができるというのが大きな利点になるでしょう。

トピック関連記事

#

2013年08月02日

DNS-based Authentication of Named Entities(DANE)

#

2018年03月13日

サーバを増やさずSSL/TLSを拡張!SNIと常時SSLとの密接な関係

#

2013年07月19日

モジラ CA:CertificatePolicyV2.2のトピック new gTLDについて

この記事を書きました

石井 昌伸

石井 昌伸
所属:GMOグローバルサイン テクニカルサポート部