pythonとクライアント証明書認証とhttp通信
ひさびさにプログラミングネタです。このネタなら毎日書けると思ってブログを始めたのですが 意外に書けないものでした。
さて、本日のネタはpython。
pythonでクライアント証明書認証でhttp通信をしようというものです。 基本的に よく使われるrequestsやhttpxでサポートされているので、 証明書ファイルがあれば簡単。
requests*1の場合にはSessionオブジェクトに証明書情報を設定すれば あとは普通にhttp処理を書けばOK。
証明書情報は、以下の順に設定する
- クライアント証明書
- 秘密鍵
証明書、秘密鍵はpemフォーマットで保存されたものが良い。 秘密鍵にパスフレーズを設定してるものはrequestsではサポートされていないので 事前にパスフレーズを解除しておく必要がある
from requests import Session session = Session() session.cert = ("./client.pem", "./privkey.pem") session.get(url)
httpx*2の場合もほぼ同様 ただ、httpxの場合にはパスフレーズ付きの秘密鍵をサポートしており、certを指定する情報の3番目にパスフレーズを設定することが可能になっている。
from httpx import Client client = Client() client.cert = ("./client.pem", "./privkey.pem", "passphrase") client.get(url)
まぁ、これだけならブログにあらためて書いて共有する話でもないのだが。 というか、ぐぐりゃいいじゃんってことなのだが、これからが言いたいところ。
証明書情報をファイルでしか指定できないのはどうかと思う。
秘密情報をファイルで不揮発化するなんて。。。
秘密情報をファイルで不揮発化するなんて。。。
秘密情報をファイルで不揮発化するなんて。。。
大事なことなので、3回言いました。
せっかくクラウドで秘密情報管理(AzureならKeyVaultとか)で管理しているのに ローカル環境に不揮発化しないと認証できないとか、絶句。
と、なりこの記事に至っているわけである。
なんとか、オンメモリでのデータで引き継げないかとか調べていたのだが まぁ、ほぼクライアント証明書認証は外部のライブラリ実装依存になって いるぽく、調べた限りファイル以外に選択肢がないのがPythonの現状でした。
PowerShellですらできるのに...
残念です、Python...
いずれできるといいな。