如何解决使用 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 举报,一经查实,本站将立刻删除。