現在位置: ホーム / みらくるブログ / pythonでクライアント認証のあるHTTPSページにアクセスする

pythonでクライアント認証のあるHTTPSページにアクセスする

python (2.7)で、urllib2を使って、SSLのクライアント認証を行う、クライアントプログラムの作成方法例を紹介します。pythonを使うとその場合でも非常に簡単に記述できます。

一般的なHTTPSコネクション

HTTPS (SSL)通信では、サーバ側がサーバー証明書をクライアントに送信し、クライアントはそれが信頼できる認証局によって発行されたものかをチェックします。以下はurllib2パッケージを使ってYahoo JapanのサイトにHTTPSでアクセスするプログラムです。urllib2のurlopen関数がサーバーの証明書のチェックを内部的に行うので、プラグラムはそのことを意識しなくてもよく、非常にシンプルです。

#!/usr/bin/env python
import urllib2

res = urllib2.urlopen('https://www.yahoo.co.jp/')
print res.read()

実行すると以下のようにトップページのソースが表示されます

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="content-style-type" content="text/css">
<meta http-equiv="content-script-type" content="text/javascript">
(省略)
</center>
</body>
</html>
<!-- p01.f16.top.ssk.yahoo.co.jp Tue Aug 15 14:37:22 JST 2017 -->

SSLのクライアント認証

HTTPS (SSL通信)ではオプションとしてサーバもクライアントに証明書を要求することができます。この場合も、さきほどの例に少し処理を追加しただけで実現できます。主要な部分を以下に記載します。クライアント認証を行わない場合との主な違いは色をつけた部分の追加です。 

import urllib2
import ssl

sslctx = ssl.create_default_context()
sslctx.load_cert_chain(cert_file, priv_key)
res = urllib2.urlopen(url, context=sslctx)

 要点としては、ssl.SSLContextオブジェクトをcreate_default_context()で作成し、それにクライアント証明書と秘密鍵のファイルを設定するだけです。

cert_fileの例

-----BEGIN CERTIFICATE-----
MIIDEjCCAfoCCQCz32MSsrSPljANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJK
UDEOMAwGA1UECAwFVG9reW8xETAPBgNVBAcMCFNoaW5qdWt1MRAwDgYDVQQKDAdN
(省略)
8kPS+D0FeeuV/8X4XIB+vPesBJUrH++3xO4TFuNrbQMA95d8SdiR+wHpEJasf+ii
v7Y2VSQhZ+rBJgvdtmrVPT46NB1yDg==
-----END CERTIFICATE-----

priv_keyの例

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAoEJg0bke6H/WJ9gSci2ShwrBzijLe7puYQ7uG+gfygTDjESh
6pxiQXwWkc1hcZzer1YCjoS07yZCQCvSnWNlylUjuuGYKly9A+o8Yb59Sjx2AePu
(省略)
Jjzr99u3Y1+VdMONNV5LjkTAe289wkA585A1JEQySiiio9MfSB0juaZncjz1sq6H
CemrGtjpsAs1dvOslkgajpqRVtSEwSaLmSEQN5tHpWln1LxxhdeChg==
-----END RSA PRIVATE KEY-----

参考情報

なお、証明書や鍵のファイルの形式についてはPythonの公式ドキュメントに詳しい記載があります。