我已经在服务器和客户端之间建立了一个https连接,其中客户端是一个java程序,服务器是一个servlet。我使用以下代码从服务器打印证书详细信息。
URL url = new URL("https://localhost:8443/cert");
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setSSLSocketFactory(sslsocketfactory);
connection.setDoOutput(true);
if(connection!=null){
Certificate[] certs = connection.getServerCertificates();// #1
System.out.println("Cert Type : " + certs[0].getType());
System.out.println("Cert Hash Code : " + certs[0].hashCode());
System.out.println("Cert Public Key Algorithm : " + certs[0].getPublicKey().getAlgorithm());
System.out.println("Cert Public Key Format : " + certs[0].getPublicKey().getFormat());
System.out.println("\n");
}
但我收到以下异常。
java.lang.IllegalStateException: connection not yet open
我认为握手应该在调用 url.openconnection() 方法后立即进行。
这里有什么问题?
异常抛出行号“#1”(见上面代码中的注释)
最佳答案
您正在尝试连接到自签名证书主机。按照 this answer 中答案选项 2 的说明进行操作,这应该允许您连接。
我用 connection.connect()
替换了 connection.setDoOutput()
并且代码对我来说工作正常。
不要将此机制用于测试以外的任何用途 - 您应该使用有效签名的证书
关于java - 打印服务器证书详细信息时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9568100/