如何在以后将socat tcp4连接更改为SSL连接(使用XMPP协议)

如何在以后将socat tcp4连接更改为SSL连接(使用XMPP协议),ssl,xmpp,socat,Ssl,Xmpp,Socat,我正在考虑创建一个非常简单的XMPP代理。XMPP协议以纯文本开始,然后将套接字转换为SSL(如果支持),并继续 下面是一个XMPP会话示例,我将其精简为基本部分: 检查功能: (11:49:48) jabber: Sending (chris@localhost): <?xml version='1.0' ?> (11:49:48) jabber: Sending (chris@localhost): <stream:stream to='localhost' xmlns='

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

下面是一个XMPP会话示例,我将其精简为基本部分: 检查功能:

(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的socat“服务器”上尝试了同样的方法,直到它需要更改为SSL(为了可读性,我在这个输出中添加了“客户端:”和“服务器:”行。我将所有的“服务器:”行粘贴到终端中):

$socat tcp4监听:5222,reuseaddr,fork-
客户:
服务器:
客户:
服务器:

客户:tp�C�F�Q��|_光伏��J���=�^(�32g98kf�/ 有两种使用SSL/TLS的方法:
XMPP使用STARTTLS,其中客户端和服务器讨论其安全特性,然后客户端请求在通信中的任意点将套接字转换为TLS。
HTTPS和其他协议使用两个套接字,一个用于讨论安全特性,然后通信切换到第二个套接字设置,纯粹用于加密通信

socat:
不支持STARTTLS

openssl:
在客户端支持STARTTLS:

openssl s_client -starttls ...

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

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

socat:
不支持STARTTLS

openssl:
在客户端支持STARTTLS:

openssl s_client -starttls ...

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

您是否仍然对使用
socat
的解决方案感兴趣?应该可以通过生成子ssl socat的助手shell脚本来实现这一点…@vlp我正在使用XMPP,并发现它有一个“遗留ssl”模式,这只是普通的SSL,所以我刚刚打开了它,我不必担心更复杂的STARTTLS行为。所以我真的不再需要它了。但是如果您愿意,请随意尝试一下。我会尝试任何解决方案。您仍然对使用
socat
的解决方案感兴趣吗?应该可以通过生成子ssl socat…@vlp的helper shell脚本我正在使用XMPP,发现它有一个“遗留ssl”模式,这只是正常的SSL,所以我刚刚打开它,我不必担心更复杂的STARTTLS行为。所以我真的不再需要它了。但是如果你愿意,可以尝试一下。我会尝试任何解决方案。
$ 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 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=
openssl s_client -starttls ...