はじめに
この記事で説明すること
この記事では、Let's Encryptから無料のサーバ証明書(ワイルドカード証明書)を取得し、(複数の)apacheサーバに証明書を組み込む手順を説明してます。
Amazon Linux2でLet's EncryptをググるとCertbotを改造するケースが多いですが、この手順では引数を工夫することで改造なしを実現してます。
Let's Encryptの証明書の有効期限は90日で、この記事の手順では更新毎に利用している全apacheサーバに証明書を再配布しなければならないので、PoCや検証などで一時的に正規の証明書が必要なケースを想定した手順になります。
なお、この手順の前提として証明書用のドメインを取得している必要があります。
関連記事
- 全体概要
- ドメイン取得とRoute53との連携
- Let's Encryptで無料の証明書を取得する(この記事)
Let's Encryptとは
Let's Encrypt は、「SSL/TLSサーバ証明書」を無料で発行してくれる認証局(CA)で、以下の特徴があります。
非営利団体の ISRG (Internet Security Research Group) が運営しており、シスコ(Cisco Systems)、Akamai、電子フロンティア財団(Electronic Frontier Foundation)、モジラ財団(Mozilla Foundation)などの大手企業・団体が、ISRG のスポンサーとして Let's Encrypt を支援しています。
詳しくは公式サイトを参照してください。
letsencrypt.org
手順
サーバ証明書の取得
(1)"Certbot"を動かす環境を準備する
Certbotが稼働可能なLinux、MacOS、Unixを準備してください。Certbotが稼働可能な環境は、Certbotの公式ページを確認してください。
今回は、CertbotではサポートされていないですがAmazon Linux 2上でCertbotを動かします。
(2)"Certbot"のセットアップ
Certbotのセットアップは、こちらのCertbotの公式ページに説明があります。
ただAmazonLinux2はこの手順ではできませんので、以下ではAmazonLinux2で動作するように手順をカスタマイズしています。
(a)前提パッケージのインストール
pythonのvirtualenvというツールを内部で利用しているようなのでそれをインストールします。
sudo yum -y install python-virtualenv
(b)Certbotのインストール
今回は、/usr/local/binにインストールします。
$ sudo wget --directory-prefix=/usr/local/bin https://dl.eff.org/certbot-auto $ sudo chmod a+x /usr/local/bin/certbot-auto
(c)Certbotのインストレーション実行
$ sudo /usr/local/bin/certbot-auto --no-bootstrap --install-only Upgrading certbot-auto 0.29.1 to 0.30.0... Replacing certbot-auto... Creating virtual environment... Installing Python packages... Installation succeeded. Certbot is installed.
- オプションの意味
- "--no-bootstrap" : CertbotはAmazonLinux2を検出してくれないので、検出を無効化するためこのオプションを指定します。
- "--install-only" : 必要なパッケージのインストールのみ実行するオプションです。
(3)サーバ証明書の取得
準備が整ったらサーバ証明書を取得します。Certbotはengixやapacheなど証明書を利用したいwebソフトと連携させることができますが、今回は複数のサーバに配布するためマニュアルモードで証明書を取得します。
(a)Certbotの実行
証明書取得のためコマンドを実行します。モードはマニュアルで、ドメイン使用権の認証方法としてDNSを利用(DNS サーバのTXT レコードに指定されたキーを設定)しています。*3コマンドの詳細は、"certbot-auto --help all"で参照できます。
$ sudo /usr/local/bin/certbot-auto --no-bootstrap certonly \ --manual \ --manual-public-ip-logging-ok \ --domains '*.poc.nopipi.work' \ --email admin@poc.nopipi.work \ --agree-tos;
- オプションの意味
- certonly :証明書の取得の取得のみ実施
- --manual: ドメイン使用権者であることの認証を手動で行うモード
- --manual-public-ip-logging-ok: 認証局でのパブリックIPロギングの自動許可
- --domains '*.poc.nopipi.work': 証明書を取得したいドメインの指定。'*.'とするとワイルドカード証明書になる
- --email : 証明書の期限切れ等をお知らせするメールの宛先を指定
- --agree-tos: ライセンス条項の同意
(b)DNSレコードの登録
上記(a)を実行すると、下記のようにpoc.nopipi.workのドメインに、_acme-challengeという名前のTXTレコードで、"nmdZ・・・"という値を設定するよう指定がありますので、指示に従ってDNSサーバにTXTレコードを登録します。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please deploy a DNS TXT record under the name _acme-challenge.poc.nopipi.work with the following value: nmdZGYXDo6J0DVtfKMCHwhCaXdjtl0eJuYGN4J0XMQk Before continuing, verify the record is deployed. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
今回poc.nopipi.workはRoute53を利用しているので、Route53でレコード登録します。
別コンソールでdigコマンドでレコードが確認できたら、後続に進み証明書を発行します。
$ dig TXT _acme-challenge.poc.nopipi.work ; <<>> DiG 9.8.3-P1 <<>> TXT _acme-challenge.poc.nopipi.work ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 19405 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 4, ADDITIONAL: 3 ;; QUESTION SECTION: ;_acme-challenge.poc.nopipi.work. IN TXT ;; ANSWER SECTION: _acme-challenge.poc.nopipi.work. 60 IN TXT "nmdZGYXDo6J0DVtfKMCHwhCaXdjtl0eJuYGN4J0XMQk" <以下略>
(c)作成された証明書の確認
"/etc/letsencrypt/live/ドメイン名" のディレクトリ配下にファイルが作成されますので、確認してください。
sudo ls /etc/letsencrypt/live/poc.nopipi.work cert.pem chain.pem fullchain.pem privkey.pem README
ファイル名 | 項目 |
---|---|
cert.pem | サーバ証明書 |
privkey.pem | 秘密鍵 |
chain.pem | 中間証明書 |
fullchain.pem | 証明書と中間証明書を連結したファイル |
apacheサーバへの証明書の組み込み
(1)証明書のコピー
作成した証明書を、apacheをセットアップしているインスタンス内にコピーします。
この手順では、他インスタンスへ証明書をコピーする時作成時と同じディレクトリにデプロイされるものと仮定します。
(2)httpd.confの設定
sslの設定ファイル.ssl.confに取得したサーバ証明書関連のファイルを展示します。
<VirtualHost _default_:443> 中略 SSLCertificateFile /etc/letsencrypt/live/poc.nopipi.work/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/poc.nopipi.work/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/poc.nopipi.work/chain.pem SSLCACertificateFile /etc/letsencrypt/live/poc.nopipi.work/fullchain.pem 中略 </VirtualHost>
追伸
この記事を書いた後に気づきましたが、AWSのEC2のユーザガイドにも利用手順ありましたね。
docs.aws.amazon.com
*1:公式:Getting Started - Let's Encrypt - Free SSL/TLS Certificates、非公式解説:Let's Encrypt の使い方 - Let's Encrypt 総合ポータル
*2:公式:ACME v2 Production Environment & Wildcards - API Announcements - Let's Encrypt Community Support、非公式解説:よくある質問 - Let's Encrypt 総合ポータル
*3:この記事などを参考にしています。Let's Encryptでワイルドカード証明書発行してみた · D