2014-02-27 48 views
0

我想通過https連接到我的後端。 我有2個certificats * .p12和* .cer。我用進口的命令(見代碼) 我進口與命令鍵:如何在grails中使用* .p12證書來建立https連接?

keytool -v -importkeystore -srckeystore bonus-testagent.p12 -srcstoretype PKCS12 -destkeystore truststore.jks -deststoretype JKS 

我的代碼是(Grails的服務):

private SSLSocketFactory getSSLFactory() throws Exception { 
    KeyStore keyStore = KeyStore.getInstance("JKS"); 
    String keystoreFile = 'D:\\grails_wide\\certificates\\truststore.jks' 
    File binaryFile = new File(keystoreFile); 
    InputStream is = binaryFile.newInputStream() 
    if (is == null) { 
     return null; 
    } 
    String password = "****"; 
    keyStore.load(is, password.toCharArray()); 
    is.close(); 


    TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
    tmf.init(keyStore); 

    SSLContext ctx = SSLContext.getInstance("TLS"); 
    ctx.init(null, tmf.getTrustManagers(), null); 
    return ctx.getSocketFactory(); 
} 

def accountInfo(String cardNumber, Cookie[] cookies) { 
    String urlStr = "https://app-domain.com"; 
    URL url = new URL(urlStr); 

    HttpsURLConnection conn = (HttpsURLConnection)url.openConnection(); 
    conn.setSSLSocketFactory(getSSLFactory()); 
    conn.setRequestMethod("GET"); 
    conn.setRequestProperty("Cookie", WebUtils.buildCookiesHeader(cookies)) 
    InputStream is = conn.getInputStream(); 
    BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
    String line; 
    StringBuffer stringBuffer = new StringBuffer(); 
    while ((line = rd.readLine()) != null) { 
     stringBuffer.append(line); 
    } 
    rd.close(); 
    def response = stringBuffer.toString(); 

但它的主要錯誤:

ERROR errors.GrailsExceptionResolver - SunCertPathBuilderException occurred when processing request: [POST] /club/account 
unable to find valid certification path to requested target. Stacktrace follows: 
Message: unable to find valid certification path to requested target 

在字符串:

InputStream is = conn.getInputStream(); 
+0

在''Grails'中使用'is'作爲變量名可能不是一個好主意...... – Bruno

回答

0

首先,您通常不需要將PKCS#12(.p12)文件轉換爲JKS存儲,您可以直接使用PKCS12密鑰庫類型。

其次,一個.p12文件通常不被用作信任庫,而是作爲一個keysore來代替。 (例如,請參閱this question以獲取密鑰庫和信任庫之間的區別)。.p12文件將包含不屬於信任庫的私有密鑰材料。

你在這裏做什麼與你.p12文件替換默認的信任,所以它只能驗證對證書的.p12文件時,它遠程連接(而不是驗證對CA證書)。因此,「無法找到要求的目標的有效證書路徑」失敗。

大概你試圖連接一個客戶端證書。在這種情況下,您需要使用該.p12文件作爲密鑰庫。如果您想直接加載您.p12,使用KeyStore.getInstance("PKCS12")代替

  1. (可選):要做到這一點。 (您不需要該keytool轉換。)
  2. 將它與KeyManagerFactory而不是TrustManagerFactory一起使用。初始密碼將是密鑰本身的密碼,與PKCS#12中的密鑰相同。使用ctx.init(kmf.getKeyManagers(), null, null)。第二個null參數將使用JRE的默認信任存儲(假設您的服務器以此方式受信任)。
相關問題