Facebookのシェアデバッガーで「Curlエラー: 60 (SSL_CACERT)」が出た時の対処
Can't validate SSL Certificate. Either it is self-signed (which will cause browser warnings) or it is invalid.というメッセージでFacebookシェアがうまくいかなかったときのメモ。主にSSL証明書テストと改善で解決する。
目的
Facebookにシェアした場合に出力される画像(OGP)の設定をするために、Facebookシェアデバッガーでテストをしたら以下エラーがでた。
複数試した結果として、結果的にできるようになったが、どれが効いたのかいまいちわからず、とりあえず記録として行ったことを記載する。 (たぶん最後に証明書のランクをあげたのが効いている感じがする)
—————————————————– caution-solid修正が必要な問題 SSL Error Can’t validate SSL Certificate. Either it is self-signed (which will cause browser warnings) or it is invalid. Curlエラー Curlエラー: 60 (SSL_CACERT) 推測されるプロパティ 値が他のタグから推測される場合でも、og:imageプロパティは明示的に指定してください。 プロパティがありません 次のプロパティは必須です: og:url, og:type, og:title, og:image, og:description, fb:app_id —————————————————–
環境
OS:CentOS release 6.10 (Final)
証明書:Let’s Encrypt
証明書の期限:以下
[root@xxxxxx]# openssl x509 -in /etc/letsencrypt/live/mikd.tokyo/fullchain.pem -noout -dates
notBefore=Aug 31 21:16:30 2019 GMT
notAfter=Nov 29 21:16:30 2019 GMT
証明書の更新方法:cronを用いて毎月1日に更新を行う。/etc/cron.d配下に以下のファイルを置いている。
[root@xxxxxx]# ls -l /etc/cron.d/letsencrypt
-rw-r--r-- 1 root root 130 9月 7 00:25 2018 /etc/cron.d/letsencrypt
[root@xxxxxx]# ls -l /etc/cron.d/letsencrypt
00 04 01 * * root /etc/rc.d/init.d/httpd stop && /var/letsencrypt/letsencrypt/certbot-auto renew && /etc/rc.d/init.d/httpd start
結果
行ったこと
どれが効いたのか、AND条件なのかORなのかわからないが以下を行ったことで問題解決する。
- ソフトウェアのアップデート
- curの証明書の取得と設定
- 中間証明書の設定
- SSL証明書テストと改善
これらを行ったことで、結果的にFacebookシェアデバッガーからエラーが消えた。
方法
フロー
1ソフトウェアのアップデート |
↓ |
2curの証明書の取得と設定 |
↓ |
3中間証明書の設定 |
↓ |
4SSL証明書テストと改善 |
ソフトウェアのアップデート
まず、普通にサーバにインストールされたhttpdとopensslをアップデートしてみる。
[root@xxxxxxxx ~]# yum update httpd
# 出力は割愛
[root@xxxxxxxx ~]# yum update openssl
# 出力は割愛
[root@xxxxxxxx ~]# service httpd reload
httpd を再読み込み中:
この時点ではFacebookシェアデバッガー上のエラーは同じ。変化なし。
※実際に行ったときはopensslのみ、バージョンが古かったらしく、更新をおこなった。
curの証明書の取得と設定
CURのcertcertファイルを設定していないと、わかり設定してみる。
certは以下のURLから取得
http://curl.haxx.se/ca/cacert.pem
certを任意のパスに配置して、php.iniを編集する
#certを配置
[root@xxxxxxx]# ls -l /etc/cert/cacert.pem
-rw-r--r-- 1 root root 224085 8月 31 14:16 2019 /etc/cert/cacert.pem
#php.iniの編集
[root@xxxxxxx]# vi /etc/php.ini
[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
;curl.cainfo =
; ↓ 以下に変更
curl.cainfo = /etc/cert/cacert.pem
#httpdの再起動
[root@xxxxxxx]# service httpd reload
この時点でもFacebookシェアデバッガー上のエラーは同じ。変化なし。
中間証明書の設定
中間証明書の設定をしていなかったので設定をする。
# 中間証明書の場所(xxxはドメイン名)
/etc/letsencrypt/live/xxx/chain.pem
[root@xxxxxxx]# vi /etc/httpd/conf.d/ssl.conf
#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt
# ↓以下に変更
SSLCertificateChainFile /etc/letsencrypt/live/xxx/chain.pem
この時点でもFacebookシェアデバッガー上のエラーは同じ。変化なし。
SSL証明書テストと改善
以下から証明書のテストができることを知る。
https://www.ssllabs.com/ssltest/
結果はC判定となる。
とりあえずBにしようと思い、以下2つを対応してみる。
This server is vulnerable to the POODLE attack. If possible, disable SSL 3 to mitigate. Grade capped to C.
This server accepts RC4 cipher, but only with older protocols. Grade capped to B.
[root@xxxxxxx]# vi /etc/httpd/conf.d/ssl.conf
# SSLv3を無効化
List the enable protocol levels with which clients will be able to
# connect. Disable SSLv2 access by default:
#SSLProtocol all -SSLv2
SSLProtocol all -SSLv2 -SSLv3
# 暗号リストにRC4を追加
#SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES
SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES:!RC4
Bになった。
とりあえずこの時点でFacebookの問題は解決。
参考
その他詳細
PHP設定確認方法
任意のファイルに以下を記載する。例はルートに配置した場合。
https://ドメイン名/phpinfo.php
<?php
phpinfo();
?>
サイト上のOGP設定
サイト上でOGP設定はこのような記載にしている。
<meta property="og:title" content="xxxxxxxx" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://xxx/xxxxxxxx" />
<meta property="fb:app_id" content="xxxxxxxx" />
<meta property="og:image" content="xxxxxxxx" />
<meta property="og:description" content="xxxxxxxx" />