0
我正在嘗試通過java建立到mail.google.com的單向SSL連接。我認爲mail.google.com與gmail相同,所以我使用here提供的說明爲gmail.com創建了一個證書。如何建立到mail.google.com的單向SSL連接?
我創建的證書如下 -
$ openssl s_client -connect smtp.gmail.com:465
然後我複製了
-----BEGIN CERTIFICATE-----
...
...
-----END CERTIFICATE-----
部分到一個名爲 「gmail.cert」 文件。
在那之後,我使用下面的命令創建了自己的密鑰庫,設置密碼,「密碼」 -
$ 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
我在做什麼錯?
你有沒有需要設置SSL java.protocol.handler.pkgs了十幾年。不要推出自己的協議實現。使用JavaMail或至少HttpURLConnection。 – EJP