pfx の証明書を使ってpython のrequests でクライアント証明書を使ったアクセスを行う
やりたいこと
pfx のクライアント証明書経由でアクセスする必要があるサイトをpython のrequests でアクセスしたい
前提知識
pfx の証明書はPKCS#12 に相当し、証明書や秘密鍵、中間証明書が同梱された証明書となっている。
requests の使い方をドキュメントで調べると…
You can also specify the local cert file either as a path or key value pair:
requests-docs-ja.readthedocs.io
>>> requests.get('https://kennethreitz.com', cert=('/path/server.crt', '/path/key')) <Response [200]>
となっているので、crt とkey ファイルに分離すればいけそう。
上記のことから、pfx の証明書からpem 形式(非暗号化)に変換する必要がある。
証明書のエクスポート
PKCS#12(pfx)形式から、秘密鍵、公開鍵形式への変換方法
OpenSSLでPKCS#12形式から秘密鍵ファイルをエクスポートする
※要クライアント証明書のパスワード
openssl pkcs12 -in <PKCS#12ファイル名> -nocerts -nodes -out <秘密鍵ファイル名>
OpenSSLでPKCS#12形式から証明書ファイルをエクスポートする
※要クライアント証明書のパスワード
openssl pkcs12 -in <PKCS#12ファイル名> -clcerts -nokeys -out <証明書ファイル名>
OpenSSLでPKCS#12形式から中間CA証明書ファイルをエクスポートする
(今回使っているpfx にはなかった)
openssl pkcs12 -in <PKCS#12ファイル名> -cacerts -nokeys -out <中間CA証明書ファイル名>
実際にrequests に入れる
{証明書ファイル名} と {秘密鍵ファイル名} には↑で作成したそれぞれのファイルパスを指定する
import requests URL =" {アクセスするURL} " API_TOKEN=" {APIトークン} " headers = {"X-Cybozu-API-Token":API_TOKEN,'X-Requested-With':'XMLHttpRequest'} response =requests.get( URL , headers=headers,cert=('{証明書ファイル名}','{秘密鍵ファイル名}'))
無事にアクセスできました。