もう動いてるプロジェクト皆無だし墓場みたいなものなんだけど...
きっかけはCVMU(cvmu.jp)のSSL証明書の更新案内が来たこと。
以前は3年更新できたけど、昨今のセキュリティ事情からか1年になり、しかもレンタルサーバではない(さくらVPS)のでCSR作ったり中間証明書とくっつけたりと手動作業が必要で面倒。
おまけに990円もかかる。金かけて手間かけてほぼゴミサイトと化してるところの証明書更新しないといけないの!?
じゃあ更新せず非TLS(HTTP)にするか閉鎖すればいいかというと、個人的に細々と使ってはいるし、HSTS preloadに登録してるから非TLSに落とすと面倒。(Chromeとかでhttp://~って打ってもhttps://~になっちゃう)
ならばいっそLet's Encryptに再挑戦してみようということで、手順をぐぐってやってみたらあっさり成功した。
一応参考にしたのはここ>CentOS 7のNginxにLet's Encryptを導入してサイトをHTTPS化する方法 - レムシステム エンジニアブログ
ということでCVMUはJPRS→Let's Encryptに移行。
MCRN(mcrn.jp、ここ)は引き続きJPRSを維持。さくらレンタルサーバなので自動インストールで簡単に更新できるからね。あとCVMUよりはブログとかで対外的に使ってるし。
異世界に転生して...じゃなくて。
※没りそうになったので当初予定の9割削減でお送りしております。
- Symantecがやらかしたせいで証明書更新が必要になった
- その時の私の環境
さくらインターネット(以下さくら)で以下の契約をしていた
- レンタルサーバ:mcrn.jpに割り当て
- VPS:cvmu.jpに割り当て
- SSL証明書:上記2つそれぞれにラピッドSSLで用意
mcrnは手動プラン、cvmuはレンタルサーバ用自動プラン
- さくらではSSL証明書は2回更新が必要だった
- 1回目の時は無事更新成功
- 2回目の前に、諸事情でcvmu.jpをレンタルサーバからVPSに移行
その際に、Let'sEncryptに失敗し、面倒なので期限の残ってたSSL証明書を引っこ抜いて流用
- 2回目の通知が来たとき、それをすっかり忘れてcvmuの分を更新手続きし、放置
- 当然レンタルサーバではなくなっているので自動で進むはずがない
- 手続き後、すぐにレンタルサーバ側から認証ファイルをVPSに移動していれば問題なかったはず
- 先日「まだ更新されてないよ、このままだとChrome70でエラーが」的なメールが来て気付く
- 慌てて認証ファイルを移動するも当然時間切れ(変化なし)
で、ダメ元でさくらのサポートに連絡したら、認証局に連絡して新しい認証ファイル発行してもらい、無事更新完了した。
どう考えてもこっちの落ち度なのに対応してくれたし、かなりスムーズだった。
もしかして結構こういうユーザーいるのかな...?
最近Twitterで済ませることが多くなってきて、ほぼ休止状態のブログ。
今回のも小ネタだしTwitterで済ませようかな...とも思ったけど、わざわざ有料SSL契約してるのに使わない(使わせない?)のはもったいないのでブログに。
Symatecの証明書がGoogleに無効化された件で、一度更新したはずの証明書、実はまだダメだったためもう一度更新してってメールがさくらから届いた。
...うん、知ってた。Impressの記事で読んで「あ~、これもう一回くるな~」って思ってた。
まあ、面倒がってても仕方ないのでさくっと更新。この記事を書いてる時点でmcrn.jpは既に更新済み、cvmu.jpはRSプランなのでさくら側の作業待ち。
今回の更新でルートCAがGeoTrustからDigiCertに変わった。見てる側には何の影響もないけど。
このサイト(mcrn.jp)を常時SSL化&HSTS化してもう10ヶ月。
さくらからSSL証明書更新のお知らせが届いた(2ヶ月前と1ヶ月前に届く)。
ところが、手順通りやっても更新できない。
何度やっても「新規取得」しか選べない。
もしかして更新できる時期になってない!?でも90日切ったら可能って書いてあるんだけど...。
しかし、その原因は意外なところにあった。
なんてことはない、ただRubyでHTTPSなWebサーバにアクセスしてGETでデータをとってくるというだけの話なんだけど...
問題発生
まず思いついたのがこのコード。
require 'net/https'
Net::HTTP.get(URI.parse("https://mcrn.jp/ret.cgi"))
しかし、次のようなエラーが返ってきてしまう。
OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
from C:/Ruby21x/lib/ruby/2.1.0/net/http.rb:923:in `connect'
原因究明
もしかしてSNIに対応していない?と思ったけど違った(4年以上前に対応してる)。
さらに調べて、以下の記事をヒントに証明書の場所を調べてみてびっくり。
エラー:OpenSSL::SSL::SSLError SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed - komiyakの通り道
require 'openssl'
p OpenSSL::X509::DEFAULT_CERT_FILE
"C:/Users/Justin/Projects/knap-build/var/knapsack/software/x64-windows/openssl/1.0.1l/ssl/cert.pem"
=> "C:/Users/Justin/Projects/knap-build/var/knapsack/software/x64-windows/openssl/1.0.1l/ssl/cert.pem"
Justin!?誰???(※1)
ブログ移行に伴い、sblo.mcrn.jpをさくらのブログから外してリダイレクト用に設定しなおしたので、ついでに証明書を取ってSSL化。
これでmcrn.jp配下のドメインは全部SSL化できたので、.htaccessのHSTS設定にに「includeSubdomains」と「preload」を追加(※1)して、HSTS Preload Submissionに申請。
反映までにしばらくかかるけど、preloadじゃないHSTSは既に効いてる状態なので、.htaccessの強制HTTPSリダイレクトと組み合わせて完全HTTPSが実現。
mcrn.jpとは別のドメインに2個目のラピッドSSLを導入。
今回はコントロールパネルから申し込んだので、さくら側で証明書設定までやってくれた。
…んだけど、途中でちょっとしたミスをしてしまい、手続き完了まで時間がかかってしまった。
ミス1.SNI SSLを有効にしてなかった
「6 さくらのレンタルサーバでSSLを導入する | SSLそこからっすか!?」によると、申し込んですぐにSNI SSLが有効にできるらしい。
前は自分でCSR送って、中間証明書入れて、証明書受け取ってセットして、それからONにしてたから気付かなかった。
ミス2.HSTSセットしてた
まだ証明書がないのに気が早すぎ。
ミス3.上位階層の.htaccessが誤って効いていた
これは別記事で詳しく。