我正在尝试通过java建立到mail.google.com的单向SSL连接。我认为mail.google.com与gmail相同,所以我使用here提供的说明为gmail.com创建了证书。
我按照以下方式创建了证书 -
$ openssl s_client -connect smtp.gmail.com:465
然后我复制了
-----BEGIN CERTIFICATE-----
...
...
-----END CERTIFICATE-----
一节名为“gmail.cert”的文件。
之后,我使用以下命令创建了自己的密钥库,将密码设置为“password” -
$ keytool -import -alias smtp.gmail.com -keystore simpleKS.jks -file gmail.cert
我使用this链接提供的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
我做错了什么?
答案 0 :(得分:1)
猜测这是因为每个使用的协议see的证书都有所不同。因此,您可能必须使用openssl进行arround转换以将证书转换为另一个协议。
您的错误消息表明相同,它找不到mail.google.com的证书,因为您只为smtp.gmail.com提供了一个证书。
(免责声明我不是ssl guru,只是想指出一个有希望的正确方向)