TLS による、Confluence のメール サーバーのセットアップの問題
問題
Confluence が、TLS が有効化された状態でセキュアなポート (587) 経由でのメール サーバーへの接続に失敗する。次のエラーが返される。
An error has occurred with sending the test email:
com.atlassian.mail.MailException: javax.mail.MessagingException: Could not convert socket to TLS;
nested exception is:
javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
at com.atlassian.confluence.jmx.JmxSMTPMailServer.doSendWithMessageIdSupport(JmxSMTPMailServer.java:120)
at com.atlassian.confluence.jmx.JmxSMTPMailServer.send(JmxSMTPMailServer.java:79)
at com.atlassian.confluence.admin.actions.mail.SendTestEmailAction.execute(SendTestEmailAction.java:57)
診断
環境
- Java 8 で実行されている Confluence サーバー
Diagnostic Steps
メールのデバッグと SSL のデバッグ ロギングを次のように有効化します。
- Confluence を停止します。
CATALINA_OPTS
に -Dmail.debug=true と -Djavax.net.debug=ssl:handshake パラメーターを含めることでデバッグ ロギングを有効化します。「システム プロパティの構成」をご確認ください。これらのパラメーターにより、メール プロトコルの詳細のログがcatalina.log
に印刷されます。catalina.out
ログに詳細が表示されない場合はパラメーターに空白が含まれていないかどうかをご確認ください。プロパティ ファイルでパラメーターを追加する際に、パラメーター間に add を含めないでください。
- Confluence を再起動します。
テスト メールを再送します。結果は次のようになります (
catalina.log
内に出力)。
STARTTLS
220 TLS go ahead
Allow unsafe renegotiation: false
Allow legacy hello messages: true
Is initial handshake: true
Is secure renegotiation: false
Ignoring unsupported cipher suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 for TLSv1
.
.
http-nio-17000-exec-7, handling exception: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
http-nio-17000-exec-7, SEND TLSv1.2 ALERT: fatal, description = unexpected_message
http-nio-17000-exec-7, WRITE: TLSv1.2 Alert, length = 2
http-nio-17000-exec-7, called closeSocket()
上記のシナリオでは、Confluence と SMTP メール サーバーとの間の SSL ハンドシェイクが失敗しています。SSL ハンドシェイクに成功するには、Catalina.out ログ内のログ エントリが次のようになる必要があります。
server Finished handshake message
Followed by..
client Finished handshake message
原因
この問題は、誤った TLS バージョンが利用されているために発生します。これは、別の TLS バージョンを利用して以降の OpenSSL コマンドを実行することでも確認できます。適切な TLS バージョンの場合はメール サーバーの公開証明書が返されます。
openssl s_client -connect mail.example.com:587 -tls1 -starttls smtp
openssl s_client -connect mail.example.com:587 -tls1_1 -starttls smtp
openssl s_client -connect mail.example.com:587 -tls1_2 -starttls smtp
回避策
サポート対象の TLS バージョンを確認したら、Java で利用される TLS バージョンを強制する必要があります。
例: TLSv1.2 プロトコルを強制するには、「システム プロパティの構成」に従って次のパラメーターを追加します。
CATALINA_OPTS="-Dmail.smtp.starttls.enable=true -Dmail.smtp.ssl.protocols=TLSv1.2 ${CATALINA_OPTS}"