のぴぴのメモ

自分用のLinuxとかの技術メモ

AmazonLinux2でLet's EncryptでCertbot改造せずに証明書を取得する手順

はじめに

この記事で説明すること

この記事では、Let's Encryptから無料のサーバ証明書(ワイルドカード証明書)を取得し、(複数の)apacheサーバに証明書を組み込む手順を説明してます。

Amazon Linux2でLet's EncryptをググるCertbotを改造するケースが多いですが、この手順では引数を工夫することで改造なしを実現してます。

Let's Encryptの証明書の有効期限は90日で、この記事の手順では更新毎に利用している全apacheサーバに証明書を再配布しなければならないので、PoCや検証などで一時的に正規の証明書が必要なケースを想定した手順になります。

なお、この手順の前提として証明書用のドメインを取得している必要があります。

f:id:nopipi:20190106124645p:plain:w600

関連記事

  1. 全体概要
  2. ドメイン取得とRoute53との連携
  3. 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が稼働可能なLinuxMacOSUnixを準備してください。Certbotが稼働可能な環境は、Certbotの公式ページを確認してください。
今回は、CertbotではサポートされていないですがAmazon Linux 2上でCertbotを動かします。

  • 動作環境
    • OS: Amazon Linux2
    • AMI amzn2-ami-hvm-2.0.20181114-x86_64-gp2 (ami-0a2de1c3b415889d2)
    • ネットワーク:インターネットと通信できること
(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でレコード登録します。

f:id:nopipi:20190106153643p:plain:w600

別コンソールで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>
(3)確認

apacheを再起動し、動作確認を行う。

sudo systemctl restart httpd

追伸

この記事を書いた後に気づきましたが、AWSのEC2のユーザガイドにも利用手順ありましたね。
docs.aws.amazon.com