使用 TLS 的 ColdFusion 电子邮件设置

Posted

技术标签:

【中文标题】使用 TLS 的 ColdFusion 电子邮件设置【英文标题】:ColdFusion email settings with TLS 【发布时间】:2016-07-10 05:38:02 【问题描述】:

我正在尝试将 ColdFusion 配置为使用 1&1 的服务器 (smtp.1and1.com) 发送电子邮件,即使我设置了用户名和密码,它仍然失败。

这是我到目前为止所做的:

将发送服务器设置为 smtp.1and1.com 设置用户名和密码 将端口设置为 587 已选中使用 TLS 复选框 选中验证设置框

当我点击保存时,我收到消息“连接验证失败!”

在 mail.log 的 ColdFusion 日志文件中,我看到了这个错误:

"错误","scheduler-1","03/22/16","19:39:21","无法发送命令到 SMTP 主机”

我运行 WireShark 并捕获了一些数据包,它似乎确实连接到服务器,一些通信来回进行,然后中止。

以下是捕获的示例:

  No Time     Protocol Length Info
     1 0.000000 TCP      66     49858 ? 587 [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1
     2 0.000567 TCP      66     587 ? 49858 [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1460 SACK_PERM=1 WS=512
     3 0.000611 TCP      54     49858 ? 587 [ACK] Seq=1 Ack=1 Win=131328 Len=0
     4 0.007028 SMTP     112    S: 220 perfora.net (mreueus002) Nemesis ESMTP Service ready
     5 0.015100 SMTP     70     C: EHLO vm229CAC8
     6 0.015556 TCP      60     587 ? 49858 [ACK] Seq=59 Ack=17 Win=29696 Len=0
     7 0.015697 SMTP     159    S: 250 perfora.net Hello vm229CAC8 [**.**.**.**] | 250 SIZE 69920427 | 250 AUTH LOGIN PLAIN | 250 STARTTLS
     8 0.019485 SMTP     64     C: STARTTLS
     9 0.021416 SMTP     62     S: 220 OK
    10 0.058490 TLSv1    132    Client Hello
    11 0.059244 TLSv1    1514   Server Hello
    12 0.059246 TCP      1514   [TCP segment of a reassembled PDU]
    13 0.059283 TCP      54     49858 ? 587 [ACK] Seq=105 Ack=3092 Win=131328 Len=0
    14 0.059308 TLSv1    710    Certificate
    15 0.070314 TLSv1    61     Alert (Level: Fatal, Description: Certificate Unknown)
    16 0.070368 TCP      54     49858 ? 587 [FIN, ACK] Seq=112 Ack=3748 Win=130560 Len=0
    17 0.070858 TLSv1    61     Alert (Level: Fatal, Description: Internal Error)
    18 0.070905 TCP      54     49858 ? 587 [RST, ACK] Seq=113 Ack=3755 Win=0 Len=0
    19 0.071198 TCP      60     587 ? 49858 [FIN, ACK] Seq=3755 Ack=113 Win=29696 Len=0

所有这一切都让我觉得证书有问题(因为它在用户名和密码之前就中止了)。

我已经保存了数据包 14 中的 3 个证书并查看了它们,它们看起来都很好 - 有效性是好的,Thawte 是根 CA - 检查并确认包含的证书是好的,等等。

我错过了什么?还有其他日志文件可以更清楚地说明这个问题吗?

谢谢

【问题讨论】:

您检查过coldfusion管理门户中的日志文件吗? 是的 - 这是我看到错误“无法向 SMTP 主机发送命令” 您还有哪些其他连接选项?可能是服务器需要STARTTLS 它实际上是这样做的——参见它发出 STARTTLS 命令的数据包 8。我正在寻找我们所说的是否还有其他选择。 【参考方案1】:

我找到了。是证书。

ColdFusion 在 Java 之上运行。 Java 有自己的一组受信任的根证书。该服务器的根证书不存在(因此不可信)。

解决方案基本上归结为:

将根证书保存在文件中 将其导入 ColdFusion 的 java 运行机器的可信根证书中 重新启动 ColdFusion 以获取更改

第一步很简单——我在 WireShark 中展开了第 14 个数据包,里面有 3 个证书,将它们保存为 1.cer 2.cer 和 3.cer 文件(它是 3.cer,只有根文件)。我想我可以通过 https 访问 1&1 的任何网页并抓取它,但不确定他们是否会使用相同的根 CA。所以从实际数据包中提取它似乎是更安全的选择。

ColdFusion 安装在 C:\ColdFusion\ 中,为了找出它启动的 Java 运行时,我查看了 C:\ColdFusion\bin\cfstart.bin,它指的是 ..\runtime\bin\jrun -start coldfusion

它的 Java 运行机器将证书存储在 C:\ColdFusion\runtime\jre\lib\security\cacerts

剩下的就是如何将它导入到那个密钥库中——我按照here的建议使用了portecle。

重新启动 ColdFusion 并礼貌地要求它验证设置后,我在 WireShark 中看到了以下日志:

No.  Time     Protocol Length Info
 104 3.895581 TCP      66     55157 ? 587 [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=256 SACK_PERM=1
 105 3.896180 TCP      66     587 ? 55157 [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1460 SACK_PERM=1 WS=512
 106 3.896229 TCP      54     55157 ? 587 [ACK] Seq=1 Ack=1 Win=131328 Len=0
 107 3.902608 SMTP     112    S: 220 perfora.net (mreueus003) Nemesis ESMTP Service ready
 108 3.903791 SMTP     70     C: EHLO vm229CAC8
 109 3.904271 TCP      60     587 ? 55157 [ACK] Seq=59 Ack=17 Win=29696 Len=0
 110 3.904390 SMTP     159    S: 250 perfora.net Hello vm229CAC8 [**.**.**.**] | 250 SIZE 69920427 | 250 AUTH LOGIN PLAIN | 250 STARTTLS
 111 3.904532 SMTP     64     C: STARTTLS
 112 3.906347 SMTP     62     S: 220 OK
 118 4.112009 TCP      62     [TCP Retransmission] 587 ? 55157 [PSH, ACK] Seq=164 Ack=27 Win=29696 Len=8
 119 4.112057 TCP      66     55157 ? 587 [ACK] Seq=27 Ack=172 Win=131072 Len=0 SLE=164 SRE=172
 120 4.115457 TLSv1    132    Client Hello
 121 4.116154 TLSv1    1514   Server Hello
 122 4.116157 TCP      1514   [TCP segment of a reassembled PDU]
 123 4.116158 TLSv1    710    Certificate
 124 4.116201 TCP      54     55157 ? 587 [ACK] Seq=105 Ack=3748 Win=131328 Len=0
 125 4.156467 TLSv1    321    Client Key Exchange
 127 4.196201 TCP      60     587 ? 55157 [ACK] Seq=3748 Ack=372 Win=30720 Len=0
 128 4.196237 TLSv1    97     Change Cipher Spec, Encrypted Handshake Message
 129 4.196799 TCP      60     587 ? 55157 [ACK] Seq=3748 Ack=415 Win=30720 Len=0
 130 4.197005 TLSv1    97     Change Cipher Spec, Encrypted Handshake Message
 131 4.197742 TLSv1    91     Application Data
 132 4.198262 TLSv1    166    Application Data
 133 4.198550 TLSv1    87     Application Data
 134 4.199201 TLSv1    93     Application Data
 135 4.199677 TLSv1    117    Application Data
 136 4.200122 TLSv1    93     Application Data
 137 4.200345 TLSv1    101    Application Data
 138 4.240137 TCP      60     587 ? 55157 [ACK] Seq=3981 Ack=595 Win=30720 Len=0
 143 4.448738 TLSv1    105    Application Data
 154 4.652126 TCP      105    [TCP Retransmission] 587 ? 55157 [PSH, ACK] Seq=3981 Ack=595 Win=30720 Len=51
 155 4.652153 TCP      66     55157 ? 587 [ACK] Seq=595 Ack=4032 Win=131072 Len=0 SLE=3981 SRE=4032

还尝试发送一些测试电子邮件,一切都按预期工作。

感谢大家的帮助和建议! :)

附言我还发现了备份选​​项。结果 1&1 确实支持 TLS,但不需要它。没有 TLS 的普通旧 SMTP 在端口 587 上工作得很好。

我偶然发现了这个——它可能是 ColdFusion 中的一个错误(在我的例子中是第 9 版)。在 ColdFusion 的 Server Settings > Mail > Undelivered Mail 中,我告诉它重新发送失败的电子邮件。它确实做到了——但没有尝试 TLS 部分。

【讨论】:

以上是关于使用 TLS 的 ColdFusion 电子邮件设置的主要内容,如果未能解决你的问题,请参考以下文章

Coldfusion - 向Excel电子表格添加复选框

ColdFusion格式在电子邮件中丢失

Coldfusion电子邮件验证

在ColdFusion中存储自动交易电子邮件模板的位置

为什么不能在Coldfusion中顺序调用同一组件的两个方法?

如何在ColdFusion 2016中动态设置电子表格自动过滤器?