2014-01-27 16 views
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 

我在做什麼錯?

+0

你有沒有需要設置SSL java.protocol.handler.pkgs了十幾年。不要推出自己的協議實現。使用JavaMail或至少HttpURLConnection。 – EJP

回答

1

猜測這是因爲每個使用的協議的證書有所不同see。所以你可能不得不和openssl一起玩轉換證書以用於其他協議。

您的錯誤消息表示相同,它沒有找到mail.google.com的證書,因爲您只爲smtp.gmail.com提供了證書。

(聲明我不是SSL大師,只是想在一個有希望正確的方向指向)