【问题标题】:Secure websocket with HTTPS (SSL) [duplicate]使用 HTTPS (SSL) 保护 websocket [重复]
【发布时间】:2015-01-31 15:45:21
【问题描述】:

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

  1. Netty SSL and websockets

  2. SSLClientExample.java

但是我在浏览器控制台中获取了这个 url。

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

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

SSLContext context = SSLContext.getInstance(Algorithm);

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

【问题讨论】:

  • 我遇到了同样的错误。你有想过吗?
  • ERR_CONNECTION_REFUSED 可能意味着您连接到错误的端口,而不是 WebServer 套接字侦听的端口。你连接到正确的端口了吗?
  • sslContext = SSLContext.getInstance("TLS")?
  • 您尝试连接到未侦听的端口。检查您的配置。

标签: java ssl websocket java-websocket


【解决方案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-socket 时,您可以创建一个使用 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,所以它会拒绝连接

这段代码运行良好,我确实对其进行了测试。我只为客户端发布,但服务器端将是相同的代码:)

到目前为止,我希望我能帮到你。

【讨论】:

  • 首先您需要一个公钥/私钥对。这不是会话密钥。它是两个相关的密钥,它们都不是会话密钥。您无需编写此处提供的任何代码:您可以通过系统属性完成所有操作。他做错的是试图连接到一个没有监听的端口。它实际上与 SSL 本身没有任何关系。
猜你喜欢
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多