如何保护普通套接字通信?我写了一个只能连接到专用SSL端口(5223)的Jabber客户端(使用SSLSocket)。正常的方法是连接到Jabber标准端口5222并请求starttls
。我怎样才能做到这一点?如何通过普通Java套接字实现(SSL/TLS)安全通信
回答
我不能完全确定你所问的,但你可以通过使用SSLSocketFactory.createSocket()方法层上的现有的普通(非安全)插座安全套接字。这是使用类似starttls的方式“升级”套接字的一种方法。但这是艰难的做法。几乎可以肯定,你的XMPP库将提供对这种功能的高级访问。
好的。让我尝试一下。我正在尝试编写我自己的库。 – Bijoy 2012-01-15 22:51:58
@Bijoy:你真的说你想要实现你自己的SSL/TLS库吗(即使JRE中有一个为你提供的:JSSE)?这有点像你的标题听起来像。不过,你可能也不会要求对SO,如果这是你真正想做的事,你只是经过的RFC(在这种情况下,运气好的话...)。如果您只想编写自己的XMPP库并将普通TCP套接字升级到SSL/TLS套接字,请使用Gregs的建议。 – Bruno 2012-01-15 23:45:57
啊,对不起。通信错误,我完全想要编写我自己的XMPP库而不是SSL/TLS库。 – Bijoy 2012-01-16 04:39:01
期望管理:我没有用Jabber试过这个。但是,它的工作原理Gmail的SMTP服务器,所以也许......
这里是如何的插座升级到SSL插座,其中socket
是原始(非TLS)连接:
SSLSocket sslSocket = (SSLSocket) ((SSLSocketFactory) SSLSocketFactory.getDefault()).createSocket(
socket,
socket.getInetAddress().getHostAddress(),
socket.getPort(),
true);
InputStream inputStream = sslSocket.getInputStream();
OutputStream outputStream = sslSocket.getOutputStream();
// reads from the socket
Scanner scanner = new Scanner(inputStream);
// writes to the socket
OutputStream outputStream = new BufferedOutputStream(outputStream);
你尝试过什么?而不是听起来很愚蠢,但你有没有检查他们是你试图连接到服务器的SSL服务器实施。我不使用jabber,所以我不知道。如果没有服务器运行SSL连接,那么您的SSL客户端是浪费时间! – 2012-01-15 22:24:05
Google在talk.google.com上有5223个端口,但每个服务器中的大多数都为我们提供了传统的starttls方法。我不知道如何在请求启用TLS之后保护通信。 – Bijoy 2012-01-15 22:30:11
在java中创建SSL套接字与验证类似于创建标准套接字。你能提供一些代码以及你所得到的错误信息吗? – 2012-01-15 22:32:15