脱力系備忘録BloG ホーム »FreeBSDに無料SSL証明書letsencrypt導入テスト

FreeBSDに無料SSL証明書letsencrypt導入テスト  

ちょうど1年前に書いた無料SSL証明書発行サービス「Let's Encrypt」の、パブリック・ベータ版が先月公開されました。

今回、テストサーバーで試行錯誤しながらなんとか動作確認できましたので、導入方法、SSL関連ファイルのことなどを備忘録しておこうと思います。
■Let's encryptとは?

無料でSSL証明書SSLサーバ証明書)を発行してくれるサービスです。
認証方式は「ドメイン認証型(DV)」のみですので、アドレスバーを緑にすることはできません。

通常は自分で鍵など必要ファイルを作成し、認証局にお金を払って、広く信頼されている署名の付いた証明書を発行してもらいます。
ので、手間とお金がかかります。
それを全てなくしてしまうのが「Let's encrypt」です。
これは、専用のコマンドをサーバーに導入し、そのコマンドで鍵の作成から証明書の受け取りまで、あるいは証明書を各設定ファイルに書き込むことまでやってしまおうという取り組みです。

【通常】
●秘密鍵の作成(keyファイル)
●秘密鍵を元に証明書署名要求ファイルの作成(csrファイル)
●認証局による審査
●SSLサーバ証明書をメールなどで受け取る(crtファイル)


【Let's encrypt】
●専用コマンドを実行



■最初、自分が戸惑った点

●秘密鍵ファイルにパスワード設定をせずに作成するんだね
→別にいらんか

●国コードや組織名の入力もないんだな
→別にいらんか。今までも適当だったし。


■Let's encrypt証明書の注意点

有効期間が90日しかありません。
これは、この企画の狙いがSSL発行を簡素化、自動化し、普及を促進するためだと思います。
短期間化することで、管理者の尻を叩いて自動化の仕組みを導入させようという意図でしょう。


■導入方法

●テスト環境
OS:FreeBSD10.2
WEB:Apache2.2
IMAP:Dovecot2

※2016年8月26日追記
FreeBSDのLet's encryptコマンドが変わっていました。
(旧) letsencrypt → (新) certbot

これによって、以下の点が変更になっています。

■インストール
# pkg install py27-certbot


■コマンド
/usr/local/bin/certbot


■新規証明書取得
# certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com -w /var/www/thing -d thing.is -d m.thing.is -m root@example.com --agree-tos


■証明書更新
これが凄く簡単になっています。

# certbot renew

これだけ。

複数証明書を取得していても、上記コマンド一発で全ての証明書が更新されます。
(例)
# certbot certonly --webroot -w /var/www/example1 -d example1.com -m root@example1.com --agree-tos
# certbot certonly --webroot -w /var/www/example2 -d example2.com -m root@example2.com --agree-tos

この様に証明書を取得したら

/usr/local/etc/letsencrypt/live/ 以下に2つの証明書ディレクトリが出来、その中に各種ファイルが出来ますが、

# certbot renew

で全ての更新が出来ます。

ちなみに、更新のテスト(実際には更新しない)をしたい場合は、

# certbot renew --dry-run

で確認が出来ます。
なお、更新時にメッセージを表示する必要がない場合は

# certbot renew --quiet

で無言で処理が行われます。

新コマンド「certbot」の詳細はこちら

このページ、ちょっとまとめ直さないと見難いな


専用コマンドがPORTSで提供されています。
※2016年2月8日追記
pkgでのインストールの方が簡単でした。
# pkg install py27-letsencrypt
それに、pkgでインストールした場合、ほぼ「py27(仮想python環境?)」関連のプログラムだけがインストールされましたが、PORTSでインストールしたら、「py27」関連以外にもなにやらいろいろ入ってました。
ということで、テストサーバーを作り直し、pkgでインストールしてテストしたところ問題なく使えたということを追記しておきます。
以下は最初に記載したPORTSでの導入です。
あ、「インストール完了」後の説明はPORTSもpkgも同じです。念為
Let's Encryptインストール関連参考ページ

PORTSを更新

# portsnap fetch
# portsnap extract ※初回
# portsnap update ※二回目以降

# cd /usr/ports/security/py-letsencrypt
# make install clean

pkgが古いと怒られる。

# pkg upgrade

# make install clean

途中マニュアルを作るか?みたいなことを聞いてきたけど全てチェックをはずして進めました。

インストール完了。
コマンドは
/usr/local/bin/letsencrypt
です。

それでは証明書を取得します。
SSL証明書を取りたいFQDNhttpd.confに「非SSL」で登録し、外部から「http://」でWEBアクセスできるようにしておきます。
(例)
<VirtualHost *>
    ServerName ssl.toriatama.bird
    DocumentRoot /usr/home/tori/dummy-directory
    ~
</VirtualHost>


