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クライアントが必要です。
Code language: Bash (bash)sudo apt-get install opensslsudo yum install openssl
Create SMTP AUTH log-in information with Perl#
TLS上のSMTP AUTH PLAIN認証をテストするには、ログイン情報を作成する必要があります。 ログイン情報は、usename(メールアドレス)とパスワード、そして特殊文字の\0
です。 通常は、電子メールアドレスとそのパスワードです。
ベース64エンコードされた組み合わせを作成するには、Perlを使用することができます。
Code language: Perl (perl)perl -MMIME::Base64 -e 'print encode_base64("\000username\@example.com\000password")'
@
\
)でエスケープすることを忘れてはいけません、そうしないと配列として解釈されてしまいます。 base64エンコードされた文字列は次のようになります。
Code language: Bash (bash)AHVzZXJuYW1lQGV4YW1wbGUuY29tAG15X3Bhc3N3b3Jk
SMTP AUTHのログイン情報をBash#で
ログインハッシュの生成には必ずしもPerlが必要ではなく、Bashも使用できます。
Code language: Bash (bash)echo -ne '\[email protected]\0password' | base64
Connect to an SMTP server with openssl in bash#
bashでは、以下に説明するようにopenssl
コマンドを使用して、SMTPサーバーとのTLS暗号化接続を設定できます。
Code language: Bash (bash)openssl s_client -connect smtp.example.com:25 -starttls smtp
これは多くの冗長な出力を行いますが、心配しないでください 🙂
接続が行われると、SMTP 250 コードが表示されます:
250 DSN
これは、SMTP トランザクションを開始できることを意味します。 EHLO
を使用して、SMTPサーバーにサポートされている動詞を出力させます。
Code language: YAML (yaml)EHLO there250-smtp.example.com250-PIPELINING250-SIZE 52428800250-ETRN250-AUTH PLAIN LOGIN250-ENHANCEDSTATUSCODES250-8BITMIME250 DSN
ここでは、ログイン方法としてAUTH PLAIN LOGIN
が表示されています。 SMTPメールサーバーは、あなたが望む認証メカニズムをサポートしています。 あなたの完全なユーザー名とパスワードのログイン情報は、base64エンコードされた文字列に包まれています。
Code language: Nginx (nginx)AUTH PLAIN AHVzZXJuYW1lQGV4YW1wbGUuY29tAG15X3Bhc3N3b3Jk
すべてがうまくいくと、SMTP サーバーは認証の成功を報告します
Code language: YAML (yaml)235 2.7.0 Authentication successful
ユーザー名とパスワードの組み合わせは 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-Win32
c:\OpenSSL-Win64
にインストールします。 -
strawberry-perl-5.18.2.2-32bit.zip
strawberry-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.cfg
WARNING: can't open config file: /usr/local/ssl/openssl.cnf
Windows#でPerl/opensslを使用してSMTP AUTHのログイン情報を作成し、SMTPサーバーに接続する
以下のPerlコマンドを使用して、base64でエンコードされたログイン文字列を生成します。 引用符に注意してください。
Code language: Perl (perl)perl.exe -MMIME::Base64 -e "print encode_base64(\"\000username\@example.com\000password\")
この例では、出力は
AHVzZXJuYW1lQGV4YW1wbGUuY29tAHBhc3N3b3Jk
openssl.exe
でSMTPサーバーに接続します。 また、EHLO
AUTH PLAIN
で先ほどの手順を繰り返します。
Code language: PowerShell (powershell)c:\OpenSSL-Win64\bin>openssl.exe s_client -connect smtp.example.com:25 -starttls smtp
Bonus: verify StartTLS for SMTP-, POP3- or IMAP servers – Check HTTPS TLS/SSL certificates#
メールサーバー(SMTP、POP3、またはIMAP)がStartTLSをサポートしているかどうかを確認するには、以下のOpenSSLコマンドを使用します。
Code language: Bash (bash)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
Check HTTPS TLS/SSL certificate
openssl
を使用して、HTTPS接続のチェックと検証を行います:
Code language: Bash (bash)openssl s_client -tls1_2 -servername host -connect 203.0.113.15:443
hostをホストヘッダーまたはドメイン名に、203.
Protip: check SSL certificate expiration date.
このワンライナーは、openssl
を使って、LinuxのコマンドラインからSSL証明書の有効期限をチェックします:
Code language: Bash (bash)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
HTH! 🙂