発生したケース
クライアントから「さくらクラウドで動作していたサービスがウィルスに感染してOSをクリーンインストールされてしまうので助けてくれ」と依頼がきた。
調査が手間だったのとサービス自体も小さかったのでOS〜アプリケーションまでフルフルで新サーバーへ新規インストールすることにした。CakePHPで動いてるアプリケーションで証明書がLetsEncryptで動作している程度簡単な作業と思っていた。
問題発生
1日かけてデータ移行も終わり、サイトでの動作確認も終わったが20時のタイミングで先方のエンジニアからAPIを叩いてもレスポンスが返ってこないと。
症状
- ブラウザからの証明書は正しく動作してるように見える。
- NodeアプリケーションからのAPI通信は通らない
- PostmanやWEB検証ツールからのAPI通信は通らない
- Postmanの証明書認証をオフにすると動作する。
検証したこと
- ローカル完了のキャッシュ削除(ダメ)
- http通信(通るが解決にはならない)
- 中間証明書の検証
$ openssl version
OpenSSL 1.0.2o 27 Mar 2018
openssl s_client -connect example.com:443 < /dev/null | grep "Certificate chain" -A 10
~~~省略~~~
verify error:num=21:unable to verify the first certificate
verify return:1
DONE
Certificate chain
0 s:/C=--/ST=SomeState/L=SomeCity/O=SomeOrganization/OU=SomeOrganizationalUnit/CN=tk2-251-35269.vs.sakura.ne.jp/emailAddress=root@tk2-251-35269.vs.sakura.ne.jp
i:/C=--/ST=SomeState/L=SomeCity/O=SomeOrganization/OU=SomeOrganizationalUnit/CN=tk2-251-35269.vs.sakura.ne.jp/emailAddress=root@tk2-251-35269.vs.sakura.ne.jp
---
証明書の検証に失敗していた。
Apacheの設定を再確認
<VirtualHost *:443>
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
# ↓この設定が抜けていた
# SSLCertificateChainFile /etc/letsencrypt/live/example.com/fullchain.pem
# ~~以下略~~~
</VirtualHost>
確かにSSLCertificateChainFile(中間証明書)の設定が抜けていた。
これで怒られていたわけか
修正するとAPI通信も通り、無事移行作業も完了できました。
最近はLetsの証明書も簡単に取得できるようになっているが、やっぱりなんとなく動いてる状態怖いな。。。