Java8安全WebSocket握手问题(Tyrus和Jetty)
我正在尝试在支持通过SSL进行安全传输的应用程序中实现WebSocket客户端。通过实现自定义密钥和信任管理器,应用程序已经支持HTTP上的标准SSL连接(这些自定义实现在需要时提示用户输入证书) 我无法获得到远程WebSocket端点的安全连接。失败发生在握手过程中。我尝试了WebSocket API的两种不同实现(Tyrus和Jetty),但都以相同的方式失败,这当然让我指向我们的SSL实现 正如我提到的,失败发生在握手过程中。连接似乎无法确定是否存在由服务器返回的受支持权限签名的客户端证书。我很难弄清楚我是否没有正确地向WebSocket API提供客户端证书,或者我们的自定义密钥/信任管理器是否正在被使用 下面是SSL调试日志的转储:Java8安全WebSocket握手问题(Tyrus和Jetty),java,ssl,jetty,java-websocket,tyrus,Java,Ssl,Jetty,Java Websocket,Tyrus,我正在尝试在支持通过SSL进行安全传输的应用程序中实现WebSocket客户端。通过实现自定义密钥和信任管理器,应用程序已经支持HTTP上的标准SSL连接(这些自定义实现在需要时提示用户输入证书) 我无法获得到远程WebSocket端点的安全连接。失败发生在握手过程中。我尝试了WebSocket API的两种不同实现(Tyrus和Jetty),但都以相同的方式失败,这当然让我指向我们的SSL实现 正如我提到的,失败发生在握手过程中。连接似乎无法确定是否存在由服务器返回的受支持权限签名的客户端证书
*** CertificateRequest
Cert Types: RSA, DSS
Cert Authorities:
(list of about 15 cert authorities supported by the server)
*** ServerHelloDone
Warning: no suitable certificate found - continuing without client authentication
*** CertificateChain
<empty>
***
***认证请求
证书类型:RSA、DSS
核证机关:
(服务器支持的大约15个证书颁发机构的列表)
***海龙石
警告:找不到合适的证书-在没有客户端身份验证的情况下继续
***认证中心
***
我已经在我们的TrustManager实现中设置了断点,以确定它们是否曾经被调用过,现在似乎没有被调用
我已经尝试调试这几天了,现在没有东西可以尝试了
如有任何建议,将不胜感激
下面是Jetty代码的一个片段:
SSLContext context = SSLContext.getInstance("TLS");
// getKeyManagers / getTrustManagers retrieves an
// array containing the custom key and trust manager
// instances:
KeyManager[] km = getKeyManagers();
TrustManager[] tm = getTrustManagers();
context.init(km, tm, null);
SslContextFactory contextFactory = new SslContextFactory();
contextFactory.setContext(context);
WebSocketClient client = new WebSocketClient(contextFactory);
SimpleEchoClient echoClient = new SimpleEchoClient();
try {
client.start();
ClientUpgradeRequest request = new ClientUpgradeRequest();
Future<Session> connection = client.connect(echoClient, uri, request);
Session session = connection.get();
// if everything works, do stuff here
session.close();
client.destroy();
} catch (Exception e) {
LOG.error(e);
}
SSLContext context=SSLContext.getInstance(“TLS”);
//GetKeyManager/GetTrustManager检索
//包含自定义密钥和信任管理器的数组
//实例:
KeyManager[]km=GetKeyManager();
TrustManager[]tm=getTrustManager();
init(km,tm,null);
SslContextFactory contextFactory=新的SslContextFactory();
setContext(context);
WebSocketClient=新的WebSocketClient(contextFactory);
SimpleChoClient echoClient=新的SimpleChoClient();
试试{
client.start();
ClientUpgradeRequest=新的ClientUpgradeRequest();
未来连接=client.connect(echoClient、uri、请求);
Session=connection.get();
//如果一切正常,就在这里做事
session.close();
client.destroy();
}捕获(例外e){
日志错误(e);
}
是否可以尝试使用rejectUnAuthorized:false,以便您的浏览器无法授权的证书将跳过授权
var ws = new WebSocket('wss://localhost:xxxx', {
protocolVersion: 8,
origin: 'https://localhost:xxxx',
rejectUnauthorized: false
});
不清楚这些ssl日志来自哪一方,客户端?服务器?服务器是什么?如何设置/配置服务器?服务器是否与其他ssl客户端(例如:openssl s_客户端)一起工作?这些日志来自客户端。我们还维护应用程序的web(angular)版本,并且此服务器终结点与该实现一起工作代码>工作吗?在
客户机.start()之后
contextFactory.getState()的值是多少?client.start()
之后,contextFactory.getState()的值是STARTED
。在没有我的自定义管理器和新的SslContextFactory(true)
的情况下尝试它会导致相同的行为。这实际上不是在浏览器中,而是一个独立的Java应用程序。