我已经实现了一个HTTPS服务器,它将一个简单的index.html文件发送到浏览器。我已经使用Eclipse作为我的IDE,并且我还有一个.jks
文件以及该程序。有趣的是,当我在Eclipse上运行程序时,一切都很好。在浏览器上我请求https://localhost:8888
(我定义的端口),它会警告我的证书,我确认,并检索页面。但是当我通过终端(java HTTPSserver
)运行程序时,服务器显示以下异常。我搜索了它并发现了类似的帖子,但是无法找到解决问题的具体步骤。有人可以帮我解决这个问题吗?
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]
}