我的简单HTTPS Java服务器引发异常:收到致命警报:错误的\u证书
我已经实现了一个HTTPS服务器,它向浏览器发送一个简单的index.html文件。我使用Eclipse作为我的IDE,我还有一个我的简单HTTPS Java服务器引发异常:收到致命警报:错误的\u证书,java,Java,我已经实现了一个HTTPS服务器,它向浏览器发送一个简单的index.html文件。我使用Eclipse作为我的IDE,我还有一个.jks文件和程序。有趣的是,当我在Eclipse上运行程序时,一切都很好。在浏览器上,我请求https://localhost:8888(我定义的端口),它警告我的证书,我确认,然后检索页面。但是当我通过终端(javahttpsserver)运行程序时,服务器显示以下异常。我搜索了它并注意到类似的帖子,但是无法找到解决问题的具体步骤。有人能帮我吗 javax.net
.jks
文件和程序。有趣的是,当我在Eclipse上运行程序时,一切都很好。在浏览器上,我请求https://localhost:8888
(我定义的端口),它警告我的证书,我确认,然后检索页面。但是当我通过终端(javahttpsserver
)运行程序时,服务器显示以下异常。我搜索了它并注意到类似的帖子,但是无法找到解决问题的具体步骤。有人能帮我吗
javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1959)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1077)
at sun.security.ssl.SSLSocketImpl.waitForClose(SSLSocketImpl.java:1705)
at sun.security.ssl.HandshakeOutStream.flush(HandshakeOutStream.java:122)
at sun.security.ssl.Handshaker.sendChangeCipherSpec(Handshaker.java:972)
at sun.security.ssl.ServerHandshaker.sendChangeCipherAndFinish(ServerHandshaker.java:1532)
at sun.security.ssl.ServerHandshaker.clientFinished(ServerHandshaker.java:1492)
at sun.security.ssl.ServerHandshaker.processMessage(ServerHandshaker.java:243)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:882)
....[more lines]
以下是服务器代码中负责关键内容的部分:
public static void main(String[] args) {
String ksName = "mykey.jks";
char ksPass[] = "mypass".toCharArray();
char ctPass[] = "mypass".toCharArray();
try {
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(ksName), ksPass);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, ctPass);
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(kmf.getKeyManagers(), null, null);
SSLServerSocketFactory ssf = sc.getServerSocketFactory();
SSLServerSocket s = (SSLServerSocket) ssf.createServerSocket(8888,0, null);
...[more lines]
}
不要硬核化keymanagerfactory字符串。它在IBMJVM上有一个不同的名称,这不应该是错误的原因,对吗?