在 websocket java 中禁用 SSL 认证

Posted

技术标签:

【中文标题】在 websocket java 中禁用 SSL 认证【英文标题】:Disable SSL certification in websocket java 【发布时间】:2021-09-28 12:17:12 【问题描述】:

我有 java websocket 连接,它尝试登录到服务器,然后建立 websocket 连接。 websocket 类具有连接套接字连接的机制,其中 websocket 类构造函数的主类调用。

WebSocket(URI serverUri, Map<String, String> head) 
        super(serverUri, head);
    
socketUri = new URI(sockPath);
Map<String, String> head = new HashMap<>();
head.put("Authorization", "Bearer ".concat(headerToken));
client = new WebSocket(websocketUri, head);
client.setServerWebSocketUrlPathsockPath);
client.connect();

如何建立套接字连接以禁用 SSL 证书检查。

【问题讨论】:

【参考方案1】:

虽然禁用 SSL 证书检查不是好的做法,但这里有一个解决方案:

以下代码来自Nakov.com

    // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[] new X509TrustManager() 
                public java.security.cert.X509Certificate[] getAcceptedIssuers() 
                    return null;
                
                public void checkClientTrusted(X509Certificate[] certs, String authType) 
                
                public void checkServerTrusted(X509Certificate[] certs, String authType) 
                
            
        ;
 
        // Install the all-trusting trust manager
        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
 
        // Create all-trusting host name verifier
        HostnameVerifier allHostsValid = new HostnameVerifier() 
            public boolean verify(String hostname, SSLSession session) 
                return true;
            
        ;
 
        // Install the all-trusting host verifier
        HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid);

【讨论】:

我建议使用自定义 X509ExtendedTrustManager 而不是 X509TrustManager,因为它会部分禁用 SSL 验证。有关示例,请参见此处***.com/a/64982379/6777695 如何在上面的代码中使用它? @Flav 您只需执行一次此代码(在创建套接字之前)。我还建议您查看@Hakan54 的评论。 socketUri = new URI(sockPath);之前使用了上面的代码,但是没有用。 我刚刚编辑了答案。你的 WebSocket 实现是什么?

以上是关于在 websocket java 中禁用 SSL 认证的主要内容,如果未能解决你的问题,请参考以下文章

在给定的 java 代码中禁用 SSL 连接

JAVA 码头 9 Websocket SSL

java http可以websocket不行

Java程序禁用SSL认证的安全风险

在 Windows 上禁用 websocket

Java Secure Websocket - 从 TLS 证书文件加载 SSL 上下文并连接到 WSS URI