如何使用自签名证书从Javascript连接到SSL服务器?

时间:2016-01-26 20:16:19

标签: java ssl websocket

我创建了一个我想要做的简单示例。

我有这样的服务器代码:

package com.company;

import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocket;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class EchoServer {
    public
    static
    void
    main(String[] arstring) {
        try {

            SSLServerSocketFactory sslserversocketfactory =
                    (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
            SSLServerSocket sslserversocket =
                    (SSLServerSocket) sslserversocketfactory.createServerSocket(9999);
            SSLSocket sslsocket = (SSLSocket) sslserversocket.accept();

            InputStream inputstream = sslsocket.getInputStream();
            InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
            BufferedReader bufferedreader = new BufferedReader(inputstreamreader);

            String string = null;
            while ((string = bufferedreader.readLine()) != null) {
                System.out.println(string);
                System.out.flush();
            }
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
}

客户端代码如下:

<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta charset="utf-8">

    <script type="text/javascript">
        function onClick(){
            var wrc_socket = new WebSocket('wss://localhost:9999');
            wrc_socket.onmessage = function(event) {
                alert('message = '+event.data);
            };
            wrc_socket.onclose = function(event) {
                alert('Socket is close!');
            };
            wrc_socket.onopen = function(event) {
                alert('Socket is open!');
            };
            wrc_socket.send('Hi there!');
            alert('Done!');
        }
    </script>
</head>

<body>
    <a href="#" onclick="onClick()">Test!</a>
</body>
</html>

我创建了私钥和公钥对,并将其导入密钥库文件中,如here所述。

我使用参数运行服务器应用程序:

-Djavax.net.ssl.keyStore=mySrvKeystore -Djavax.net.ssl.keyStorePassword=123456 -Djavax.net.debug=all

当我单击Test按钮时,我在ssl debug中得到了这个错误:

main, WRITE: TLSv1.2 Change Cipher Spec, length = 1
[Raw write]: length = 6
0000: 14 03 03 00 01 01                                  ......
Disconnected from the target VM, address: '127.0.0.1:64118', transport: 'socket'

由于某种原因,握手期间连接正在关闭。我无法弄清楚原因,请建议解决方案或一些想法进行检查。

1 个答案:

答案 0 :(得分:0)

最后,我想出了原因是什么。在生成证书或密钥期间(有什么......)我把假设的服务器名称,但在wss连接期间,地址是ip - 因此,不匹配和握手失败。

结论:确保您的wss使用与ssl名称相同的URL。