gpt4 book ai didi

ssl - 稍后如何将 socat tcp4 连接更改为 SSL 连接(使用 XMPP 协议(protocol))

转载 作者:太空宇宙 更新时间:2023-11-03 13:37:34 25 4
gpt4 key购买 nike

我正在考虑创建一个非常简单的 XMPP 代理。 XMPP 协议(protocol)以纯文本开头,然后将套接字转换为 SSL(如果支持)并继续。

这是一个 XMPP session 示例,我已将其缩减为基本部分:检查功能:

(11:49:48) jabber: Sending (chris@localhost): <?xml version='1.0' ?>
(11:49:48) jabber: Sending (chris@localhost): <stream:stream to='localhost' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>
(11:49:48) jabber: Recv (358): <?xml version='1.0'?><stream:stream xmlns:stream='http://etherx.jabber.org/streams' version='1.0' from='localhost' id='5dea6b36-2da5-485a-8bed-16884e56d6f3' xml:lang='en' xmlns='jabber:client'><stream:features><starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'><required/></starttls><register xmlns='http://jabber.org/features/iq-register'/></stream:features>

告诉服务器开始使用 SSL 进行通信并交换 key :

(11:49:48) jabber: Sending (chris@localhost): <starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
(11:49:48) jabber: Recv (50): <proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
(11:49:48) nss: SSL version 3.3 using 256-bit AES with 256-bit SHA256 MAC
Server Auth: 2048-bit RSA, Key Exchange: 2048-bit RSA, Compression: NULL
Cipher Suite Name: TLS_RSA_WITH_AES_256_CBC_SHA256
(11:49:48) certificate: Successfully verified certificate for localhost

我们现在处于 SSL session 中:

(11:49:48) jabber: Sending (ssl) (chris@localhost): <stream:stream to='localhost' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>
(11:49:48) jabber: Recv (ssl)(447): <?xml version='1.0'?><stream:stream xmlns:stream='http://etherx.jabber.org/streams' version='1.0' from='localhost' id='74a00818-e037-4405-ada1-02bb3dbfe023' xml:lang='en' xmlns='jabber:client'>

当我尝试创建一个 socat SSL“服务器”并使用 Pidgin 连接到它时,我得到了未知的协议(protocol):

$ socat openssl-listen:5222,reuseaddr,cert=$HOME/server.pem,cafile=$HOME/client.crt,fork -
2016/01/13 14:00:59 socat[28586] E SSL_accept(): error:140760FC:SSL routines:SSL23_GET_CLIENT_HELLO:unknown protocol

我用 socat 非 SSL“服务器”尝试了同样的事情,它一直工作到需要更改为 SSL(为了便于阅读,我在这个输出中添加了“Client:”和“Server:”。所有的“服务器:”行被我粘贴到终端):

$ socat tcp4-listen:5222,reuseaddr,fork -
Client: <?xml version='1.0' ?><stream:stream to='localhost' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>
Server: <?xml version='1.0'?><stream:stream xmlns:stream='http://etherx.jabber.org/streams' version='1.0' from='localhost' id='5dea6b36-2da5-485a-8bed-16884e56d6f3' xml:lang='en' xmlns='jabber:client'><stream:features><starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'><required/></starttls><register xmlns='http://jabber.org/features/iq-register'/></stream:features>
Client: <starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
Server: <proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
Client: tp�C?�f�Q��|_pV��j���=�^(�32g98kf�/<5=

在最后一行,客户端现在正尝试使用 SSL 与我们交谈,因此我需要一种方法来告诉 socat 在此时切换到 SSL。 Socat 显然对 XMPP 协议(protocol)一无所知,因此它不知道何时切换。可以告诉 socat 像那样动态切换,还是我应该寻找其他方法来做到这一点?

编辑:我做了更多研究。
许多协议(protocol),例如 HTTPS 使用“始终加密”的连接。
XMPP 使用 starttls,这基本上意味着未加密的连接,直到客户端和服务器同意将连接升级为加密。

编辑: 我刚刚查看了 openssl,它有一个用于 s_client 的 -starttls,但没有用于 s_server,这向我表明这是一个架构问题,很难知道或被告知什么时候以及如何将连接升级为加密。

所以我想我真正的问题是,socat 能否处理使用 starttls 的协议(protocol),有或没有一些手动干预来告诉它何时切换?我不认为openssl可以。有没有其他工具可以做到这一点,或者我当然应该使用 SSL 库编写自己的工具?

最佳答案

有两种使用SSL/TLS的方法:
XMPP 使用 STARTTLS,其中客户端和服务器讨论它们的安全特性,然后客户端请求在通信的任意点将套接字转换为 TLS。
HTTPS 和其他协议(protocol)使用两个套接字,一个用于讨论安全功能,然后通信切换到另一个套接字设置,纯粹用于加密通信。

索卡特:
不支持 STARTTLS。

打开SSL:
在客户端支持 STARTTLS:

openssl s_client -starttls ...

据我所知,在服务器端,每种情况都需要自定义代码。我找到了 this有用的 Python 脚本。

关于ssl - 稍后如何将 socat tcp4 连接更改为 SSL 连接(使用 XMPP 协议(protocol)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34758658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com