連載NIST PKITS証明書パス検証テストスイート(1)OpenSSLでとりま動かす
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でテストする記事を書いてたみたいです。なつい。
連載
Discussion