使用 java-websockets 的 Java SSL - 拒绝连接

问题描述

我已经尝试将现有的 websocket 实现从使用 WS 更改为 WSS 大约一个星期了,但没有成功。我尝试在网上遵循许多示例并遇到各种错误。这里的最终目标是让一个网页通过 SSL 连接到我运行 websocket 的 java 应用程序。因此,首先我认为在我使用网页替换 Java 客户端之前,尝试让两个 Java 应用程序能够连接会很好。

我使用以下内容生成一个密钥库、证书和信任库:

keytool -genkey -keyalg RSA -validity 3650 -keystore "C:\users\user\Desktop\fb1dasslkeystore.jks" -storepass "test11" -keypass "test11" -alias "FB1DASSL" -dname "CN=127.0.0.1,OU=CA,O=Company,L=Location,S=State,C=USA"

在这里,我按照建议将其迁移到 pkcs12:

keytool -importkeystore -srckeystore C:\users\user\Desktop\fb1dasslkeystore.jks -destkeystore C:\users\user\Desktop\fb1dasslkeystore.jks -deststoretype pkcs12

keytool -export -alias FB1DASSL -keystore C:\users\user\Desktop\fb1dasslkeystore.jks -file C:\users\user\Desktop\fb1da.cert

keytool -import -file C:\users\user\Desktop\fb1da.cert -alias FB1DASSL -keystore C:\users\user\desktop\mytruststore.jts

然后,我使用“管理计算机证书”将证书导入 Windows 中的受信任证书点,并将其加载到受信任的根证书颁发机构下(用于以后的网络内容)。

然后尝试运行我的服务器和客户端,但一直收到“连接被拒绝”。或者我得到 javax.net.ssl.SSLHandshakeException: PKIX path building Failed: sun.security.provider.certpath.SunCertPathBuilderException: 无法找到请求目标的有效认证路径。

TestServerMain

public class TestServer
{

    public static void main(String[] args)
    {
        String STORETYPE = "JKS";
        String KEYSTORE = new File("C:\\users\\user\\Desktop\\fb1dasslkeystore.jks").getAbsolutePath();
        String STOREPASSWORD = "test11";
        String KEYPASSWORD = "test11";
        // Now start the websocket server

        KeyStore ks;
        try
        {
            jWsServer ws = new jWsServer(new InetSocketAddress("127.0.0.1",8888));

            ks = KeyStore.getInstance(STORETYPE);

            File kf = new File(KEYSTORE);
            ks.load(new FileInputStream(kf),STOREPASSWORD.tochararray());

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

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

            ws.setWebSocketFactory(new DefaultSSLWebSocketServerFactory(sslContext));

            ws.start();
        }
        catch (Exception e)
        {
            // Todo Auto-generated catch block
            e.printstacktrace();
        }

        System.out.println(String.format("Websocket server started on port = %d",8888));
    }

}

服务器类

public class jWsServer extends WebSocketServer
{
    static Logger errorLog = LogManager.getLogger(jWsServer.class.getName());

    /**
     * Constructor,where caller specifies non-default port number
     * 
     * @param port socket port number
     * @throws UnkNownHostException
     */
    public jWsServer(int port) throws UnkNownHostException
    {
        super(new InetSocketAddress(port));
    }

    /**
     * Constructor,where caller specifies non-default socket address
     * 
     * @param address socket address
     */
    public jWsServer(InetSocketAddress address)
    {
        super(address);
    }

    /**
     * Event that fires when a client sends a message
     * 
     * @param conn client WebSocket object handle
     * @param message message string,should be JSON string for a request
     */
    @Override
    public void onMessage(WebSocket conn,String message)
    {
        try
        {
            System.out.println("Message Recieved : " + message);
        }
        catch (Exception ex)
        {
            System.out.println("ERROR: Can't add request to session " + conn);
        }
    }

    /**
     * Event that fires when a connection error occurs
     * 
     * @param conn client WebSocket object handle
     * @param ex exception that occurred
     */
    @Override
    public void onError(WebSocket conn,Exception ex)
    {
        if (conn != null)
        {
            System.out.println("ERROR: " + conn + " onError()" + ex.getMessage());
        }
    }

    @Override
    public void onClose(WebSocket conn,int code,String reason,boolean remote)
    {
        System.out.println("disconnecting client connId=" + conn.hashCode() + " Reason=" + code);
    }

    @Override
    public void onopen(WebSocket conn,ClientHandshake handshake)
    {
        try
        {
            System.out.println("Connecting client connId=" + conn.hashCode());
        }
        catch (Exception ex)
        {
            System.out.println("ERROR: Can't create session or add it to queue");
        }
        errorLog.info("Websocket open.");
    }

    @Override
    public void onStart()
    {
        // Todo Auto-generated method stub
        System.out.println(this.getAddress().getHostString());

    }
}

客户端主

public class Test
{

    public static void main(String[] args)
    {

        String location;

        location = "wss://127.0.0.1:8888";
        System.out.println("Using location: \'" + location + "\'");
        try
        {
            new MyClient(location);
        }
        catch (Exception e)
        {
            // Todo Auto-generated catch block
            e.printstacktrace();
        }
    }

}

客户端类

public class MyClient
{
    private WebSocketClient cc;

    public MyClient(String location)
    {
        try
        {

            cc = new WebSocketClient(new URI(location))
            {

                @Override
                public void onMessage(String message)
                {
                    System.out.println("got: " + message + "\n");
                }

                @Override
                public void onopen(ServerHandshake handshake)
                {
                    System.out.println("You are connected to ChatServer: " + getURI() + "\n");
                }

                @Override
                public void onClose(int code,boolean remote)
                {
                    System.out.println(
                            "You have been disconnected from: " + getURI() + "; Code: " + code + " " + reason
                                    + "\n");
                }

                @Override
                public void onError(Exception ex)
                {
                    System.out.println("Exception occurred ...\n" + ex + "\n");
                    ex.printstacktrace();
                }
            };
            cc.connect();
        }
        catch (Exception e)
        {
            e.printstacktrace();
        }
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)