もし、SSL接続(https://)専用ドメインにする場合、「/usr/home/tori/dummy-directory」ディレクトリは作成するだけでOKです。index.htmlとかいりません。
しかし、90日後のSSL証明書更新処理に備え、このhttpd.conf設定は証明書取得後も残しておくことになると思います。普段の運用中に外部からアクセスがあっても問題ないように気をつけてください。

httpdを起動して以下のコマンドを実行。
※「certonly」オプションは証明書を取得するまでで止めるオプションです。Apache2.4なら「run」オプションで設定ファイルの更新までやってくれるようです。

# letsencrypt certonly --webroot -w /usr/home/tori/dummy-directory -d ssl.toriatama.bird -m admin@toriatama.bird --agree-tos

実行すると、このドメインが有効か?WEBアクセス確認されます。
また、メールも有効なものでないと失敗します(特にメールが届くわけではない)。
成功した場合、

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
   /usr/local/etc/letsencrypt/live/ssl.toriatama.bird/fullchain.pem.
   ~

というコメントが表示されます。
ということで、
/usr/local/etc/letsencrypt/live/ssl.toriatama.bird
ディレクトリを見てみると
cert.pem
chain.pem
fullchain.pem
privkey.pem
ができています。
上記ファイルは全てシンボリックリンクで、本体は
/usr/local/etc/letsencrypt/archive/ssl.toriatama.bird
cert*.pem
chain*.pem
fullchain*.pem
privkey*.pem
です。
※「*」は数字。初めての取得時に「1」が付き、以後、更新するたびに数値が上がっていく
なお、各ファイルの意味はこちらのサイトに詳しく書かれています。

では、各種設定ファイルに採用しましょう。

●httpd.confの設定
<VirtualHost *:443>
    ServerName ssl.toriatama.bird
    DocumentRoot /usr/home/tori/public_html
    ~
    SSLCertificateFile /usr/local/etc/letsencrypt/live/ssl.toriatama.bird/cert.pem
    SSLCertificateKeyFile /usr/local/etc/letsencrypt/live/ssl.toriatama.bird/privkey.pem
    SSLCertificateChainFile /usr/local/etc/letsencrypt/live/ssl.toriatama.bird/chain.pem
</VirtualHost>


●DOVECOT設定
10-ssl.confを編集
ssl_cert = </usr/local/etc/letsencrypt/live/ssl.toriatama.bird/fullchain.pem
ssl_key = </usr/local/etc/letsencrypt/live/ssl.toriatama.bird/privkey.pem



■証明書の更新

取得時のコマンドとほぼ同じ。

# letsencrypt certonly --webroot -w /usr/home/tori/dummy-directory -d ssl.toriatama.bird --renew-by-default

前述したように更新時に新しいファイルがナンバリングされて作成されますが、自動的に「live」ディレクトリ配下のシンボリックリンクが更新されるので、「live」配下のファイルを使用している場合はファイル名の変更処理を行う必要がありません。
注意点として、更新処理の際に「http://FQDN」へのアクセスがあるため、証明書を取りたいURLが外部からWEBアクセスできるようにしておく必要があります(非SSL)。
それと、更新後Apacheの再起動が必要。DOVECOTもたぶん必要。

そして、前述したように有効期間が短いため手動更新は現実的ではない。CRONを使って自動的に更新させたい。そこで、以下のようなバッチを書いてみた。

letsencrypt.sh
#!/bin/tcsh

(/usr/local/bin/letsencrypt certonly --webroot -w /usr/home/tori/dummy-directory -d ssl.toriatama.bird --renew-by-default > letsencrypt.ok) >& letsencrypt.ng
(/usr/local/apache2/bin/httpd -k restart >> letsencrypt.ok) >>& letsencrypt.ng
(/usr/local/sbin/dovecot reload >> letsencrypt.ok) >>& letsencrypt.ng


これをCRONで月一ぐらいで動かせばいい気がする。
んで、ngファイルにログが書かれた場合はメールが飛んでくるようになったらいいなあ(チラッ

■複数ドメインを一つの証明書で取得する場合

# letsencrypt certonly --webroot
-w /usr/home/tori/dummy-directory -d ssl.toriatama.bird
-w /usr/home/bird/public_html -d www.birdhead.tori
-m admin@toriatama.bird --agree-tos


上記のように複数指定する。
この場合、一番最初のドメイン名の証明書格納ディレクトリが作成され、その中のファイル群も単独取得時と同じ構成になっているが、証明書が複数ドメインに対応した内容になっている。
httpd.confの該当VirtualHostディレクティブでそのファイルを指定する。


■SSLの今後はどうなるんだろう?

先に書いたようにこのサービスは「ドメイン認証型」のみ提供するようです。
この「DV認証」では通信の秘匿が保証されるだけで、サイトの信頼性が保証される訳ではありません。
銀行などは言うに及ばず、一般企業もSSL証明書は「実在証明型(OV)」、さらに信頼性を目指した「Extended Validation型(EV)」が必要でしょう。
ですので、SSL証明書業界が破綻することはありませんが・・・RapidSSLやPositiveSSLといった格安が売りのDV型証明書は・・・その存在意義がなくなるかもしれませんね。
そして、それらを売りにしていた取次ぎ業者も・・・。
この世界は変化が速く、大きいので・・・怖い・・・。明日は我が身か・・・。

まあ、今のとこ「Let's Encrypt」は「サイトシール」を発行していないので、それが欲しい方は他を利用することになるでしょうし、取得方法の違いもあってまだ少し住み分けが続きそうですが。

格安のサイトシール付きSSL証明書が欲しい方はSSLボックス
関連記事

category: サーバー

この記事へのコメント

コメントの投稿

非公開コメント

コメントは全て管理人が内容を確認してから表示されます(非公開コメント除く)。
内容によっては表示されない場合がありますことご了承願います。

プロフィール

お問い合わせ

最新記事

最新コメント

▲ Pagetop