本文を読み飛ばす

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')

    んークロスコンパイル時のパスがそのまま入っちゃってるなぁ...

実験

  • 対象は、https://ccc.dehttps://www.openssl.org

  • 使用する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
    1. cacert.pemをとってくる ( http://curl.haxx.se/ca/cacert.pem )

    2. 上の環境変数を設定する・しないで動作を確認

    → SSL_CERT_FILEでもいけるみたい

どうやって反映しよう→今回は保留

一番いいのはAndroidのcacertsフォルダにあるファイルをすべて SSL_CERT_FILEに指定できればいいんだけど...

  • 認証ファイルは最新を保ちたいので自分で提供するのは避けたい

  • /etc/security/cacertがあるのはICS以降。それ以前はフォーマットが違うらしい

  • /mnt/sdcardにとりあえずcacert.pemを置いてもらうように提案したけど \ 場所変えた方がいい気がする...

こういうの考えると、cacert.pemを最新に保つ仕組みを作れば よさそうだけど、どうすればいいのかなぁ...?

  • http://curl.haxx.se/ca/cacert.pem をチェックする

  • systemの認証ファイルをマージしてcacert.pemを作る

    連結するだけでいいならこれもありかも。 \ ICS以前の認証ファイルはどうするかなぁ...もういいか...

今後

とりあえずwork aroundを紹介したけど、次に困ってる人が出てきたら \ デフォルトの認証ファイルをなんとかするかな...

コメント

Comments powered by Disqus
宣伝: