opensslコマンドのs_clientをtelnet的に使う時には必ず-ign_eofオプションをつけろ
opensslというコマンドは大抵のUNIX風OSのコアとして最小構成でOSをインストールしてもほぼ入っている。
Windowsにもopenssl.exeというバイナリがそこかしこから落せて使える。
さて、私を含めてSSLの一般素人はopensslコマンドはX509関係の証明書を申請する時かオレオレ証明書を作る時かSSL越えができるTELNETコマンドのような使い方をする時しか使わないであろう。そして今回はTELNETコマンドの代替として使う場合に気を付ける事を論じてみよう。
$ openssl s_client -connect <hostname>:<portnumber>
このコマンドというかオプションを使う時に-ign_eofというサブオプションをつけないと、行頭、より正確に言えばCRLF直後の1文字が大文字のRだとSSLの再接続、大文字のQだとSSLの切断(STARTTLSの反対でENDTLSとでも言うような動き)、というのは割といろいろなサイトに書かれている。
opensslコマンドはソースが公開されているのでそれの中にあるs_client.cを読むと、実はもう一つ大文字のBというのがある。これはよく分からないが去年か一昨年か世間を大騒ぎさせたHeartBeat関係の何かをするものっぽい。実際にHeartBeatが実装されていない相手と通信している時にBを打つとpeer does not accept heartbeatsと抜かしてopensslコマンドが終了してしまう。
記事のボリュームを増やすためにあれこれ書いたが要するにopensslコマンドをTELNET的に使う時には必ず-ign_eofというオプションをつけましょうという事。
$ openssl s_client -ign_eof -connect <hostname>:<portnumber>
これでみんな幸せ。僕も幸せ。