ライン

ポイント:*

ライン

 はじめに

 費用をかけずにSSL化することができる Let's Encrypt のクローズドベータツター募集に参加したのですが、結果の返事をくれていなかったままでした。
半ば忘れていた頃、承認されたみたいでメールが届いていました。
ひとまず動かしてみようかな、というところまでやってみようと始めたページです。

ここで実施しているのは、FreeBSD 9.3-RELEASE系でApache 24系を利用した事例です。

 インストール

py27-letsencrypt

 あまり情報持っていないのですが、この手はやってみた方が早いと思ってやってみました。
現状、portsができあがっている段階ではあるので試してみます。

# pkg install py27-letsencrypt
...
New packages to be INSTALLED:
        py27-letsencrypt: 0.0.0.d20151104
        py27-openssl: 0.15.1
        py27-six: 1.9.0
        py27-cryptography: 1.0.2_2
        py27-enum34: 1.0.4
        py27-cffi: 1.2.1
        py27-pycparser: 2.10
        py27-asn1: 0.1.8,1
        py27-idna: 2.0
        py27-ipaddress: 1.0.14
        py27-psutil: 3.2.2
        py27-requests: 2.8.1
        py27-pyrfc3339: 0.2
        py27-pytz: 2015.7,1
        py27-parsedatetime: 1.4
        py27-zope.interface: 4.1.2
        py27-configobj: 5.0.6_1
        py27-zope.component: 3.12.1
        py27-zope.event: 3.5.2_1
        py27-acme: 0.0.0.d20151104
        py27-werkzeug: 0.10.4
        py27-ndg_httpsclient: 0.4.0_1
        py27-mock: 1.0.1_1
        py27-python2-pythondialog: 3.3.0
        py27-configargparse: 0.9.3

The process will require 22 MiB more space.
3 MiB to be downloaded.

Proceed with this action? [y/N]:Y

Message from py27-letsencrypt-0.0.0.d20151104:
===========================================================================

This software is a DEVELOPER PREVIEW intended for developers, testers and
early-adopters only. Support requests and bug reports should be sent directly
and only to the upstream project: https://github.com/letsencrypt/letsencrypt

letsencrypt is currently in Closed Beta (invite only). In order to
acquire certificates, you must have applied for and received an invitation,
and have your domains whitelisted FIRST.

This port installs the "standalone" Python client only, which does not use and
is not the letsencrypt-auto bootstrap/wrapper script.

By default, the client will authenticate and obtain certificates using, and
signed by a TEST(Staging) Certificate Authority (CA). These certificates will
NOT be trusted publicly.

To obtain certificates, use the --server argument pointing to the correct
server URL as documented in your invitation email, and use the 'certonly'
command as follows:

 # sudo letsencrypt --server <server-URL> certonly

Note: The client currently requires the ability to bind on TCP port 80. If
you have a server running on this port, it will need to be temporarily stopped
so that the standalone server can listen on that port to complete
authentication.

The letsencrypt plugins to support apache and nginx certificate installation
will be made available soon in the following ports:

 * Apache plugin: security/py-letsencrypt-apache
 * Nginx plugin: security/py-letsencrypt-nginx

===========================================================================

 残念ながら、プラグインはまだできていないタイミングみたい。
今回は、Apache24の鍵だけもらえれば十分なので、そこまでやってみることにします。

# letsencrypt --agree-dev-preview -d www.example.com auth

 まずはコマンドを入れてみる。最初は、電子メールアドレスの入力から始まる。

 
 

…と終わってしまいました。Apacheが既にあがっていて、port 80が利用中だとダメみたい。

At least one of the (possibly) required ports is already taken.

IMPORTANT NOTES:
 - If you lose your account credentials, you can recover through
   e-mails sent to foo@examplel.com.
 - Your account credentials have been saved in your Let's Encrypt
   configuration directory at /usr/local/etc/letsencrypt. You should
   make a secure backup of this folder now. This configuration
   directory will also contain certificates and private keys obtained
   by Let's Encrypt so making regular backups of this folder is ideal.

じゃぁ、認証するタイミングだけサーバを停止することに。(サーバのユーザはお気の毒に…。)

# letsencrypt certonly -a standalone --server https://acme-v01.api.letsencrypt.org/directory --agree-dev-preview -d www.example.com

こんなにしてみました。
これで終わるだろうと思っていましたが、また失敗。

IMPORTANT NOTES:
 - The following 'unauthorized' errors were reported by the server:

   Domains: www.example.com
   Error: The client lacks sufficient authorization

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A record(s) for that domain
   contain(s) the right IP address.

前提は、利用するサーバにDNS登録(Aレコード)ができていることなんだね。後からDNS登録はダメってことなんだ。
…というか、今回試そうと思っていたホストが、既に別サーバにAレコードが指定された状態でした。
じゃ、DNSを変更登録するまでいったん、Apache起動しておいて作業することにしました。

