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