LetsEncryptのROOT証明書の期限が切れたら古いOSからアクセスできなくなって困った
目次
10/1以降一部のサイトにHTTPSで接続できない?
発生する現象
OS別原因と対処
CentOS7, Amazon Linux, Amazon Linux2の場合
yum -y update ca-certificates
CentOS6の場合とよくあるエラー
wgetの例
wget https://LetsEncryptの証明書を利用しているサイト
--2021-10-04 20:06:18-- https://LetsEncryptの証明書を利用しているサイト/ Resolving LetsEncryptの証明書を利用しているサイト... xx.xx.xx.xx Connecting to cLetsEncryptの証明書を利用しているサイト|xx.xx.xx.xx|:443... connected. ERROR: cannot verify LetsEncryptの証明書を利用しているサイト’s certificate, issued by “/C=US/O=Let's Encrypt/CN=R3”: Issued certificate has expired. To connect to LetsEncryptの証明書を利用しているサイト insecurely, use ‘--no-check-certificate’.
opensslコマンドの例
openssl s_client -connect LetsEncryptの証明書を利用しているサイト:443 -servername LetsEncryptの証明書を利用しているサイト < /dev/null
CONNECTED(00000003) 〜中略〜 Start Time: 1633378075 Timeout : 300 (sec) Verify return code: 10 (certificate has expired) --- DONE
opensslのライブラリ(多分libssl.so.10)を使って通信するphpプログラムの例
<?php $url = "https://LetsEncryptの証明書を利用しているサイト/"; $output = file_get_contents($url); var_dump($output);
PHP Warning: file_get_contents(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed in "実行したプログラム" on line 3 PHP Warning: file_get_contents(): Failed to enable crypto in "実行したプログラム" on line 3 PHP Warning: file_get_contents(https://LetsEncryptの証明書を利用しているサイト/): failed to open stream: operation failed in "実行したプログラム" on line 3 bool(false)
curlコマンドやphpのcurl関数を使っている場合は問題が起きません。
ldd /usr/bin/curl | grep ssl
libssl3.so => /usr/lib64/libssl3.so (0x00007f43fc44b000)
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f43fb1c5000)
ldd /usr/bin/wget | grep ssl
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f79a04c6000)
ldd /usr/bin/openssl | grep ssl
libssl.so.10 => /usr/lib64/libssl.so.10 (0x00007f2872a3a000)
rpm -qf /usr/lib64/libssl3.so
nss-3.44.0-7.el6_10.x86_64
rpm -qf /usr/lib64/libssl.so.10
openssl-1.0.1e-58.el6_10.x86_64
問題の解消のためには
CentOS6に強引にopenssl1.0.2をインストールする手順
srpmからrpmパッケージを作成
CentOS7のリポジトリからopenssl 1.0.2のsrpmパッケージの取得
cd /usr/local/src wget --no-check-certificate https://vault.centos.org/7.9.2009/updates/Source/SPackages/openssl-1.0.2k-21.el7_9.src.rpm rpm -i openssl-1.0.2k-21.el7_9.src.rpm
※rpmコマンドを実行したユーザーのホームディレクトリ以下にrpmbuildというディレクトリが作成されソースコードが展開されているので移動します。
cd ~/rpmbuild
SPECファイルの修正
※"%patch68"は不要な処理なのでコメントアウトします
sed -i -e "s/%patch68/#%patch68/g" SPECS/openssl.spec
patchファイルの修正
※secure_getenvというglibcの関数がCentOS6にはないのでgetenvに置き換えます
sed -i -e "s/secure_getenv/getenv/g" SOURCES/openssl-1.0.2a-env-zlib.patch sed -i -e "s/secure_getenv/getenv/g" SOURCES/openssl-1.0.2j-deprecate-algos.patch sed -i -e "s/secure_getenv/getenv/g" SOURCES/openssl-1.0.2a-fips-ctor.patch
rpmパッケージのbuild
※ビルドに必要なツールがインストールされていなければインストールしてからrpmbuildしてください
yum install rpm-build krb5-devel zkib-devel lksctp-tools-devel zlib-devel gcc rpmbuild -ba SPECS/openssl.spec
rpmパッケージをインストール
依存関係で必要なパッケージ(perl-WWW-Curl)をインストール
yum install perl-WWW-Curl
rpmパッケージがビルドされたディレクトリに移動してrpmコマンドでインストール
cd RPMS/ rpm -Uvh openssl-*
ちゃんとバージョンが上がったか確認
openssl version
※1.0.2kになっていれば成功です
DST Root CA X3証明書の無効化
※DST Root CA X3証明書がOSのroot証明書に残っていると問題が解消しません、どちらにせよ期限の切れている証明書なので無効化しましょう。
OSのroot証明書を最新化
yum update ca-certificates
update-ca-trust機能を有効にしてroot証明書を一度update-ca-trustコマンドで更新
update-ca-trust enable update-ca-trust
※yum update ca-certificatesでroot証明書を更新した直後はOSの信頼済みroot証明書(/pki/tls/certs/ca-bundle.crt)のファイルが証明書の内容だけではなくIssuerや期限などのコメントが入った状態になっています。
この状態でもOSの動作には問題ありませんがupdate-ca-trustコマンドを引数なしで実行するとOSの信頼済みroot証明書が証明書の内容とコメントのみのファイルに整理されます。
次のコマンドで証明書部分だけを確実に取り出すために必ず実行してください。
"DST Root CA X3"証明書のみを取り出し/etc/pki/ca-trust/source/blacklist/以下にファイルとして保存
perl -e 'while(<>){last if $_ =~ m/DST Root CA X3/;}print $_;while(<>){last if length($_)==1;print $_}' </etc/pki/tls/certs/ca-bundle.crt > /etc/pki/ca-trust/source/blacklist/DST_Root_CA_X3.pem
※/etc/pki/ca-trust/source/blacklist/DST_Root_CA_X3.pemという名前のファイルが作成されて、内容が以下のようになっていれば大丈夫です。うまくいかない場合は手動でファイルを作成しても問題ありません。
#DST Root CA X3 -----BEGIN CERTIFICATE----- MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/ MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw 7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69 ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5 JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ -----END CERTIFICATE-----
"DST Root CA X3"証明書を無効化
update-ca-trust extract
grep "DST Root CA X3" /etc/pki/tls/certs/ca-bundle.crt
※何も表示されなければOKです
grep "ISRG Root X1" /etc/pki/tls/certs/ca-bundle.crt
※# ISRG Root X1 と表示されればOKです
アップデート後にエラーの出ていたプログラムを実行して問題が解消されたかどうか確認してみてください。
サーバ上でSSLを提供するサービス(Apacheなど)が動いている場合はサービスを再起動することを推奨します。