WordPress の内部 HTTPS 通信の問題を解決する

こんにちは。masm11 です。今回は WordPress に関連した話を書きたいと思います。

WordPress はテーマやプラグインがいろいろあって便利です。 テーマが特定のプラグインを必要としている場合は、テーマのインストール時に そのプラグインをインストールする機能もあるようです。 しかし、プラグインがサーバ内にダウンロードされ、そこから改めてダウンロード、イン ストールが行われます。 自サイトが https の場合、ダウンロードする際も当然 https になります。

さて、ここでダウンロードに失敗しました。エラーメッセージは以下のとおりでした。

f:id:masm11:20181228201132p:plain

ダウンロードに失敗しました。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 の証明書によって確認できる、 という木構造をしています。今回のエラーメッセージはそのことに関連したメッセージのようです。

ブラウザからサイトにアクセスして証明書を確認してみます。

f:id:masm11:20181228203130p:plain

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. が参考になると思います。