首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在稍后点将套接字tcp4连接转换为SSL连接(使用XMPP协议)

如何在稍后点将套接字tcp4连接转换为SSL连接(使用XMPP协议)
EN

Stack Overflow用户
提问于 2016-01-13 04:55:36
回答 1查看 1.7K关注 0票数 1

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

下面是一个XMPP会话示例,我已经将其简化为基本部分:检查特性:

代码语言:javascript
复制
(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和exchange密钥进行通信:

代码语言:javascript
复制
(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会话中:

代码语言:javascript
复制
(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'>

当我试图创建一个套接字SSL“服务器”并使用Pidgin连接到它时,我得到了未知的协议:

代码语言:javascript
复制
$ 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

我对一个非SSL“服务器”的套接字进行了同样的尝试,直到它需要更改为SSL为止(为了便于阅读,我在输出中添加了"Client:“和"Server:”)。所有“服务器:”线都是由我粘贴到终端中的):

代码语言:javascript
复制
$ 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协议一无所知,所以它不知道何时切换。可以让socat像那样动态地切换,还是应该考虑其他方法来做到这一点?

编辑:,我做了一些更多的研究。

许多协议,例如HTTPS使用“始终加密”连接。

XMPP使用starttls,这基本上意味着未加密的连接,直到客户机和服务器同意将连接升级到加密为止。

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

所以我想我真正的问题是,socat能处理使用starttls的协议吗?我不认为openssl可以。还有其他工具可以做到这一点吗?或者我应该使用SSL库来编写自己的工具吗?

EN

回答 1

Stack Overflow用户

发布于 2016-01-18 00:38:42

有两种使用SSL/TLS的方法:

XMPP使用STARTTLS,客户端和服务器讨论它们的安全特性,然后客户端请求在通信的任意点将套接字转换为TLS。

HTTPS和其他套接字使用两个套接字,一个用于讨论安全特性,然后将通信切换到第二个套接字设置,纯粹用于加密通信。

socat:

不支持STARTTLS。

openssl:

在客户端支持STARTTLS:

代码语言:javascript
复制
openssl s_client -starttls ...

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34758658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档