How to test SMTP Authentication and StartTLS

How to test SMTP authentication and StartTLS using the command line?

SMTP認証の問題、特にTLS暗号化されたSMTP接続を調査する際に、SMTP認証とStartTLS接続をテストできれば常に便利です。 できれば、コマンドラインから。

SMTP Authentication#

SMTP 認証は、ISP のクライアントが電子メールを送信しようとしているメール サーバーに自分自身を識別するためのメカニズムです。

SMTP Authentication (SMTP AUTHと略されることが多い)は、Simple Mail Transfer Protocolの拡張機能で、SMTPクライアントがSMTPサーバーでサポートされている認証メカニズムの中から選択したものを使用してログインすることができます。

Transport Layer Security (TLS)とは

Transport Layer Security (TLS)とその前身であるSecure Sockets Layer (SSL)は、インターネット上での通信セキュリティを提供するために設計された暗号プロトコルです。 このプロトコルは、X.509 証明書を使用することで、通信相手を保証し、共通鍵を交換する非対称暗号方式を採用しています。

Test TLS connections and SMTP AUTH from the Linux and Windows command line#

ほとんどのSMTPおよびメール送信の問題は、ユーザー名とパスワードのログインの組み合わせが間違っているか、メールサーバーがStartTLSをサポートしていないか、または使用されている認証メカニズムが間違っていることに起因しています。

OpenSSL と SMTP AUTH オプションで (Start)TLS 暗号化された接続を検証できることは、認証された SMTP を使用して TLS 暗号化された接続 (Web サイトから) で電子メールを送信する電子メール フォームで問題が発生する場合に最適です。

TLS上のSMTP認証を検証するには、OpenSSLクライアントが必要です。

sudo apt-get install opensslsudo yum install openssl
Code language: Bash (bash)

Create SMTP AUTH log-in information with Perl#

TLS上のSMTP AUTH PLAIN認証をテストするには、ログイン情報を作成する必要があります。 ログイン情報は、usename(メールアドレス)とパスワード、そして特殊文字の\0です。 通常は、電子メールアドレスとそのパスワードです。

ベース64エンコードされた組み合わせを作成するには、Perlを使用することができます。

perl -MMIME::Base64 -e 'print encode_base64("\000username\@example.com\000password")'
Code language: Perl (perl)

@\)でエスケープすることを忘れてはいけません、そうしないと配列として解釈されてしまいます。 base64エンコードされた文字列は次のようになります。

AHVzZXJuYW1lQGV4YW1wbGUuY29tAG15X3Bhc3N3b3Jk
Code language: Bash (bash)

SMTP AUTHのログイン情報をBash#で

ログインハッシュの生成には必ずしもPerlが必要ではなく、Bashも使用できます。

echo -ne '\[email protected]\0password' | base64
Code language: Bash (bash)

Connect to an SMTP server with openssl in bash#

bashでは、以下に説明するようにopensslコマンドを使用して、SMTPサーバーとのTLS暗号化接続を設定できます。

openssl s_client -connect smtp.example.com:25 -starttls smtp
Code language: Bash (bash)

これは多くの冗長な出力を行いますが、心配しないでください 🙂

接続が行われると、SMTP 250 コードが表示されます:

250 DSN

これは、SMTP トランザクションを開始できることを意味します。 EHLOを使用して、SMTPサーバーにサポートされている動詞を出力させます。

EHLO there250-smtp.example.com250-PIPELINING250-SIZE 52428800250-ETRN250-AUTH PLAIN LOGIN250-ENHANCEDSTATUSCODES250-8BITMIME250 DSN
Code language: YAML (yaml)

ここでは、ログイン方法としてAUTH PLAIN LOGINが表示されています。 SMTPメールサーバーは、あなたが望む認証メカニズムをサポートしています。 あなたの完全なユーザー名とパスワードのログイン情報は、base64エンコードされた文字列に包まれています。

AUTH PLAIN AHVzZXJuYW1lQGV4YW1wbGUuY29tAG15X3Bhc3N3b3Jk
Code language: Nginx (nginx)

すべてがうまくいくと、SMTP サーバーは認証の成功を報告します

235 2.7.0 Authentication successful
Code language: YAML (yaml)

ユーザー名とパスワードの組み合わせは base64 エンコードされており、プレーンテキストで送信されるため、SMTP 接続を保護するために StartTLS/TLS 暗号化が必要です。

Protip: WordPressからTLS経由で認証済みのSMTPメールを送信する方法をご紹介します。 また、PHP、ASP、ASP.NETで、TLSで暗号化された接続で認証されたSMTPを送信する方法もあります。 すてきですね。

Windows#にOpenSSLとPerlをインストールする方法

Windows ServerやWindows 8.1、10で上記のことを実現するには、OpenSSLとPerlをダウンロードする必要があります。1または10で上記のことを行うためには、OpenSSLクライアントとPerl(私はStrawberry Perlを使用しています)をダウンロードしてインストールする必要があります。

  • Win32 OpenSSL Installation Project (適切なフレーバーを選択してください)
  • Strawberry Perl Releases (私はインストール不要のZIP版を使用しています)
  • OpenSSLをc:\OpenSSL-Win32c:\OpenSSL-Win64にインストールします。
  • strawberry-perl-5.18.2.2-32bit.zipstrawberry-perl-5.18.2.2-64bit.zipを解凍し、フォルダをc:

Configure your Windows OpenSSL environment#

次に、openssl.cnfの警告を防ぐために、WindowsのOpenSSL環境を設定します。exeコマンドラインで、set OPENSSL_CONF=c:\OpenSSL-Win64\bin\openssl.cfgWARNING: can't open config file: /usr/local/ssl/openssl.cnf

Windows#でPerl/opensslを使用してSMTP AUTHのログイン情報を作成し、SMTPサーバーに接続する

以下のPerlコマンドを使用して、base64でエンコードされたログイン文字列を生成します。 引用符に注意してください。

perl.exe -MMIME::Base64 -e "print encode_base64(\"\000username\@example.com\000password\")
Code language: Perl (perl)

この例では、出力は

AHVzZXJuYW1lQGV4YW1wbGUuY29tAHBhc3N3b3Jk

openssl.exeでSMTPサーバーに接続します。 また、EHLOAUTH PLAINで先ほどの手順を繰り返します。

c:\OpenSSL-Win64\bin>openssl.exe s_client -connect smtp.example.com:25 -starttls smtp
Code language: PowerShell (powershell)

Bonus: verify StartTLS for SMTP-, POP3- or IMAP servers – Check HTTPS TLS/SSL certificates#

メールサーバー(SMTP、POP3、またはIMAP)がStartTLSをサポートしているかどうかを確認するには、以下のOpenSSLコマンドを使用します。

openssl s_client -connect imap.example.com:143 -starttls imapopenssl s_client -connect pop.example.com:110 -starttls pop3openssl s_client -connect smtp.example.com:25 -starttls smtp
Code language: Bash (bash)

Check HTTPS TLS/SSL certificate
opensslを使用して、HTTPS接続のチェックと検証を行います:

openssl s_client -tls1_2 -servername host -connect 203.0.113.15:443
Code language: Bash (bash)

hostをホストヘッダーまたはドメイン名に、203.

Protip: check SSL certificate expiration date.
このワンライナーは、opensslを使って、LinuxのコマンドラインからSSL証明書の有効期限をチェックします:

echo | openssl s_client -connect mx.example.com:25 -starttls smtp | openssl x509 -noout -datesecho | openssl s_client -connect ftp.example.com:21 -starttls ftp | openssl x509 -noout -dates
Code language: Bash (bash)

HTH! 🙂

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です