7月 112016
 

今年の四月くらいに FreeBSD でも Let’s Encrypt が利用できるようになった。と言う話を耳にして、当時は letsencrypt コマンド(当時の ports 的には security/py-letsencrypt) を利用するとサクサクっと Let’s Encrypt な証明書を利用したSSL サーバが利用可能な状態となりました。
それから約三ヶ月が過ぎて Let’s Encrypt 的にもコマンドが letsencrypt-auto から certbot-auto になって、 FreeBSD の ports 的には security/py-certbot もしくは security/letsencrypt.sh という二つの実装が提供されるようになりました。

さて。今年の四月くらいに letsencrypt コマンドで生成した証明書が有効期限切れになるのでアップデートしようと思い、普段からこまめに portmaster -D -a している環境においては既に letsencrypt がなくなっていたので certbot で実行したら以下のようなエラーが出てまるで動作しなくなってしまった・・。 orz

SSLError: ("bad handshake: Error([('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')],)",)

 

なんかねぇ。おかしいんですよ。で、色々聞いたり調べたりしたところ、どうやら security/ca_root_nss のインストールが変なんじゃないか? という結論に達したのであります。

security/ca_root_nss をインストールするときの make config で 以下のように ETCSYMLINK のオプションを [X] にしてあげないとダメなようです。

ca_root_cert

上記オプションを有効にして make install すると /etc/ssl/cert.pem が sysmlink で生成されるようになります。 ETCSYMLINK のオプションは以前は [ ] な時期(それはつまりはオフになっている状態。と、いうことです)もあったりしたので古い make config の情報を使いまわしている人は ずっとオフのまんまで来ていたりするので『自分の make config の結果はどっちだったかな?』などと、確認するのも良いかもしれないです。

letsencrypt コマンドのときは /etc/ssl/cert.pem が無くとも大丈夫だったのに certbot コマンドを利用するようになったら /etc/ssl/cert.pem が必要になりました。ふむー。

/etc/ssl/cert.pem と同じファイルは全部で以下が存在します。

/usr/local/share/certs/ca-root-nss.crt
/usr/local/openssl/cert.pem
/usr/local/etc/ssl/cert.pem
/etc/ssl/cert.pem

うーむ。 ports からインストールしたものは素直に /usr/local/etc/ssl/cert.pem を参照してくれれば良いのになぁ。などと思うのですが、この辺り、見事に『はまり道』です。

ports から security/py-certbot をインストールして上記のようなエラーメッセージが出てまともに動作しない場合には是非 /etc/ssl/cert.pem があるかを確認してみてください。

 
あと、 /etc/ssl/cert.pem はあるけど、それでも上記のエラーメッセージが出て certbot コマンドが動作しないことがあるかもしれませんが、それは多分、過去に letsencrypt コマンドで既に証明書を発行してもらい、その後の証明書ファイルの更新時にcertbot コマンドを利用しようとすると発生するのではないかと思われます。
その場合は悲しいけれども、一旦 /usr/local/etc/letsencrypt/ ディレクトリを削除もしくは名前変更してから再度、新規に /usr/local/etc/letsencrypt/ ディレクトリを作成すると無事に動作します。古いコマンドを実行したときに参照した cert.pem ファイルの情報を保持しているのでしょうなぁ。

以上、FreeBSD において certbot を使ったときの『はまり道』についてなのでありました。

あ。 certbot の使い方とか書いてないですが、大丈夫ですよね?;-)。