現在、とある事情により普通の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 件のコメント:
コメントを投稿