PHPでSSLの情報を取得する

以前にも少し仕掛けていたのですが、PHPでSSLの情報を取得するクラスを作りました。
正確には、作りかけていたクラスをしっかりした形に直しました。
ベースとなっていたソケットを使用する方法に、エラー判定や新しいメソッドを追加したりした上で、
cURLを使用する方法を追加しました。
モードを切り替えることで、ソケットとcURLを使い分けられるわけですが、VPSでもレンサバでも、どっちも動くみたいなので、1つのクラスに両方を実装した意味があったのかどうかは謎です。

で、新しく用意したクラスを使ったツールは、「SSL情報取得」にて公開しました。
サーバー管理ツールに組み込んだり、結果をフックして通知させたり、API的に使えるようになるといいかもですね。
いい加減に、Let’s Encryptの更新漏れを見落とさないようにしないと…

SSLの有効期限を得る方法のメモ

PHPで必要になって調べていましたが、ストリームを使うよりもコマンドを叩いたほうが確実で速いのでした。

openssl s_client -connect exsample.com:443 -servername exsample.com < /dev/null 2> /dev/null | openssl x509 -text | grep Not

仮想ホストの場合は-servernameを入れておかないと、メインのドメイン名で取得しに行くので正しくない値が返ってくる。

…WordPressの新しいエディタ、本当に使いにくい。

やっと1台のサーバーにSSLサイトを複数設置させられた

Apacheの設定の話です。
NSIとかSANsで1つのSSL証明で複数のSSLサイトを認証させる場合。
ルートに設定を書いても駄目で、仮想ホストごとにSSLの設定を書くべし。
細かい説明はなしで、とりあえずメモ程度に
以下のコードを繰り返し書くだけでいい。

とにかく
NameVirtualHost *:80
NameVirtualHost *:443
を忘れると思い通りに動かない
最低限の設定なので、実際にはもっとしっかり書くこと

httpd.conf

NameVirtualHost *:80
NameVirtualHost *:443

#---- www1.exsample.com
<VirtualHost *:80>
    ServerName a.exsample.com
    RewriteEngine On
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [L,QSA,R=permanent]
</VirtualHost>
<VirtualHost *:443>
    DocumentRoot /home/www/public_html
    ServerName www1.exsample.com

    #--- SSL
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/www1.exsample.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/www1.exsample.com/privkey.pem
    SSLCACertificateFile /etc/letsencrypt/live/www1.exsample.com/chain.pem
</VirtualHost>
#---- /www1.exsample.com

Let’s Encrypt の複数ドメイン対応SSL導入に手こずる

SANs証明とかいうやつで、1つの証明書で複数のドメインに対応させるやつです。
細かいことは省きます。

やりたかったこと
複数のホスト名で、1つのシステムにアクセスする
システムでホスト名を判別しているのでサーバー側ではイジる必要がない

まずはSSL化したいホスト名でアクセスできるようにApacheを設定して、1つ目のサーバーのドキュメントルート下の「/.well-known/acme-challenge/」にファイル書き込めるようにアクセス権を設定、さらにAliasを張って他のホスト名からも見られるようにする
※-dで指定するけど今回はパス

./certbot-auto certonly –webroot -w /home/www/public_html/ -d san1.exsample.com -d san2.exsample.com

重要なのは、ホスト名ごとに仮想サーバーを設定すること。別名ではcertbotが認識してくれない
※させる方法もあるのかな?

覚えておくこと
導入できたSSLは1つ目のホスト名で登録される
SSL証明を見るとDNS設定で同居しているホスト名が見えるので、バレては困る場合は使えない(IPでもわかるがサーバーが同じだからと初留者が同じとは限らないが、SSLでは所有者が同じでないと同居できない)

これでVPSを纏めることができる、かなり節約になるかな。
余裕できたらサイトを量産するぞ~

SSL「Let’s Encrypt」を自動更新するためのメモ

ここはCnetOS6+Apache httpdでLet’s Encryptを自動更新するためのメモです。

カレントディレクトリを作業用など適当に変更して

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
./certbot-auto

多分上のコマンドでいろいろ追加インストールしたり、バージョンが違うので揃えろとかいわれるので諸々対応を済ませ

certbot certonly --agree-tos --webroot -w /var/www/html/ -d example.com

上のようにサーバーの設定を入力すると

/etc/letsencrypt/live/example.com/

ここにpemが生成されるので

SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
SSLCACertificateFile /etc/letsencrypt/live/example.com/chain.pem

を設定してウェブサーバーを再起動
ちなみに、Apacheが2.4.8以上はfullchain.pemにしないといけないらしい。
そして、cronに次のコマンドを月イチ実行で登録する。

/usr/bin/certbot-auto renew --post-hook "service httpd reload"

問題ないかどうかはとりあえず実行すれば確認できる。
更新頻度が高いとまだしなくていいよって怒られるようです。