- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在尝试测试我自己的 SMTP 服务器实现,它是我在 Grizzly 框架之上制作的,现在在 JavaMail 的帮助下检查 SMTPS 支持时遇到握手问题。
我找到了 similar problem握手但希望(或不适合我)我不使用 Grizlly SSLEngineConfigurator 的客户端模式,所以我想问题的根源应该是不同的。
我的 Grizzly SSL 配置初始化代码(在集成测试中)如下所示:
try (InputStream keystoreStream = TransportEncryptionIT.class.getResourceAsStream("server_keystore.jks")) {
SSLContextConfigurator sslCon = new SSLContextConfigurator();
sslCon.setSecurityProtocol("TLSv1.2");
sslCon.setKeyStoreType("JKS");
sslCon.setKeyStoreBytes(IOUtils.toByteArray(keystoreStream));
sslCon.setKeyStorePass("");
sslConf = new SSLEngineConfigurator(sslCon, false, false, false);
}
我还在 TransportFilter(这是链中的第一个过滤器)之后立即将 SSLFilter 安装到 FilterChain(使用服务器 SSL 配置)。
filterChainBuilder.add(new SSLFilter(sslConf , null));
并通过以下方式为 SMTPS 配置 javamail:
Properties properties = new Properties();
properties.setProperty("mail.transport.protocol", "smtps");
properties.setProperty("mail.smtps.host", ${host});
properties.setProperty("mail.smtps.port", ${port});
//need this since i'm using self signed certificate which is not added to truststore
properties.setProperty("mail.smtps.ssl.trust", "*");
握手结果(SSL 调试服务器):
[Raw read]: length = 163
0000: 01 00 00 9F 03 01 54 7C D5 30 98 30 CA 59 39 D7 ......T..0.0.Y9.
0010: B0 4A B6 FC 8F 8D E9 BD 4B 88 D6 BF EE E8 F9 FF .J......K.......
0020: 8A EB 28 CF 98 AB 00 00 38 C0 0A C0 14 00 35 C0 ..(.....8.....5.
0030: 05 C0 0F 00 39 00 38 C0 09 C0 13 00 2F C0 04 C0 ....9.8...../...
0040: 0E 00 33 00 32 C0 07 C0 11 00 05 C0 02 C0 0C C0 ..3.2...........
0050: 08 C0 12 00 0A C0 03 C0 0D 00 16 00 13 00 04 00 ................
0060: FF 01 00 00 3E 00 0A 00 34 00 32 00 17 00 01 00 ....>...4.2.....
0070: 03 00 13 00 15 00 06 00 07 00 09 00 0A 00 18 00 ................
0080: 0B 00 0C 00 19 00 0D 00 0E 00 0F 00 10 00 11 00 ................
0090: 02 00 12 00 04 00 05 00 14 00 08 00 16 00 0B 00 ................
00A0: 02 01 00 ...
Grizzly-worker(1), READ: TLSv1 Handshake, length = 163
Grizzly-worker(2), fatal error: 80: problem unwrapping net record
javax.net.ssl.SSLProtocolException: Handshake message sequence violation, 1
Grizzly-worker(2), SEND TLSv1.2 ALERT: fatal, description = internal_error
Grizzly-worker(2), WRITE: TLSv1.2 Alert, length = 2
握手结果(SSL 调试客户端):
[Raw read]: length = 249
0000: 01 00 00 F5 03 03 54 7C D5 30 6E 1C E7 B3 36 DE ......T..0n...6.
0010: A6 26 73 78 2B 66 D1 D1 E8 C4 94 CA 63 34 22 BF .&sx+f......c4".
0020: 60 9D 13 03 59 1F 00 00 70 C0 24 C0 28 00 3D C0 `...Y...p.$.(.=.
0030: 26 C0 2A 00 6B 00 6A C0 0A C0 14 00 35 C0 05 C0 &.*.k.j.....5...
0040: 0F 00 39 00 38 C0 23 C0 27 00 3C C0 25 C0 29 00 ..9.8.#.'.<.%.).
0050: 67 00 40 C0 09 C0 13 00 2F C0 04 C0 0E 00 33 00 g.@...../.....3.
0060: 32 C0 07 C0 11 00 05 C0 02 C0 0C C0 2C C0 2B C0 2...........,.+.
0070: 30 00 9D C0 2E C0 32 00 9F 00 A3 C0 2F 00 9C C0 0.....2...../...
0080: 2D C0 31 00 9E 00 A2 C0 08 C0 12 00 0A C0 03 C0 -.1.............
0090: 0D 00 16 00 13 00 04 00 FF 01 00 00 5C 00 0A 00 ............\...
00A0: 34 00 32 00 17 00 01 00 03 00 13 00 15 00 06 00 4.2.............
00B0: 07 00 09 00 0A 00 18 00 0B 00 0C 00 19 00 0D 00 ................
00C0: 0E 00 0F 00 10 00 11 00 02 00 12 00 04 00 05 00 ................
00D0: 14 00 08 00 16 00 0B 00 02 01 00 00 0D 00 1A 00 ................
00E0: 18 06 03 06 01 05 03 05 01 04 03 04 01 03 03 03 ................
00F0: 01 02 03 02 01 02 02 01 01 .........
main, READ: TLSv1.2 Handshake, length = 249
main, handling exception: javax.net.ssl.SSLProtocolException: Handshake message sequence violation, 1
main, SEND TLSv1.2 ALERT: fatal, description = unexpected_message
main, WRITE: TLSv1.2 Alert, length = 2
[Raw write]: length = 7
0000: 15 03 03 00 02 02 0A .......
main, called closeSocket()
对我来说奇怪的是 SMTP + StartTLS 与我的服务器完美配合,握手成功完成,我通过 ssl 调试检查了这一点。
我唯一不确定的是我使用的是未添加到信任库的自行创建的证书。会不会是 java 邮件选项“mail.${protocol}.ssl.trust”适用于 SMTP + StartTLS 但不知何故不适用于 SMTPS?
我也尝试使用 MailSSLSocketFactory强制 javamail 信任服务器证书,但它似乎甚至没有被调用(使用调试器检查)。
JavaMail 版本 1.4.7
灰熊 2.3.17
更新
最后我在源代码中发现了差异,这似乎与javamail无关,而是我对Grizzly框架的使用以及将SSLFilter安装到FilterChain。当我将服务器作为 SMTPS 服务器启动时,过滤器按以下方式安装:
filterChainBuilder.add(new TransportFilter());
if (configuration.getSslConfig() != null) {
sslFilter = new SSLFilter(configuration.getSslConfig(), null);
if (configuration.isSmtpsEnabled()) {
filterChainBuilder.add(sslFilter);
}
}
smtpLineCodecFilter = new SmtpLineCodecFilter();
filterChainBuilder.add(smtpLineCodecFilter);
但对于 StartTLS(因为客户端可能会要求提高传输加密),它以另一种方式完成:
FilterChain securedFilterChain = new DefaultFilterChain(defaultChain);
int transportFilterindex = defaultChain.indexOfType(TransportFilter.class);
// Add connection security layer to the chain
securedFilterChain.add(transportFilterindex + 1, sslFilter);
这种差异导致要安装不同的过滤器,因此过滤器链如下所示:
在第一种情况下 - SSLBaseFilter.SSLTransportFilterWrapper -> SSLFilter
在第二种情况下 - TransportFilter -> SSLFilter
现在我不确定哪个是正确的方法,但至少第二种情况对我有用。
我非常感谢 Grizzly Guru 的回答:)
最佳答案
您正在为“smtps”协议(protocol)配置所有内容,但也许您实际上并未使用 smtps 协议(protocol)?你是如何连接到服务器的?尝试使用 getTransport("smtps"),如 this JavaMail FAQ entry 中的代码示例所示.另外,请确保您是 not using Session.getDefaultInstance .如果这不起作用,请发布 JavaMail debug output .
关于ssl - JavaMail (SMTPS) + Grizzly,握手失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27238237/
我在 Cloudflare 的域名服务器上有一个域名 example.com。该域指向我的专用服务器的 IP 地址,该服务器运行 CentOS/WHM/cPanel。该站点可访问 - 一切都很好。 我
我正在努力将 SSL 支持添加到我们现有的应用程序中,并已开始考虑向后兼容性。 与我读过的其他帖子不同的一个特殊情况是服务器可能不一定使用 SSL 代码更新。所以我将有一个 SSL 客户端连接到一个对
我有几个 https://*.rest-service.mydomain.com。随着服务数量的增加,我觉得管理 SSL 证书的成本很高。我为 *.mydomain.com 购买了通配符证书。 新添加
我的客户要求我在他的网站上做反向 ssl。但我是这个学期的新手。谁能帮我解决这个问题。 请描述或引用如何做。 最佳答案 查看 this wiki article . In the case of se
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 去年关闭。 Improve this
我连接到我的网络服务器上的存储库,但是当我尝试推送我的更改时,它显示:“错误 403:需要 ssl”,但在我的存储库设置中我已经激活了 ssl 选项。 有什么建议吗? 最佳答案 当您连接到存储库时,您
抱歉,如果这听起来像是转储问题,我已经阅读了很多关于 SSL 握手和 SSL 工作原理的文章和文档。我对一件事感到困惑,如果有人能澄清我就太好了。 我知道私钥要保密。但是我已经看到通过在请求中指定私钥
随着物联网越来越主流,越来越需要从硬件发送http请求。 一个主要问题是硬件微 Controller 无法发送 ssl 请求,但大多数服务器/网站/服务都在使用 ssl。 所以,问题是,有没有桥(一个
我有一个 ssl 页面,它还从非 ssl 站点下载头像。我能做些什么来隔离该内容,以便浏览器不会警告用户混合内容吗? 最佳答案 只是一个想法 - 或者: 尝试在头像网站上使用 ssl url,如有必要
我在 Digital Ocean droplet(使用 nginx)上设置了两个域。我已经在其中一个(domain1)中安装了一个 SSL 证书,并且那个证书一切正常。第二个域 (domain2) 不
我收到这个错误: Error frontend: 502 Bad gateway 99.110.244:443 2017/09/28 13:03:51 [error] 34080#34080: *10
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 6 年前。 Improve
我遇到了一个问题,我正在构建一个 nginx 反向代理以定向到不同 url 路径上的多个微服务。 该系统完全基于 docker,因此开发和生产使用相同的环境。这在安装 SSL 时给我带来了问题,因为
所以我知道要求 SSL 证书和接受之间的根本区别,一个意味着您必须拥有 SSL 证书,另一个意味着您不需要。 在某个网页的 IIS 管理器中,我有以下设置: 我遇到的问题是,当我设置需要 SSL 证书
我今天才发现 .app 域名需要 SSL 证书。我购买它是为了将 DNS 重定向到已经设置了 SSL 证书的站点,所以我的问题是是否可以设置它? 我正在使用 Google Domains,在将合成临时
堆栈 : react ,NGINX 1.14.0,GUnicorn,Django 2.2.8,Python 3.6.9 错误 : 在浏览器:当 React 调用 Django API(当然是在请求头中
假设我在计算机上编辑主机文件以使 google.com 指向我的 VPS 服务器 IP,并且服务器具有通过 Apache 或 Nginx 配置的 google.com 的虚拟主机/服务器 block
我有一个场景,我正在处理用于 URL 路由的 IIS 网站配置。我已添加网站并在服务器上导入所需的证书。 我的情况是(我有多个网站 URL 和两个 SSL 证书 - 如下所示): qatest1.ab
我知道服务器发送的证书无法伪造(仍然存在 MD5 冲突,但成本高昂),但是伪造客户端又如何呢?在中间人攻击中:我们不能告诉服务器我们是合法客户端并从该服务器获取数据并对其进行操作,然后使用合法客户端公
我已通读相关问题,但无法完全找到我要查找的内容。我设置了一个名为“domain.com”的域,并创建了两个子域“client.domain.com”和“client-intern.domain.com
我是一名优秀的程序员,十分优秀!