ldaps のサーバ証明書をブラウザや openssl コマンドで取得する

RedmineLDAP 認証で ActiveDirectory のアカウントで認証するときのドメインコントローラーとの通信を ldaps にしようとしていたときに、ドメインコントローラーのサーバ証明書を確認したかったのですが、最初はわざわざリモートデスクトップでドメインコントローラーにログインして確認していました。


が、よく考えてみれば ldaps での通信開始時にクライアントにサーバ証明書が送られているはずなので、わざわざドメインコントローラーにログインするまでも無いはずだ、と気づきました。例えば https ならブラウザでサーバ証明書を確認をすることが出来ます。


・・・が、ldapsearch などのコマンドだと証明書の内容を表示したり出来なさそうでした・・・

ブラウザで ldaps のポートに https でアクセスする

ldaps も https も、SSL のレイヤーは同じはずなのでブラウザで ldaps のポートに https でアクセスすればいいんじゃ? と思い、試してみました。ブラウザで次のURLにアクセスします*1

https://dc.example.jp:636/

f:id:ngyuki:20120803091450p:image:w360


見たことの無いメッセージが表示されました。見ての通り FireFox ですが IE や Chrome でもメッセージは異なりますが大体同じようになります。ホスト名とは関係なくこの画面は表示されるようなので、お使いのブラウザで↑の URL をクリックすれば同じような画面が見られると思います。


どうやら最近のブラウザはいくつかの既知のポートにはアクセスしないようになっているようです。Chrome ではポート番号がソースコードに直接記述されておりビルドしなおさない限りは変更出来ないようです。


FireFox では about:config で network.security.ports.banned.override という文字列を新規作成し、値に許可したいポートを指定すればアクセス出来るようになります。

FireFox の設定

f:id:ngyuki:20120803101307p:image:w360


ポートフォワードでポート番号をごまかしてブラウザでアクセスする

前述の方法はセキュリティリクスを高めるかもしれないのであまり良くありません・・・そこで plink のポートフォワードでポート番号をごまかすことで、ブラウザの設定は変更せずにどうにかしてみました*2 *3

plink -L 443:dc.example.jp:636 -N server.example.jp


https://localhost/ にブラウザでアクセスします。


f:id:ngyuki:20120803090958p:image:w360


ばっちりです!!!(いや、有効期限切れちゃってるので全然ばっちりでは無いですが)

openssl s_client

そもそも、証明書の内容が確認できるクライアントツールが Linux に無いわけがない! と思って探したところ、openssl で普通に出来ました・・・

$ openssl s_client -connect dc.example.jp:636
CONNECTED(00000003)
depth=0 
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 
verify error:num=27:certificate not trusted
verify return:1
depth=0 
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
 0 s:
   i:/DC=jp/DC=example/CN=dc
---
Server certificate
-----BEGIN CERTIFICATE-----
MII... 略
-----END CERTIFICATE-----
subject=
issuer=/DC=jp/DC=example/CN=dc
 :
 :


他にも「openssl s_server」というコマンドもあり、証明書のテストなんかに使えそうです。

*1:dc.example.jp はドメインコントローラー

*2:server.example.jp は Linux などの ssh 接続可能な適当なサーバ

*3:plink は ssh とかに適当に読み替えてください