Java 如何建立到mail.google.com的单向SSL连接?

Java 如何建立到mail.google.com的单向SSL连接?,java,ssl,Java,Ssl,我正在尝试通过java建立到mail.google.com的单向SSL连接。我想mail.google.com和gmail是一样的,所以我使用提供的说明为gmail.com创建了一个证书 我创建的证书如下所示- $ openssl s_client -connect smtp.gmail.com:465 然后我复制了 -----BEGIN CERTIFICATE----- ... ... -----END CERTIFICATE----- 一个名为“gmail.cert”的文件 之后,我使用

我正在尝试通过java建立到mail.google.com的单向SSL连接。我想mail.google.com和gmail是一样的,所以我使用提供的说明为gmail.com创建了一个证书

我创建的证书如下所示-

$ openssl s_client -connect smtp.gmail.com:465
然后我复制了

-----BEGIN CERTIFICATE-----
...
...
-----END CERTIFICATE-----
一个名为“gmail.cert”的文件

之后,我使用以下命令创建了自己的密钥库,将密码设置为“password”——

我使用了link中提供的Java代码,但做了一些小的修改:

    System.setProperty("javax.net.ssl.trustStore", "simpleKS.jks");
    System.setProperty("javax.net.ssl.trustStorePassword", "password");
    System.setProperty("java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol");

    //connect to google          
    SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
    SSLSocket sslSock = (SSLSocket) factory.createSocket("mail.google.com",443);

    System.out.println("Sending request...");         
    //send HTTP get request
    BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(sslSock.getOutputStream(), "UTF8"));           
    wr.write("GET /mail HTTP/1.1\r\nhost: mail.google.com\r\n\r\n");
    wr.flush();

    System.out.println("Reading response...");

    // read response
    BufferedReader rd = new BufferedReader(new InputStreamReader(sslSock.getInputStream()));          
    String string = null;

    while ((string = rd.readLine()) != null) {
        System.out.println(string);
        System.out.flush();
    }

    rd.close();
    wr.close();
    // Close connection.
    sslSock.close();    
类文件和密钥库(以及所有其他文件)位于同一目录中,因此我非常确定查找实际的密钥库文件不会有问题

然而,当我执行这段代码时,我得到

Sending request...
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

我做错了什么

我猜这是因为所使用的每个协议的证书都有所不同。因此,您可能必须使用openssl将证书转换为用于其他协议

您的错误消息声明相同,它找不到mail.google.com的证书,因为您只为smtp.gmail.com提供了一个证书


(免责声明我不是ssl专家,只是试图指出一个正确的方向)

十多年来,您不需要为ssl设置java.protocol.handler.pkgs。不要使用自己的协议实现。使用JavaMail,或者至少使用HttpURLConnection。
Sending request...
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target