2021年8月22日日曜日

openssl verifyコマンドでシステム内のルート証明書を参照しない方法

現在、とある事情により普通のSSL証明書(Let's Encryptとかで取得したやつ)をオレオレCA証明書でクロス署名するという怪しげなことをやっています。

そんな怪しい証明書はどうやって作るんだと気になった方は今後の記事を楽しみにしていてください。そのうち説明します。

正しくクロス署名できているかを確認するためにopensslコマンドで検証しようと、以下のようなコマンドを入力してみました。

openssl verify -CAfile oreore-ca.pem -untrusted inter.pem server.pem

oreore-ca.pemがオレオレCA証明書、inter.pemが中間証明書、server.pemがサーバー証明書です。

この方法で無事OKのメッセージが出て検証成功したんですが、念のためにエラーケースも確認しようと-CAfileに全然関係ないルート証明書を指定したところ、なぜかそれでも検証成功してしまいました

今回はその奮闘記です。上の情報だけで原因と解決方法がわかった方はこの記事はスルーしてください。

原因

現象から推測できるとおりというかタイトルでネタバレしているとおり、上記のコマンドだと-CAfileに指定したルート証明書だけでなく、システムにインストールされているルート証明書も参照しているので関係ない証明書を指定しても検証が成功してしまいます。

その証拠に、クロス署名していないオレオレCA証明書だけから作ったSSL証明書-CAfileに別のルート証明書を指定したら検証エラーになりました。まあこれは当たり前というか、これでエラーにならなかったらopensslコマンドのバグとしかいいようがないんですが。

解決方法

最初に試したのは、システムにインストールされているルート証明書のディレクトリー名を変更すること。

つまり、/etc/ssl/certsの名前を/etc/ssl/certs.bakのように変更した上でopenssl verifyコマンドを実行しました(Linuxの場合)。

これでも一応うまくいったんですが、ルート証明書のディレクトリー名を変更するのはどう考えても美しい解決方法ではないので別の方法を探したところ、どうやら-CApathを指定していないことでデフォルトの証明書ディレクトリーを見に行っているのが原因ではないかと。そこで、空ディレクトリーを作って-CApath=/path/to/emptydirと指定することで無事システムのルート証明書を無視することができました。

これにて完全解決。めでたしめでたし・・・と思ったのですが、公式ページ-no-CApathというオプションがあるではありませんか。空ディレクトリーを作る必要すらなかった。openssl help verifyコマンドにも同様の記述がありました。

というわけで、マニュアルはちゃんと読みましょうというしょうもないオチでした。

おまけ

openssl verifyに指定するサーバー証明書は中間証明書と連結したものだとうまくいかないようです。単体の証明書を指定しましょう。

0 件のコメント:

コメントを投稿