BINDのゾーンファイルを修正して設定してきました。
直後に再度同じコマンドで試したのですが、DNSがキャッシュされてしまっていて、コマンドを入れても以前のものを見に行ってしまいます。
TTL減らしていない状態相手のDNSサーバ上のキャッシュ影響を受けちゃっているみたいなので、どうも無理っぽい。

今やっている作業は、要するにこのプログラムで動作するホストから認証にして、鍵の更新などもこれで実施する…というものなんかなと理解し始めました。
SSL鍵の有効期間は3ヶ月。なので、その都度既存のApacheを停止し、鍵の更新作業が必要ということになりそうです。
でも、毎回Apache止めてられないので、Apache用プラグイン動かないと面倒そうだし、自動更新機能が早めに準備してくれないと面倒そう。
まぁ、portsももうすぐできそうな感じだし、自動更新機能(cronに入れるだけらしい)も3ヶ月間の有効期間内にはできるはずなので、それまでに対処すれば問題は生じなそうだけど。
…ということで、まずはDNSキャッシュが切れる明日に続く…。
--------------------------------------------------------------

はい、ここで上の翌日で作業を再開しています。TTLは念のために、小さな値にした状態に変えました。
昨日のコマンドを再度入力。今度は大丈夫!!

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /usr/local/etc/letsencrypt/live/www.example.com/fullchain.pem. Your
   cert will expire on 2016-02-16. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.

ここは通りました。しかし、気づくとログが沢山できている。これはなんだっけ。

#ll /var/log/letsencrypt
total 308
-rw-r--r--  1 root  wheel  41819 Nov 18 21:31 letsencrypt.log
-rw-r--r--  1 root  wheel  11814 Nov 18 21:30 letsencrypt.log.1
-rw-r--r--  1 root  wheel  25503 Nov 17 21:22 letsencrypt.log.10
-rw-r--r--  1 root  wheel  25504 Nov 17 21:46 letsencrypt.log.2
-rw-r--r--  1 root  wheel  28652 Nov 17 21:45 letsencrypt.log.3
-rw-r--r--  1 root  wheel  25572 Nov 17 21:44 letsencrypt.log.4
-rw-r--r--  1 root  wheel  25559 Nov 17 21:43 letsencrypt.log.5
-rw-r--r--  1 root  wheel  28671 Nov 17 21:37 letsencrypt.log.6
-rw-r--r--  1 root  wheel  28221 Nov 17 21:34 letsencrypt.log.7
-rw-r--r--  1 root  wheel  28193 Nov 17 21:31 letsencrypt.log.8
-rw-r--r--  1 root  wheel  25140 Nov 17 21:23 letsencrypt.log.9*

作業するたびに残る仕様?ログは、UTCな時間で残っていました。
特に問題はなさそうかな。

では、できあがった鍵がどんな感じかを確認していきます。

# cd /usr/local/etc/letsencrypt/live
# ll
total 4
drwxr-xr-x  2 root  wheel  512 Nov 18 21:31 www.example.com/
# ll www.example.com/
total 0
lrwxr-xr-x  1 root  wheel  39 Nov 18 21:31 cert.pem@ -> ../../archive/www.example.com/cert1.pem
lrwxr-xr-x  1 root  wheel  40 Nov 18 21:31 chain.pem@ -> ../../archive/www.example.com/chain1.pem
lrwxr-xr-x  1 root  wheel  44 Nov 18 21:31 fullchain.pem@ -> ../../archive/www.example.com/fullchain1.pem
lrwxr-xr-x  1 root  wheel  42 Nov 18 21:31 privkey.pem@ -> ../../archive/www.example.com/privkey1.pem

鍵はできているみたいです。/usr/local/etc/letsencrypt/archive/www.example.com/ 以下にあるわけですね。
とりあえず…このパーミッションはやだな。

# cd /usr/local/etc/letsencrypt/archive/www.example.com/
# chmod 400 *

のようにしました。

# openssl x509 -text -noout -in ./cert1.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            -省略-
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X1
        Validity
            Not Before: Nov 18 11:31:00 2015 GMT
            Not After : Feb 16 11:31:00 2016 GMT
        Subject: CN=www.example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (2048 bit)
                Modulus (2048 bit):
...

ふむ。良さそうな感じだ。SSLの有効期限は想定通りで2月で切れるんだな。

ではとりあえず、apacheで動かしてみよう。
ドキュメントルートにindex.htmlをおいて。

そして、今回用の設定ファイルとして /usr/local/etc/apache24/Includes以下に www.example.com.conf を置き、以下みたくつくりました。
3行の鍵部分だけがポイントで他はまぁ既存の設定にそんなには変えていません。

