end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

python3による client認証ページへのアクセス

amazon linux2 + apache2.4 + openssl による オレオレ クライアント認証 - end0tknr's kipple - web写経開発

更に上記entryの続き。

python3で クライアント認証ページへアクセスするには、 「urllib + ssl」による方法と、「requests.Session」によるものがあります。

urllib + ssl による場合

以下の通りです。clinetの証明書や秘密鍵は、先程のentryのものを使用しています。

#!/usr/local/python3/bin/python3
# -*- coding: utf-8 -*-

import ssl
import urllib.request

cert_file = "./client.crt"      # 証明書
priv_key  = "./client.key"      # 秘密鍵
http_timeout = 10       #sec

req_url = "https://apache.end0tknr.com/private"

def main():

    sslctx = ssl.create_default_context()
    sslctx.load_cert_chain(cert_file, priv_key)
    
    req = urllib.request.Request(req_url)

    try:
        res = urllib.request.urlopen(req,
                                     data=None,
                                     timeout=http_timeout,
                                     context=sslctx)
    except urllib.error.HTTPError as err:
        print("WARN",err.code, req_url,file=sys.stderr)
        return None
    except urllib.error.URLError as err:
        print("ERROR",err.reason, req_url,file=sys.stderr)
        return None

    print("DONE HTTP",res.getcode(), res.geturl() )
    print( res.read() )
    res.close()


if __name__ == '__main__':
    main()

requests.Session による場合

以下の通りです。

尚、client_crt_key.txt 内には、※1のように証明書と秘密鍵を記載しています。

#!/usr/local/python3/bin/python3
# -*- coding: utf-8 -*-

from requests import Session

def main():
    s = Session()
    s.cert = "./client_crt_key.txt"
    r = s.get("https://apache.end0tknr.com/private/")
    print(r.status_code)
    print(r.text)


if __name__ == "__main__":
    main()

※1 client_crt_key.txt の内容

-----BEGIN CERTIFICATE-----
MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQsFADB+MQswCQYDVQQGEwJKUDEO
<略>
X0Bxim1aYykRSf8n4cgS8CSkSzOBwpXVeO4G7OSB8hCNoUQ=
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAxjsUhT/Q/dxIqQQChUIsUFdwL7W2qfx46npvQDFtU9Yo65up
<略>
qiayJCCYGn7/Qqm8/U28cEJDUhQzu2joun+ASHrT0WtW+jwG9BkXgv0=
-----END RSA PRIVATE KEY-----