web-dev-qa-db-ja.com

STARTTLSのSSL暗号化をネゴシエートするopenssl

私はopensslを使用してSMTPサーバーに通常どおり(暗号化なしで)接続し、STARTTLSコマンドを送信し、SSL暗号化をネゴシエートしてから、暗号化されたセッションと対話します。

これは私が使用しているコマンドです(telnet経由):

openssl s_client -starttls smtp -crlf -connect 1.2.3.4:25

TLSハンドシェイクが成功したことを確認するにはどうすればよいですか?

これは、これまでに使用された一連のコマンドです。

<< 220 example.com ESMTP ready
>> EHLO localhost
<< 250-smtp.mail.yahoo.com
<< 250-PIPELINING
<< 250-AUTH PLAIN LOGIN CRAM-MD5
<< 250 STARTTLS
>> STARTTLS
<< 220 2.0.0 Start TLS
>> openssl s_client -starttls smtp -crlf -connect 127.0.0.1:587    
8

シェル(telnetopensslなどのコマンドを入力する場所)とソケットのプロトコルを混同しているようです。

Telnetを使用してSMTPなどのプロトコルのポートに接続することは、そのプロトコルのクライアントを実装する場合に通常プログラムする必要があるものを直接入力できるようにする簡単なハックです。テキストベースのプロトコルでは少し機能しますが、制限があります。特に、この方法でTLSハンドシェイクを入力するのは困難です。まず、送信する必要のあるバイトの一部について、キーボードで適切なキーを見つけることができない可能性があります。第二に、サーバーから送信された内容を確実に読み取ることができなくなります。要するに、このアプローチは意味がありません。

openssl s_client -starttls smtp -crlf -connect 127.0.0.1:587は、telnetで実行しようとしていることをすでに実行しています。サーバーへの接続を開き、EHLO SMTPコマンドを送信し、STARTTLS SMTPコマンドを送信してから、ハンドシェーク。 OpenSSLコマンド自体はSMTPプロトコルの一部ではないため、SMTPソケットで送信しないでください。このコマンドを実行すると、ハンドシェイクを実行した状態でtelnetセッションを実行した場合と同様になります。これは、telnetと同じように標準入力/出力を使用できるためです。

そうは言っても、SMTPコマンドを送信するためのtelnetopenssl s_clientはどちらも、せいぜいデバッグ手法です。

19
Bruno