Redmine の LDAP 認証で ActiveDirectory のアカウントで認証するときのドメインコントローラーとの通信を ldaps にしようとしていたときに、ドメインコントローラーのサーバ証明書を確認したかったのですが、最初はわざわざリモートデスクトップでドメインコントローラーにログインして確認していました。
が、よく考えてみれば ldaps での通信開始時にクライアントにサーバ証明書が送られているはずなので、わざわざドメインコントローラーにログインするまでも無いはずだ、と気づきました。例えば https ならブラウザでサーバ証明書を確認をすることが出来ます。
・・・が、ldapsearch などのコマンドだと証明書の内容を表示したり出来なさそうでした・・・
ブラウザで ldaps のポートに https でアクセスする
ldaps も https も、SSL のレイヤーは同じはずなのでブラウザで ldaps のポートに https でアクセスすればいいんじゃ? と思い、試してみました。ブラウザで次のURLにアクセスします*1。
https://dc.example.jp:636/
見たことの無いメッセージが表示されました。見ての通り FireFox ですが IE や Chrome でもメッセージは異なりますが大体同じようになります。ホスト名とは関係なくこの画面は表示されるようなので、お使いのブラウザで↑の URL をクリックすれば同じような画面が見られると思います。
どうやら最近のブラウザはいくつかの既知のポートにはアクセスしないようになっているようです。Chrome ではポート番号がソースコードに直接記述されておりビルドしなおさない限りは変更出来ないようです。
FireFox では about:config で network.security.ports.banned.override という文字列を新規作成し、値に許可したいポートを指定すればアクセス出来るようになります。
ポートフォワードでポート番号をごまかしてブラウザでアクセスする
前述の方法はセキュリティリクスを高めるかもしれないのであまり良くありません・・・そこで plink のポートフォワードでポート番号をごまかすことで、ブラウザの設定は変更せずにどうにかしてみました*2 *3。
plink -L 443:dc.example.jp:636 -N server.example.jp
https://localhost/ にブラウザでアクセスします。
ばっちりです!!!(いや、有効期限切れちゃってるので全然ばっちりでは無いですが)
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」というコマンドもあり、証明書のテストなんかに使えそうです。