2016年8月21日日曜日

仮想ホストで中間証明書を有効にする方法

QNAP で HTTPS のために SSL 通信用のデジタル証明書をセットアップできたと思っていたら、PC 等他の環境では問題がないものの、Android の Chrome でセキュリティ警告(NET::ERR_CERT_AUTHORITY_INVALID)が出るという問題に直面した。

SSLLabs のテストでは incomplete chain や extra download と言われる。

丸一日かかって、どうやら完全に問題を克服することができた。

だいたい、こういうノウハウというのは、英語の情報(QNAP のフォーラム等)を参照すればどうにかなるもので、ほとんどのプロのエンジニアの人でも、正解となる先人の情報をどう見付けてくるかという話で、それをそのまま自分のブログに記録しているだけのケースが基本だろう(特に日本語においては)。(プロではないただのエキスパートなだけの)僕も、そういうつもりでいたのだけど、今回は、既存の情報が、低レベルなものしか見付からず、結局、自分の要求する水準のものを実現するために、自分でオリジナルに解法を確立する他なかった。

まず、何が馬鹿馬鹿しいかというと、QNAP の Web UI のセキュリティ設定があって、あそこで証明書を設定するものだと思っている人がほとんどだと思うのだが、あれがまず、騙し。あれって、myqnapcloud.com の Web UI 用の Web サーバーにしか関係がない、というかその用途しか、QNAP の中の人も念頭にない。仮想ホストで、独自ドメインを使って Web サーバーを使う場合のことは、全く蚊帳の外という……。

ほんで、英語の情報をどんなに探し回っても、Web UI 用の Web サーバーに対する証明書のセットアップについて、中間証明書を有効にする方法ばかり。それも古い情報が多いなと思ってたら、Web UI 用の Web サーバーについては、Web UI から中間証明書がコピー&ペーストで設定できるように今では対応済なんだから、当然。

もう、しょうがないので、最後は「ランボー怒りのリバースエンジニアリング」。Apache 関連のコンフィグを眺め回して、試行錯誤繰り返して、やっと仮想ホストでデジタル証明書を中間証明書を含めて適切に設定する方法を突き止めた。

httpd-ssl-vhosts-user.conf

HTTPS を有効にした仮想ホストの設定は、/etc/config/apache/extra/httpd-ssl-vhosts-user.conf にある。この中の次の箇所を修正:

- SSLCertificateFile "/etc/stunnel/stunnel.pem"
+ SSLCertificateFile "/share/Web/mydomain.com/certification/host.pem"
+ SSLCertificateChainFile "/share/Web/mydomain.com/certification/intermediate.pem"

パス自体は好みで ok だが、SSLCertificateFile で仮想ホストの証明書を、SSLCertificateChainFile で中間証明書(のチェーン)を指すようにするのがポイント。ちなみに、仮想ホストの証明書は、秘密鍵を先頭に、続いて仮想ホストの証明書を記載する形式になっている。

以上、vi が面倒臭いので、scp を使って、ダウンロード→編集→アップロードで上書きをしたのは、いつもの通り。

HTTPd の再起動

/etc/init.d/Qthttpd.sh restart で再起動すれば、設定が反映される。NAS を再起動すると、上の作業が白紙化するので、autorun.sh を使って工夫する必要があるのは、以前、述べた通り。


以上で目出度く、SSLLabs のテストで incomplete chain や extra download と言われなくなり、Android の Chrome でもセキュリティエラーが出なくなった。

そういえば、これで余裕で SNI もできるようになったわけだ。

0 件のコメント:

コメントを投稿