さんまがおいしい季節だねー(´・ω・`)

Facebookアプリ作ろうとしてSSL certificate problemがでたときの解決方法

Facebook — タグ: , , — さくら @ 2010/10/26 14:00

先週ぐらいに facebook アプリの作り方・PHP 編(2010 年 10 月版) – 19790401173.4 とかに影響されて Facebook アプリ作ろうとしてたんすが、Facebook PHP SDK 付属のサンプルアプリもうまく動かなかったりして放置してました。

このまま放置するのもアレなんで解決方法とか調べてみたんでメモっときます。

つまずいたところ

  1. Facebook PHP SDK 付属のサンプルアプリを手順に従ってローカルのテスト用サーバにインスコ
  2. 動かしてみると空白のページしか表示されない
  3. ログに以下のエラーメッセージ

    PHP Fatal error: Uncaught CurlException: 60: SSL certificate problem, verify that the CA cert is OK. Details:\nerror:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed\n thrown in /foo/facebook.php on line 614

SSL の CA(認証局)証明書が無いのが問題っぽいす。証明書が無いだけなのでインスコしたら解決します。

もうちょい調べる

CA 証明書をインスコする前に、まずこれ環境依存問題でして、cURL は CA 証明書を –with-ca-bundle configure オプションで指定されたパスか特定パス($prefix/share/curl/curl-ca-bundle.crt, /etc/ssl/certs/ca-certificates.crt, /etc/pki/tls/certs/ca-bundle.crt, /usr/share/ssl/certs/ca-bundle.crt, /usr/local/share/certs/ca-root.crt, /etc/ssl/cert.pem など)から読み込みます。

なんで –with-ca-bundle configure オプションを指定せず cURL をビルドし、特定のパスに CA 証明書が存在しない環境で上記の問題が発生します。

なお上記の CA 証明書を検索する特定のパスは configure 時に解決されるので、cURL をインスコした後に上記パスにファイルを置いても問題は解決しません(はずです)。

ちなみに問題が発生する環境かどうかは curl コマンドを実行しても判定できます。

curl コマンドから https://graph.facebook.com/ 宛のリクエストを発行した際、以下のようなエラーが出る場合は問題ありです。問題が発生しない環境ではプログレスメッセージの後にダウンロードは正常終了します。

$ curl 'https://graph.facebook.com/sakuratandotbiz' > /dev/null

curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
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.

CA 証明書をインスコ

で CA 証明書のインスコ方法ですが、 cURL の中の人が mozilla.org の CA 証明書を(cURL が必要とする)PEM フォーマットに変換したものを http://curl.haxx.se/docs/caextract.html からダウンロードできるようにしてくれてます。まずここから cacert.pem (または gzip/bzip2 されたファイル)をゲットしてください。

ゲットしたら適当なディレクトリに cacert.pem を保存してください。gzip/bzip2 されたファイルの場合は解凍する必要がります。

準備できたらサンプルの examples/example.php の先頭を以下のように書き換えます。

<?php

require '../src/facebook.php';

Facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYPEER] = true;
Facebook::$CURL_OPTS[CURLOPT_CAINFO] = '/foo/cacert.pem';

// Create our Application instance (replace this with your appId and secret).
$facebook = new Facebook(array(

赤い部分が修正箇所です。/foo/cacert.pem は実際に cacert.pem を保存したパスに書き換えてください。

なお cacert.pem のライセンスは MPL 1.1, GPL v2.0 or LGPL 2.1 になっています。問題無いか確認してから使ってください。

cacert.pem の更新

mozilla.org の Extract CA Certs は随時更新されています。cacert.pem もそれに追随する形で週一で更新されてます。

ちゃんと同期したい場合は以下のようなスクリプトを(cron で)週次で動かせばいいと思います。このスクリプトは cacert.pem.bz2 (もしくは .gz)を curl.haxx.se からダウンロードして解凍します。

#!/bin/sh

CACERT_BASEURI='http://curl.haxx.se/ca/'
CACERT_FILENAME='cacert.pem'
CACERT_ZSUFX='.bz2'

set -e

if [ "$CACERT_ZSUFX" = '.bz2' ]; then
        zcat='bzcat'
else
        zcat='gzcat'
fi

curl -o $CACERT_FILENAME$CACERT_ZSUFX $CACERT_BASEURI$CACERT_FILENAME$CACERT_ZSUFX
$zcat $CACERT_FILENAME$CACERT_ZSUFX > $CACERT_FILENAME.tmp
mv $CACERT_FILENAME.tmp $CACERT_FILENAME
rm -f $CACERT_FILENAME$CACERT_ZSUFX

おまけ

mixi にアクセスする際も同じ問題が発生するようです。Facebook アプリ動かねーってなったとき以下のサイトを参考にさせて頂いたのですが(以下のページでは個別に証明書 Firefox からぶっこ抜く方法を説明されてます)、上のやり方でも解決できるはずです…試してないけどw

php-openid で mixi のコミュニティ認証を使う – まちゅダイアリー(2008-09-18)
jognote in silico — Blog Archive » cURL に HTTPS でアクセスできるように証明書を追加する

ま、お好きな方法でどうぞ。

2件のコメント »

  1. 同じところでハマりました。
    http://forum.developers.facebook.net/viewtopic.php?pid=277131#p277131

    この解決法の方が簡単かも。

    コメント by うめたん — 2011 年 2 月 11 日 @ 23:32
  2. Facebookアプリ作ろうとしてSSL certificate problemがでたときの解決方法 | さくらたんどっとびーず

    コメント by クリスチャンルブタン パリ 店舗 — 2013 年 7 月 21 日 @ 16:02

この投稿へのコメントの RSS フィード。 TrackBack URI

コメントする

Copyright © 2017 さくらたんどっとびーず | powered by WordPress with Barecity