如何在java中使用本地HTTPS URL?

Rod*_*own 9 java https certificate

使用Java URL类,我可以连接到外部HTTPS服务器(例如我们的生产站点),但是使用本地URL我得到以下异常.

"SunCertPathBuilderException: unable to find valid certification path to requested target".
Run Code Online (Sandbox Code Playgroud)

如何获得有效的认证路径?

编辑:我没有使用此URL直接创建连接,我将URL传递给一个itext PDFReader,然后有一个连接问题.

Cor*_*uff 13

这是我的解决方案,它包含了这个主题中的一些想法,并与来自网络的代码一起调整.所有我都调用此函数,它为HttpsURLConnection设置默认的Trust Manager和HostName Verifier.这对某些人来说可能是不受欢迎的,因为它会影响所有HttpsURLConnections,但我只是编写一个简单的代理,因此它对我有用.

private void setTrustAllCerts() throws Exception
{
    TrustManager[] trustAllCerts = new TrustManager[]{
        new X509TrustManager() {
            public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                return null;
            }
            public void checkClientTrusted( java.security.cert.X509Certificate[] certs, String authType ) { }
            public void checkServerTrusted( java.security.cert.X509Certificate[] certs, String authType ) { }
        }
    };

    // Install the all-trusting trust manager
    try {
        SSLContext sc = SSLContext.getInstance( "SSL" );
        sc.init( null, trustAllCerts, new java.security.SecureRandom() );
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HttpsURLConnection.setDefaultHostnameVerifier( 
            new HostnameVerifier() {
                public boolean verify(String urlHostName, SSLSession session) {
                    return true;
                }
            });
    }
    catch ( Exception e ) {
        //We can not recover from this exception.
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)


Cha*_*tin 0

它抱怨的问题是,当您创建 SSL 连接时,服务器必须向客户端提供有效的证书。您可以用 Java 编写适当的端点(我认为 HTTPServerSocket 可以做到),但需要一些技巧来设置它。使用任何正确处理 SSL 的东西(Apache、lighttp 等)设置本地 Web 服务器可能更容易,并使用 openssl 工具创建自签名证书。

更新

这是 Java 年鉴中的一个示例。http://www.exampledepot.com/egs/javax.net.ssl/Server.html

SSL 服务器套接字需要将证书发送给客户端进行身份验证。证书必须包含在密钥库中,其位置必须明确指定(没有默认值)。下面的示例描述了如何创建和指定要使用的 SSL 服务器套接字的密钥库。

try {
    int port = 443;
    ServerSocketFactory ssocketFactory = SSLServerSocketFactory.getDefault();
    ServerSocket ssocket = ssocketFactory.createServerSocket(port);

    // Listen for connections
    Socket socket = ssocket.accept();

    // Create streams to securely send and receive data to the client
    InputStream in = socket.getInputStream();
    OutputStream out = socket.getOutputStream();

    // Read from in and write to out...

    // Close the socket
    in.close();
    out.close();
} catch(IOException e) {
}
Run Code Online (Sandbox Code Playgroud)

使用 javax.net.ssl.keyStore 系统属性指定证书的密钥库:

> java -Djavax.net.ssl.keyStore=mySrvKeystore -Djavax.net.ssl.keyStorePassword=123456 MyServer
Run Code Online (Sandbox Code Playgroud)