久々に小ネタでも投稿してみようと思ふ
ここ最近、社内の様子は頻繁にご紹介しておりましたが、「そういえば技術ネタってしばらく投稿していなかったな」とふと思いまして……。
お昼休みの時間を使って、ここ最近個人的にハマった小ネタをテーマに書いてみようかと思います。
誰でもいつでも自由にSSLサーバ証明書がゲットできる!Let’s Encrypt!
さて、Let’s Encryptというサイト/サービスはご存じでしょうか?
Let’s Encrypt – Free SSL/TLS Certificates
Let’s Encrypt is a free, automated, and open certificate authority brought to you by the non-profit Internet Security Research Group (ISRG).
過去には有料でしか手に入らなかったSSLサーバ証明書を、無料でお手軽に誰でも自由に手に入るようゴニョゴニョしてくださっている非営利団体ですね1)ドメイン認証なSSLサーバ証明書だけですが。
2016年4月にサービスがスタートしてから、大手企業や団体などのスポンサードを受けつつ、多くの人たちを救ってきた(?)このサービス!非公式ではあるものの日本語のサポートサイトなどもあるので、多くの方がご利用中のことと思います。
つい最近、ワイルドカード証明書に対応したのもあり、どんどん便利になってきましたね〜。
導入も簡単!
Let’s Encryptからサーバ証明書を取得するのも非常に簡単!
- certbot-autoをダウンロード2)OSによってはパッケージが用意されていることもあるよ!
- Webサーバを適切に設定3)この時点ではhttp onlyでOKし、certbot-autoを適切なオプションで実行
- 画面の指示に従ってゴニョゴニョ
- 無事取得できたらWebサーバに設定し再起動などをおこなう
- cronとかで自動的に更新されるよう設定4)90日間の有効期限しかないので
……って感じでやればOKと、非常にお手軽ですよね〜。
あ、もうちょっと細かい手順が知りたい方は、下記をご参照ください。
Getting Started – Let’s Encrypt – Free SSL/TLS Certificates
To enable HTTPS on your website, you need to get a certificate (a type of file) from a Certificate Authority (CA). Let’s Encrypt is a CA. In order to get a certificate for your website’s domain from Let’s Encrypt, you have to demonstrate control over the domain.
Let’s Encrypt の使い方 – Let’s Encrypt 総合ポータル
当サイトは、無料 SSL/TLS 証明書発行サービス Let’s Encrypt の非公式解説サイトです。 This is an unofficial website about Let’s Encrypt.
ワイルドカード証明書もお手軽にゲットできる!
先に述べた通り、ワイルドカード証明書——ホスト/サブドメイン部分がなんであってもOKなサーバ証明書にも対応したので、同一サーバ内で複数サブドメインを運用するときなんか、だいぶ楽になりましたよね。
導入方法は(少なくとも現時点では and/or ボクが知る限りにおいては)ちょっと特殊な操作が必要ですが、コマンドひとつタイプするだけでOKです。
ボクは下記のQiitaなエントリを参考にさせていただきました。
Let’s Encrypt (certbot) でワイルドカード証明書できた! – Qiita
先日、 という記事を書きまして、Qiitaでの初投稿であったにも関わらず5000以上のアクセス、100いいねを頂きました。 投稿時点ではちゃんとワイルドカード証明書が発行できたと思っていたのですが、実際はまだステージングの段階で無効な証明書しか発行されないというツッコミを頂きまして、ドキュメントの読み込み不足・検証不足を痛感し記事に追記したところであります。 ところがやっと、 「ACME v2エンドポイントがProductionEnvironmentとして利用可能になった」というアナウンスがあり、 対応クライアント一覧にcertbotが入っていたので、もう一度検証してみることにしました。 警告が出ない、ちゃんとしたワイルドカード証明書が発行される←NEW yumで入るcertbotはまだ古い(2018/03/14 04:30 JSTごろ) ACME v2 のエンドポイントは明示的な指定が必要 epelが必要だった気がする 普通にDNS認証でやってみる→失敗 嫌な予感がする バージョンが古かった Release 0.22.0 ってコミットメッセージが入ってます。しかも6日前。 クローンする 前回の記事のコマンドから不要な部分を削って実行してみます APIサーバのエンドポイントのデフォルトは古いままのようです。 ACMEv2本番用である https://acme-v02.api.letsencrypt.org/directory をエンドポイントに指定して再度実行します。 ちゃんとTXTレコードが表示されました。 これをDNSサーバに登録して、何かキーを押すと、証明書が発行されます。 nginxで適当にWEBサーバを建てて、証明書の検証をしてみました。 特に警告が出ることもなく、緑色の鍵が表示されています。 発行者の名称の部分も、ステージングAPIでは Fake LE Intermediate X1 となっていましたが、ちゃんと正規の Let’s Encrypt Authority X3 となっています。 ねむいです。著書買ってくださると励みになります。 イラスト図解でよくわかる ITインフラの基礎知識
一応、コマンドを載せておきますと……
certbot-auto certonly --manual -d *.example.com -m mailaddr@example.com --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory
……って感じです。
これだけで「*.example.com」なサーバ証明書がゲットできるので、「www.example.com」でも「service.example.com」でも「ramentabetai.example.com」でもなんでもHTTPSで立ち上げられるようになるわけです。
地味な落とし穴が……
で、喜んでいたんですけど、ひとつ重大な問題が……。
それは「example.com」——ホスト/サブドメインが指定されていない「ドメイン名 Only」な場合には使えない証明書となっているということ。
実際に設定してみて、「https://example.com/」にアクセスしてみると……下記のようになってしまいます。
……え?ああ、そうなんだ……へぇ…… _ノ乙(、ン、)_
普通のサイト5)ところで、普通ってなんなんでしょうねぇ……(遠い目)だったら、例えば「www.example.com」のようなHTTPSなサイトにリダイレクトかけちゃえば問題ないんでしょうけど、HSTS (HTTP Strict Transport Security) の設定とかしてるとリダイレクト前にエラーになっちゃったりするので……6)ボクが設定ミスっていたり勘違いしている可能性もあるけど。
ちょっとマズイですよね。うん。
解決策は単純
まあ、これは深刻な問題では全くないんで、シンプルに解決することができます。
「*.example.com」で指定して発行されたサーバ証明書が「example.com」には対応していない……って話なので、「example.com」に対応するように指定してあげればOK。
具体的なコマンドで言えば、下記のような感じでしょうか。
certbot-auto certonly --manual -d example.com -d *.example.com -m mailaddr@example.com --agree-tos --manual-public-ip-logging-ok --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory
元々、certbot-autoは「-d」オプションで複数のドメインを指定できたので……。その要領で追加してあげればいい……って感じっぽいです。
将来の自分のためにメモを残しておきます
……と、きっと将来の自分がおんなじところでミスる気がしてならないので、自分用のメモって意味も込めてブログに書き記しておきます。
あ、「もっと良い方法あるよ〜」とか「そこ間違ってるよ〜」とかあれば、ぜひぜひツッコんでくださいm(_ _)m