PY4A: OpenSSLを1.0.2dにupdate
HTTPSが使えないという方がいらっしゃったので \ OpenSSL周りを疑ってアップグレードしました。
でも、結局のところはバージョンが低いのが直接の原因ではないみたいで、 \ 認証ファイルがないことが問題のようです。
確認
python 2.7.8? あたりから、sslのチェックがデフォルトでonになった模様
-
systemの認証ファイルのデフォルト値がよくわからない。
/usr/lib/ssl/cacerts っぽいがAndroidでどうなってるかは知らなかった。
-
実際にpython4aを実行してみて確認:
>>> ssl.get_default_verify_paths() DefaultVerifyPaths(cafile=None, capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/home/shimoda/python-for-android.git/python-build/python_arm/python/share/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/home/shimoda/python-for-android.git/python-build/python_arm/python/share/certs')
んークロスコンパイル時のパスがそのまま入っちゃってるなぁ...
実験
使用するPY4Aは r26 。(r25ではエラーが出ることだけは確認した)
-
実験1 Androidの認証ファイルを一つずつ渡してみる:
import os path = "/etc/security/cacerts" for f in os.listdir(path): import urllib2 req = urllib2.Request("https://ccc.de/") try: res = urllib2.urlopen(req, cafile=os.path.join(path, f)) print "succeed: %s" % f except: print "failed"
一つのファイルでsucceedが出る。認証ファイルは使えるようだ
-
実験2 SSL_CER_FILEが使えるか、python4aのスクリプトを変更:
# export SSL_CERT_DIR=/etc/security/cacerts export SSL_CERT_FILE=/mnt/sdcard/cacert.pem
cacert.pemをとってくる ( http://curl.haxx.se/ca/cacert.pem )
上の環境変数を設定する・しないで動作を確認
→ SSL_CERT_FILEでもいけるみたい
どうやって反映しよう→今回は保留
一番いいのはAndroidのcacertsフォルダにあるファイルをすべて SSL_CERT_FILEに指定できればいいんだけど...
認証ファイルは最新を保ちたいので自分で提供するのは避けたい
/etc/security/cacertがあるのはICS以降。それ以前はフォーマットが違うらしい
/mnt/sdcardにとりあえずcacert.pemを置いてもらうように提案したけど \ 場所変えた方がいい気がする...
こういうの考えると、cacert.pemを最新に保つ仕組みを作れば よさそうだけど、どうすればいいのかなぁ...?
-
systemの認証ファイルをマージしてcacert.pemを作る
連結するだけでいいならこれもありかも。 \ ICS以前の認証ファイルはどうするかなぁ...もういいか...
今後
とりあえずwork aroundを紹介したけど、次に困ってる人が出てきたら \ デフォルトの認証ファイルをなんとかするかな...
コメント
Comments powered by Disqus