<VirtualHost xxx.yyy.zzz.aaa:443>
        ServerName      www.example.com
        SSLProtocol -ALL -SSLv3 +TLSv1
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5

        SSLEngine on
#      SSLCertificateFile      "/usr/local/etc/letsencrypt/archive/www.example.com/cert1.pem"
#      SSLCertificateKeyFile   "/usr/local/etc/letsencrypt/archive/www.example.com/privkey1.pem"
#      SSLCertificateChainFile "/usr/local/etc/letsencrypt/archive/www.example.com/chain1.pem"
        SSLCertificateFile      "/usr/local/etc/letsencrypt/live/www.example.com/cert.pem"
        SSLCertificateKeyFile   "/usr/local/etc/letsencrypt/live/www.example.com/privkey.pem"
        SSLCertificateChainFile "/usr/local/etc/letsencrypt/live/www.example.com/chain.pem"

        ServerAdmin             foo@example.com
        DocumentRoot            /home/docroot/www.example.com/
        HostNameLookups ON

        ErrorLog                /var/log/http-www-example.com-error_log
        CustomLog             /var/log/http-www-example.com-access.log combined
        <Directory "/home/docroot/www.example.com/">
                AllowOverride   FileInfo Limit
                Require all     granted
                Deny from .cn
        </Directory>
</VirtualHost>

後は、

# /usr/local/etc/rc.d/apache24 configtest
Performing sanity check on apache24 configuration:
Syntax OK
# /usr/local/etc/rc.d/apache24 graceful
Performing sanity check on apache24 configuration:
Syntax OK
Performing a graceful restart

のように起動しました。
主要なブラウザよりアクセスして、証明書関連の部分を確認してみます。

 
 
 
 
 

 ちゃんとSSLでエラーも出ずに利用ができています。

…ということで、Apacheのプラグインとか、自動更新させるツールとかはリリースされてきたら試そうと思います。
オレオレ証明書を準備するよりかは簡単に利用できた感じ。SSL化して見せたいだけ程度なら、全然これで問題無いなって思いました。
ラピッドSSLを来年更新するかどうかは、この先にどんな感じで継続利用できるかによりそうです…。
意味はわかったので、LinuxでもWindowsでもどうにでもできそうな感じです。

パブリックベータになったそうです。portsの方はまた更新版出てきていないけど。

 証明書の更新

webrootプラグインはうまくできなかった

 2月で証明書が切れてしまうのに、放置したくなかったので更新を試行錯誤したのですが、FreeBSD 9.3の私の環境ではうまくいってくれなかった。
なので、これまでに同様、更新をスタンドアロンで実施したメモを残します。

まず、Apacheのサービスを停止。

# service apache24 stop

そして、更新コマンド。

# /usr/local/bin/letsencrypt certonly -a standalone --renew-by-default -w /home/docroot/www.example.com/ -d www.example.com

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /usr/local/etc/letsencrypt/live/www.example.com/fullchain.pem. Your
   cert will expire on 2016-04-23. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.
 - If like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

このやり方では問題なくいきました。

# service apache24 start

ウェブサーバのサービスを復活させて完了。

鍵は、

-r--------  1 root  wheel  1801 Nov 18 21:31 cert1.pem
-rw-r--r--  1 root  wheel  1797 Jan 24 23:51 cert2.pem
-r--------  1 root  wheel  1675 Nov 18 21:31 chain1.pem
-rw-r--r--  1 root  wheel  1675 Jan 24 23:51 chain2.pem
-r--------  1 root  wheel  3476 Nov 18 21:31 fullchain1.pem
-rw-r--r--  1 root  wheel  3472 Jan 24 23:51 fullchain2.pem
-r--------  1 root  wheel  1679 Nov 18 21:31 privkey1.pem
-rw-r--r--  1 root  wheel  1679 Jan 24 23:51 privkey2.pem

のようになっていましたので、

# chmod 400 *

としました。ウェブアクセスして確認します。

証明書はちゃんと更新されていることを確認できました。

ちなみに、うまくいかなかったケースのエラーの内容は、

Error: urn:acme:error:badNonce :: The client sent an unacceptable anti-replay nonce :: JWS has invalid anti-replay nonce

や、

FailedChallenges: Failed authorization procedure. www.example.com (http-01): urn:acme:error:unauthorized
 :: The client lacks sufficient authorization :: Invalid response
 from http://www.example.com/.well-known/acme-challenge/~ [XXX.YYY.ZZZ.aaa]: 404

のようなものでした。今後自動更新をする際に面倒にならないように、動きは確認しておきたいと思っています。

まぁ、今回の実施したものでも、短時間のサービス停止はともないますが自動化することができるので、心配することはなくなりました。

【改訂履歴】作成:2015/11/17 更新:2016/1/25
【参考リンク】

ユーザガイド…英語版のみです

Copyright © 1996,1997-2006,2007- by F.Kimura,