SSL非対応のweb pageなんてイマドキじゃない、ということらしいのでここもSSL対応してみました。とはいえ、IPv4(ik1-342-31132.vs.sakura.ne.jp)側のみの対応です。
まずは証明書の入手ですが、Let's Encryptでお手軽にやろうとしてもさくらのドメインからではRate Limitsに引っかかってしまうのでCheapSSLsecurityからCOMODO PositiveSSLを購入しました。通常だと$25.97/4年のようですが、何かのキャンペーンをやっていたらしく$15.56/4年で買えました。
最初に代金をクレジットカードかPayPalで支払い、Dashboardからオーダーを出していきます。基本的には書かれていることに従って作業を進めていきますが、ホスト名を書く欄が無くて戸惑いました。これはHow to Generate a CSR: Apache OpenSSLに書いてあるように、CSRを作成する際のCommon Nameのところで記述します。openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csrで作成した秘密鍵(server.key)はApacheの設定でも使いますので、捨てないように。
ホスト名の確認はe-mailもしくはwebサーバ上に配置した認証用のファイルを使う方法がありますが、自分は後者を使いました。Download Auth Fileでダウンロードしたファイルを、http://your-domain.com/.well-known/pki-validation/<filename>となるように配置して、確認が取れればDownload Certificateで証明書を受け取れるようになります。
入手した証明書はzipのアーカイブになっていて、AddTrustExternalCARoot.crt(ルート証明書)、COMODORSAAddTrustCA.crt(中間証明書1)、COMODORSADomainValidationSecureServerCA.crt(中間証明書2)、<hostname>.crt(サーバ証明書)の4つのファイルが入っています。ここから、ApacheのSSLCertificateFile(server.crt), SSLCACertificateFile(ca-bundle.crt)を作ります。
- server.crt
- <hostname>.crtと同じものです。
- ca-bundle.crt
- cat COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt > ca-bundle.crt で作ります。中間証明書2→1の順番である必要があります(参考:ELB の ComodoSSL 証明書を更新・Comodo PositiveSSL サーバー証明書インストール)。
SSLCertificateKeyFileで指定するserver.keyについては、CSR作成時に得たserver.keyそのものです。ファイル置き場は色々な流儀があるようですが、とりあえず/etc/ssl/{server.crt,ca-bundle.crt}, /etc/ssl/private/server.keyとしています。
必要なファイルが揃ったので、Apacheの設定です。自分はtar ballからビルドしたapache-2.4.33を使っていますので、OpenBSD標準のものとは異なります。
- /usr/local/apache2/conf/httpd.conf
- LoadModule socache_shmcb_module modules/mod_socache_shmcb.so, LoadModule ssl_module modules/mod_ssl.so, Include conf/extra/httpd-ssl.conf これらのコメントアウトを解除
- /usr/local/apache2/conf/extra/httpd-ssl.conf
- SSLCertificateFile, SSLCertificateKeyFile, SSLCACertificateFileにそれぞれ必要なファイルの所在を記述。SSLProtocol, SSLProxyProtocolはデフォルトのall -SSLv3から+TLSv1.2に変更。
きちんとTLS1.2のみに制限できているかどうかの確認は、openssl s_client -connect your-domain.com:443 -tls1_1で行えます(参考:Apache で https のプロトコルを TLS1.2 のみに制限する)。
とりあえず、このような場末のweb日記でもSSLに対応できるようですが、どんな意味があるんですかね…58.75kg(23:15)
01-Jul-2018補足:httpd-ssl.conf、<VirtualHost _default_:443>だとIPv6(153.126.212.136.v6.sakura.ne.jp)側からもSSL接続を受け付けてしまう(が証明書が対応していないためにYour connection is not secureとなってしまう)ので、<VirtualHost 153.126.212.136:443>として制限する必要があります。
マルチドメイン対応の証明書は非常に高価なため、IPv6用の証明書を一枚追加すれば良さそうですが今のところはIPv4のみのSSL対応とします。
28-May-2020補足:証明書の更新が必要になったので更新作業を行っていますが、zipアーカイブの中身が少し変わっているので書いておきます。今の物はCER - CRT FilesとPlain Text Filesの二つのディレクトリにそれぞれ拡張子が.crtのものと.txtの物が格納されていますが、拡張子が違うだけで中身は同じでした。とりあえずCER - CRT Filesにあるファイル名の意味は
- AAACertificateServices.crt
- (1)ルート証明書
- USERTrustRSAAAACA.crt
- (2)中間証明書1
- SectigoRSADomainValidationSecureServerCA.crt
- (3)中間証明書2
- <your-domain>.crt
- (4)サーバ証明書
- My_CA_Bundle.ca-bundle
- (5)(1)〜(3)をバンドルした物
ということみたいです(参考文献:COMODOサポート・コード証明書の場合のルート証明書や中間証明書はどれですか?)。Certificate Decoderにあるopenssl x509 -in <CA_Bundle> -text -nooutでcat SectigoRSADomainValidationSecureServerCA.crt USERTrustRSAAAACA.crt AAACertificateServices.crt > ca-bundle.crtで得られた物と、My_CA_Bundle.ca_bundleを比較してみましたが、同じ結果になりました。
なので手っ取り早く作業するなら、
- SSLCertificateFile
- <your-domain>.crt
- SSLCertificateKeyFile
- CSR作成時に得たserver.key
- SSLCACertificateFile
- My_CA_Bundle.ca-bundle
を使えば良さそうです。