XMPP 与 TLS 实现

Posted

技术标签:

【中文标题】XMPP 与 TLS 实现【英文标题】:XMPP with TLS implementation 【发布时间】:2019-04-16 21:11:54 【问题描述】:

如何通过 TLS 连接到 XMPP 服务器?我已经阅读了这本书和关于它的 RFC 文档,并且说明在高概述中很清楚,但我缺少细节。

我正在构建我的own XMPP library,一旦我在端口 5222 上打开到客户端的套接字,我将发送初始 XML 以开始对话,然后:

<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>

服务器响应:

<proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>

在此之后,我不清楚我应该做什么,因为据说 TLS 魔法应该在这里发生,让服务器将证书发送给客户端。那是怎么做的,我怎么知道收到了?

在那之后,文件说应该终止流,并启动另一个流...这是否意味着我需要断开套接字或只是通过发送&lt;/stream:stream&gt; 来关闭流?

【问题讨论】:

我建议你看看其他客户是怎么做的。在现有客户端上启用控制台/调试模式并检查流程。它应该指导您如何解释规范。 我确实下载了其他库并尝试这样做,但我不敢相信没有关于如何做到这一点的详细资源,我的意思是,如果他们不知道他们是如何实现它的: ) 【参考方案1】:

我已经找到了问题的解决方案。我的错误是,在获得&lt;proceed&gt; 后,我关闭了套接字以将其切换到端口443、更改协议和其他类似的东西。

解决方案不是关闭连接,而是使用以下方法在现有连接上启用加密:

stream_socket_enable_crypto($this->socket->connection, 
                            true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT);

然后再次打开通讯

<?xml version='1.0' encoding='UTF-8'?>
<stream:stream to=.....

之后,您将获得有关如何进行身份验证的“真实”响应(即 PLAIN)。

这一切都在my library 中实现,所以你可以看看。

【讨论】:

以上是关于XMPP 与 TLS 实现的主要内容,如果未能解决你的问题,请参考以下文章

保护 XMPP 通信

XMPP 服务器。如何打开 TLS 连接?

如何使用 TLS/SSL 连接 xmpp 服务器?

如何在 java 中使用 Smack XMPP 库处理 TLS 证书

(a)Smack:尝试使用 XMPP 登录时,TLS 套接字已关闭

在 Google Talk XMPP TCP 连接上使用 TLS 使用 PHP