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)形式から、秘密鍵、公開鍵形式への変換方法

knowledge.digicert.com

  1. OpenSSLでPKCS#12形式から秘密鍵ファイルをエクスポートする

    ※要クライアント証明書のパスワード

    openssl pkcs12 -in <PKCS#12ファイル名> -nocerts -nodes -out <秘密鍵ファイル名>
    
  2. OpenSSLでPKCS#12形式から証明書ファイルをエクスポートする

    ※要クライアント証明書のパスワード

    openssl pkcs12 -in <PKCS#12ファイル名> -clcerts -nokeys -out <証明書ファイル名>
    
  3. 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=('{証明書ファイル名}','{秘密鍵ファイル名}'))

無事にアクセスできました。