使用HTTPS(SSL)保护websocket

时间:2014-12-03 07:06:33

标签: java ssl websocket java-websocket

我在我的网络应用程序中使用websocket(ws://)。现在我在我的webapplication中实现了SSL,所以我实现了安全websocket(wss://)。所以我按照TooTallNate库文档来实现这个场景。

  1. Netty SSL and websockets

  2. SSLClientExample.java

  3. 但我在浏览器控制台中收到此网址。

    WebSocket connection to 'wss://localhost:9191/socket' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED

    对于实现安全websocket,我们需要在下面的代码中传递哪种算法?

    SSLContext context = SSLContext.getInstance(Algorithm);

    所以请帮我解决这个错误。

1 个答案:

答案 0 :(得分:1)

首先,对不起我的英语,但是即使问题已经四岁了,也许我也可以为您提供帮助,也许有人也会遇到同样的问题。

我们在这里。

例如,如果您使用"ws://localhost:8025",则Java websocket无法建立安全连接,请查看文档。

Websocket将仅创建结合SSL的安全连接。最后,您将使用"wss://localhost:8025"

让我们添加SSL:

首先,您将需要一个会话密钥。您可以在JavaJDK文件夹中找到该文件(例如,在 C:\ Program Files \ Java \ jdk1.8.0_191 \ bin \ keytool.exe中),该文件名为“ keytool.exe” 。这个小工具将生成一个会话密钥,应将其保存在客户端和服务器端。

现在使用该工具。例如:

keytool -genkey -keyalg RSA -validity 3650 -keystore "keystore.jks" -storepass "storepassword" -keypass "keypassword" -alias "default" -dname "CN=127.0.0.1, OU=MyOrgUnit, O=MyOrg, L=MyCity, S=MyRegion, C=MyCountry"

我从以下位置复制了上面的示例

https://github.com/TooTallNate/Java-WebSocket/blob/master/src/main/example/SSLClientExample.java

现在您可以从称为“ KEYSTORE”的特定文件中加载会话密钥。

KeyStore ks = KeyStore.getInstance( STORETYPE );
            File kf = new File( KEYSTORE );
            ks.load( new FileInputStream( kf ), STOREPASSWORD.toCharArray());

您需要生成一个密钥管理器和一个信任管理器。作者使用了“ SunX509”协议。

KeyManagerFactory kmf = KeyManagerFactory.getInstance( "SunX509" );
            kmf.init( ks, KEYPASSWORD.toCharArray() );
            TrustManagerFactory tmf = TrustManagerFactory.getInstance( "SunX509" );
            tmf.init( ks );

之后,该获取“真实的” SSL上下文了。您需要加载TLS协议。 SSL和TLS完全相同。生成ssl套接字时,您可以创建一个使用ssl / tls的新套接字。

SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
            SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

例如:我在一开始就使用

Session session = new Session(new Uri("wss://localhost:8025"));

我的 Session.class来自WebSocketClient 。因此,我可以使用:

session.setSocket(sslSocketFactory.createSocket());
session.connect();

注意:如果要使用“ wss”,则必须实现SSL或不使用SSL的“ ws”。

那么您的代码可能出什么问题了?

->您未在服务器端实现SSL,因此它将拒绝连接

这段代码完美地工作了,我做了测试。我只发布客户端消息,但服务器端代码相同:)

我希望到目前为止能为您提供帮助。