🔑

連載NIST PKITS証明書パス検証テストスイート(1)OpenSSLでとりま動かす

2023/02/13に公開

TLSサーバー証明書とか、証明書のチェーンが有効かどうかを判定するのに「認証パス検証(certification path validation)」というのをやるんですが、RFC 5280の6章で書かれているような複雑難解な処理をするわけで、「(この実装が)ホントに正しく検証できてんのかいな?」とか思っちゃいますよね。

様々なセキュリティの標準を作っている米国NISTでは、2010年頃、様々な証明書やCRLのパターンを使ってRFC 5280で規定されているパス検証機能の実装を確認するための247のテストケース、テストデータのセットとしてPublic Key Interoperability Test Suite(PKITS)というのを公開しています。

気づいている人も少ないと思いますが、OpenSSLには、ソースコードを展開してみると、NIST PKITSのテストを実行するためのスクリプトが「こっそり」含まれています。

OpenSSLでNIST PKITSを動かす

テスト内容はそのうち紹介するとして、とりあえずNIST PKITSのテストをOpenSSLで実行してみましょう。

用意するもの

  • OpenSSLをソースコードからビルドできる環境(LinuxやMacだと簡単、gcc、make、perlとか)
  • OpenSSLのソースコード (ココから例えばopenssl-3.0.8.tar.gzなどをダウンロード)
  • NIST PKITSのデータ (PKITS_data.zipをダウンロード)

まずはOpenSSLのビルド

OpenSSLのソースコードアーカイブをダウンロードして解凍してビルドしましょう。LinuxやMacの場合こんな感じ。

$ tar xvfz openssl-3.0.8.tar.gz
$ cd openssl-3.0.8
$ ./Configure
(略)
***   OpenSSL has been successfully configured                     ***
(略)
$ make
(終了までしばし待つ)

PKITSの解凍

ビルドしたフォルダの下にtestというフォルダがあります。そこには pkits-test.pl というPerlスクリプトがあり、これを実行すればよいんですが、その前に test/pkits フォルダにPKITSのデータを解凍、展開しておかなければなりません。

$ cd openssl-3.0.8
$ cd test
$ ls pkits-test.pl
$ mkdir pkits
$ cd pkits
$ unzip ~/Downloads/PKITS_data.zip
$ ls
ReadMe.txt	certs/		pkcs12/		pkits.schema
certpairs/	crls/		pkits.ldif	smime/

pkits-test.pl の実行

準備ができたので早速PKITSのテストスクリプトを実行してみましょう。

$ cd openssl-3.0.8
$ cd test
$ perl pkits-test.pl
Certificate will not expire
Running PKITS tests:
4.1 Signature Verification
4.1.5 Valid DSA Parameter Inheritance Test5 : Failed!
4.2 Validity Periods
4.3 Verifying Name Chaining
4.4 Basic Certificate Revocation Tests
4.5 Verifying Paths with Self-Issued Certificates
4.5.8 Invalid Basic Self-Issued CRL Signing Key Test8 : Failed!
4.6 Verifying Basic Constraints
4.6.1 Invalid Missing basicConstraints Test1 : Failed!
4.6.2 Invalid cA False Test2 : Failed!
4.6.3 Invalid cA False Test3 : Failed!
4.6.4 Valid basicConstraints Not Critical Test4 : Failed!
4.7 Key Usage
4.7.1 Invalid keyUsage Critical keyCertSign False Test1 : Failed!
4.7.2 Invalid keyUsage Not Critical keyCertSign False Test2 : Failed!
4.8 Certificate Policies
4.9 Require Explicit Policy
4.10 Policy Mappings
4.11 Inhibit Policy Mapping
4.12 Inhibit Any Policy
4.13 Name Constraints
4.14 Distribution Points
4.15 Delta-CRLs
4.16 Private Certificate Extensions
8 tests failed out of 247
(エラーメッセージは省略しています。)

MacのOpenSSL 3.0.8でNIST PKITSのテストを実行してみると、247件中8件のテストに失敗したと表示されていることがわかります。

何をテストしているのかは今は置いといて、いろんなテストに通って「概ね」大丈夫なんだろうなぁということはわかります。無事テストも動かせたので今日はこの辺で、、、

追記

2009年4月にNIST PKITSをJavaでテストする記事を書いてたみたいです。なつい。

連載

https://zenn.dev/kjur/articles/4593564bbed597

Discussion