SSL化したサイトにAPIリクエストをなげても証明書エラー


発生したケース

クライアントから「さくらクラウドで動作していたサービスがウィルスに感染して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/[email protected]
   i:/C=--/ST=SomeState/L=SomeCity/O=SomeOrganization/OU=SomeOrganizationalUnit/CN=tk2-251-35269.vs.sakura.ne.jp/[email protected]
---

証明書の検証に失敗していた。

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の証明書も簡単に取得できるようになっているが、やっぱりなんとなく動いてる状態怖いな。。。