こんにちは。masm11 です。今回は WordPress に関連した話を書きたいと思います。
WordPress はテーマやプラグインがいろいろあって便利です。 テーマが特定のプラグインを必要としている場合は、テーマのインストール時に そのプラグインをインストールする機能もあるようです。 しかし、プラグインがサーバ内にダウンロードされ、そこから改めてダウンロード、イン ストールが行われます。 自サイトが https の場合、ダウンロードする際も当然 https になります。
さて、ここでダウンロードに失敗しました。エラーメッセージは以下のとおりでした。
ダウンロードに失敗しました。cURL error 60: SSL certificate problem: unable to get local issuer certificate
ダウンロードしようとしたファイルの URL も表示されています。 これを解決したいと思います。
curl コマンド
エラーメッセージに cURL とあるので、curl
コマンドでアクセスを試みたところ、
確かに同じエラーメッセージが表示されました。
$ curl https://ingage.jp curl: (60) SSL certificate problem: unable to get local issuer certificate More details here: http://curl.haxx.se/docs/sslcerts.html curl performs SSL certificate verification by default, using a "bundle" of Certificate Authority (CA) public keys (CA certs). If the default bundle file isn't adequate, you can specify an alternate file using the --cacert option. If this HTTPS server uses a certificate signed by a CA represented in the bundle, the certificate verification probably failed due to a problem with the certificate (it might be expired, or the name might not match the domain name in the URL). If you'd like to turn off curl's verification of the certificate, use the -k (or --insecure) option. $
エラーメッセージから、SSL 証明書絡みであることはすぐに解ります。
SSL 証明書は CA (証明書発行機関) の証明書によって確認でき、CA の証明書はさらに上位の CA の証明書によって確認できる、 という木構造をしています。今回のエラーメッセージはそのことに関連したメッセージのようです。
ブラウザからサイトにアクセスして証明書を確認してみます。
CA の証明書は GeoTrust RSA CA 2018
です。
さて、curl
コマンドは
$ type -a curl curl is /opt/bitnami/common/bin/curl curl is /usr/bin/curl
PATH 的に /opt/bitnami/common/bin/curl
になっているようです。
このファイルは shell script で、その中には
CURL_CA_BUNDLE="/opt/bitnami/common/openssl/certs/curl-ca-bundle.crt"
という行があります。
しかし、この curl-ca-bundle.crt
というファイルの中を見ても GeoTrust RSA CA 2018
がありません。
これが問題かもしれません。
中間証明書を
https://www.geotrust.co.jp/resources/repository/intermediate_dc.html
からコピーして curl-ca-bundle.crt
の最後に追記してみます。以下のようになります。
... (略) N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== -----END CERTIFICATE----- GeoTrust RSA CA 2018 =============================== -----BEGIN CERTIFICATE----- MIIEizCCA3OgAwIBAgIQBUb+GCP34ZQdo5/OFMRhczANBgkqhkiG9w0BAQsFADBh MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 ... (略) O9PuiHMKrC6V6mgi0s2sa/gbXlPCD9Z24XUMxJElwIVTDuKB0Q4YMMlnpN/QChJ4 B0AFsQ+DU0NCO+f78Xf7 -----END CERTIFICATE-----
(GeoTrust RSA CA 2018
の行以下が追加した部分です)
すると、curl
コマンドで正常につながるようになりました。
$ curl https://ingage.jp $
つまり、必要な CA 証明書が curl-ca-bundle.crt
になかったため、ingage.jp の証明書を cURL が確認できなかった、
というのが原因でした。
WordPress
しかし WordPress からは依然としてダウンロードできません。
おそらく、curl
コマンドでなく libcurl.so
を使っているのでしょう。
散々探し回った結果、
/opt/bitnami/apps/wordpress/htdocs/wp-includes/certificates/ca-bundle.crt
というファイルを見つけました。このファイルにも GeoTrust RSA CA 2018
が含まれてい
なかったので、同様に追記したところ、見事、正常にダウンロードできるようになりまし
た。
まとめと感想
今回は、WordPress が内部で行なっている HTTPS 通信で発生した問題を解決しました。
まさか WordPress 自身が CA 証明書を持っているとは思っていませんでした。 WordPress は知識の少ない人も含めていろんな人を対象にしていると思っているのですが、 そのわりにはいろいろ難しいし知識が必要だなぁ、と感じています。 皆さんはどうでしょうか?
ではまた。
追記
この問題、実は Apache に中間証明書を設定していなかったことが発覚し、 設定することで解決しました。
設定方法については、このページの 4. が参考になると思います。