Python で タイムスタンプ局を操作するには


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ライブラリがこれといって見つからない。さっと出てこないということは需要がない。ということか・・・