認証局から送られてくる証明書が間違ってた話


証明書を更新したら、API Callできなくなった

状況

証明書を更新したら、
ブラウザでチェックしても特にエラーは無いのに、今まで動いてたAPIで、

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed,OpenSSL::SSL::SSLError

や、opensslコマンドで

verify error:num=27:certificate not trusted
verify error:num=21:unable to verify the first certificate

等が出る症状が発生。

調査

openssl s_client -connect {hostname}:443 -servername {hostname} < /dev/null

したら

depth=0 /C=JP/ST=****/L=****/O=******,Inc./CN=******.co.jp
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 /C=JP/ST=****/L=****/O=******,Inc./CN=******.co.jp
verify error:num=27:certificate not trusted
verify return:1
depth=0 /C=JP/ST=****/L=****/O=******,Inc./CN=******.co.jp
verify error:num=21:unable to verify the first certificate
verify return:1
CONNECTED(00000003)
---
Certificate chain
 0 s:/C=JP/ST=****/L=****/O=******,Inc./CN=******.co.jp
   i:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign Organization Validation CA - SHA256 - G2
 1 s:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
   i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
---
Server certificate
-----BEGIN CERTIFICATE-----
 :
 :

あれれ?
chain繋がってないぞっと・・・

問い合わせ

とりあえずサポートに問い合わせたら、下記のような回答が。

>《中間証明書》
>Issuer: C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA
>Subject: C=BE, O=GlobalSign nv-sa, OU=Root CA, CN=GlobalSign Root CA

上記中間証明書としてご教示いただいております内容は、
弊社ルート証明書の内容となります。

中間証明書が異なっている可能性がございますので、
下記ページより当該の中間証明書を取得いただき、
再度、設定を行っていただければと存じます。

<リポジトリ・利用約款>
https://jp.globalsign.com/repository/

まさか、送られてきた中間CA証明書が間違ってるだと!!!

解決

正しい中間CA証明書をダウンロードして入れ替えたら無事解決♪
こんな事ってあるんですねぇ・・・(((((( ;゚Д゚))))))ガクガクブルブル

グローバルサインで2016/10/14前後に企業認証SSL(SHA256)を取得した人は、
チェックした方がいいかも。

対策

まぁ、とりあえず送られてきた証明書を信用せずにチェックするしかないかな。
設定を読み込む前に、証明書と中間CA証明書を

openssl x509 -text -noout -in {filename}

して、証明書のIssuerと中間CA証明書のSubjectが同じになってるか確認するしか・・・