我正在尝试使SSL连接到服务器。我创建了一个Truststore并将服务器的证书以及我的信任条目导入到Keystore中。服务器人员也将我的证书导入到他们的密钥库中。但是,当我尝试连接,我得到这个错误:收到致命警报,bad_certificate
Received fatal alert: bad_certificate
在服务器上,他们获得这个错误:
javax.net.ssl.SSLHandshakeException: null cert chain
我应该怎么做来可能是做错了什么?我该如何解决这个错误?我现在一直在和这个问题长期斗争。
我的客户端代码
import java.io.*;
import java.net.*;
import java.security.*;
import java.util.Enumeration;
import javax.net.ssl.*;
public class SSLConnect {
public String MakeSSlCall(String meternum) {
String message = "";
FileWriter file = null;
try {
file = new FileWriter("C:\\SSLCERT\\ClientJavalog.txt");
} catch (Exception ee) {
message = ee.getMessage();
}
//writer = new BufferedWriter(file);
try {
file.write("KeyStore Generated\r\n");
KeyStore keystore = KeyStore.getInstance("JKS");
keystore.load(new FileInputStream("C:\\SSLCERT\\newclientkeystore"), "client".toCharArray());
file.write("KeyStore Generated\r\n");
Enumeration enumeration = keystore.aliases();
while (enumeration.hasMoreElements()) {
String alias = (String) enumeration.nextElement();
file.write("alias name: " + alias + "\r\n");
keystore.getCertificate(alias);
file.write(keystore.getCertificate(alias).toString() + "\r\n");
}
TrustManagerFactory tmf =TrustManagerFactory.getInstance("SunX509");
tmf.init(keystore);
file.write("KeyStore Stored\r\n");
SSLContext context = SSLContext.getInstance("SSL");
TrustManager[] trustManagers = tmf.getTrustManagers();
context.init(null, trustManagers, null);
SSLSocketFactory f = context.getSocketFactory();
file.write("About to Connect to Ontech\r\n");
SSLSocket c = (SSLSocket) f.createSocket("192.168.1.16", 4447);
file.write("Connection Established to 196.14.30.33 Port: 8462\r\n");
file.write("About to Start Handshake\r\n");
c.startHandshake();
file.write("Handshake Established\r\n");
file.flush();
file.close();
return "Connection Established";
} catch (Exception e) {
try {
file.write("An Error Occured\r\n");
file.write(e.getMessage() + "\r\n");
file.flush();
file.close();
} catch (Exception eee) {
message = eee.getMessage();
}
return "Connection Failed";
}
}
}
使用Keytool创建我的信任
的keytool -import -alias -file客户-keystore client.cer -storepass MyKeystore的MyStore
的keytool -import -alias命令服务器文件server.cer -keystore MyKeystore -storepass mystore
而且我还将两个证书添加到我的cacerts密钥库
您应该在此处编写用于连接的代码,用于创建信任库和导入证书。顺便说一句,你确定你已经导入了你需要的服务器证书吗? – Gangnus
@Gangnus我已经添加了我的代码和我的keytool命令来存储我的证书。有什么我在这里做错了吗? –
我被邀请来判断你的问题可能结束。要小心,大多数没有代码的问题被认为是无用的。在你的情况下,它确实如此。我很高兴我的投票结果被你的快速版支持。我还建议标记代码失败的地方。套接字创建或握手?另外,你应该在这里放置你从异常中获得的堆栈跟踪。也许,在失败之前和之后,套接字'c'的内容。至于你的风格,我会建议使用记录器,而不是那个'文件',只是为了将来。而'c'这个名字也不太明显。 – Gangnus