Python+OpenSSLを使うには?
- pyOpensslが一番ハードルが低い。
- CA局も作ろうと思えば作ることができる。
- import ssl
- 比較的低レイヤーのOpenSSLの機能を触ることができる。
今回やろうとしていることは、(オレオレ)タイムスタンプ局
事前情報として
- (オレオレ)CA局とは別物
- OpenSSLでいうと、version 1.1.0あたりから本流に組み込まれた「openssl ts」コマンド体系でできることをしたい。
シェルでopensslコマンドを叩いてそもそも実現可能か?
色々調べるが、下記のサイトぐらいしか具体的な記事が見当たらない。
Setting to create Timestamping Authority certificate signing request
このサイトの情報を見ると、設定ファイルopenssl.cfg全体が掲載されているので、それを元にコマンドレベルで実行できるのか確認してみる。
- 基本的には動作するようだが、色々とひっかかる部分があった。
- 設定ファイルの情報が全体的に少し古い。暗号化方式の設定にSHA-2が含まれていない等。
- 実行時にopensslのエラーが出るので、それを元に一つ一つエラーを解消していく。
- 最後の検証「openssl ts -verify」で、証明書が見つからないエラーになる。
- コマンドの最後「openssl ts -verify ・・・ -CAfile 」 の後に、「-untrusted <タイムスタンプ局の証明書>」オプションが必要)
Pythonから同じようにできないのか?
- pyOpensslを調べるも、それらしい機能が見当たらない。
- pyOpensslが依存関係にあるcryptography.hazmatにもなさそう。
- 例えば、OpenSSLのts_main関数に含まれている TS_REQ_new()関数辺りが使えるようになっていない。
- そもそも、pyOpensslはcryptographyに依存しており、cryptographyはopensslのversion 1.0.2までのように見える?
結局Pythonからシェル経由で駆動させるしかないのか?
$ openssl ts -query ・・・
$ openssl ts -reply ・・・
$ openssl ts -verify ・・・
上記のコマンドについてもう少し調べてみると、
①まずクライアント側、つまり署名を要求する側が-queryで署名要求ファイルを生成し、
②次にタイムスタンプ局が-replyで署名済みファイルを生成し、
③再びクライアント側が署名済みファイルの検証を行うようだ。
ということは、②の部分だけpythonで実装できればよいのではないか?
RFC3161を実装しているpython用ライブラリはないのか?
TimestampについてはRFC3136に定義されているようだが、それに準拠したpythonライブラリがこれといって見つからない。さっと出てこないということは需要がない。ということか・・・