2010-11-10 196 views
6

我想以編程方式訪問需要客戶端證書的站點,我在PEM文件中有這些證書。在這個應用程序中,如果我可以避免這樣做,我不想將它們添加到我的密鑰庫中,請使用keytool或openssl。我需要用代碼直接處理它們。Apache HttpClient和PEM證書文件

HttpClient httpclient = new DefaultHttpClient(); 
    HttpGet httpget = new HttpGet("https://my.secure.site.com/url"); 

    // TODO: Specify ca.pem and client.pem here? 

    HttpResponse response = httpclient.execute(httpget); 
    HttpEntity entity = response.getEntity(); 

    if (entity != null) { 
     entity.consumeContent(); 
    } 

    httpclient.getConnectionManager().shutdown(); 

我怎麼會「發送」與請求證書?

+0

或者是有其他格式的文件(除了PEM),這將使這更容易實現? – 2010-11-10 18:26:10

回答

6

最簡單的可能是使用的.p12格式(雖然其他工作也沒關係 - 只要小心使用的base64塊外多餘的線條),並加入類似:

// systems I trust 
System.setProperty("javax.net.ssl.trustStore", "foo"); 
System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); 

// my credentials 
System.setProperty("javax.net.ssl.keyStoreType", "PKCS12"); 
System.setProperty("javax.net.ssl.keyStore", "cert.p12"); 
System.setProperty("javax.net.ssl.keyStorePassword", "changeit"); 

或替代地 - 用的東西像

KeyStore ks = KeyStore.getInstance("pkcs12"); 
    ks.load(new FileInputStream(....), "mypassword".toCharArray()); 

    KeyStore jks = KeyStore.getInstance("JKS"); 
    ks.load(... 

改爲在飛上面創建。而非依賴於系統屬性 - 使用somethng,如:

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); 
    kmf.init(aboveKeyStore, "changeme".toCharArray()); 
    sslContext = SSLContext.getInstance("SSLv3"); 
    sslContext.init(kmf.getKeyManagers(), null, null); 

這使從密鑰庫分開。

DW。

+1

KeyManagerFactory是我需要的方式。我真的想用一個PEM文件(因爲這是我的)。我沒有意識到嘗試將它轉換爲不同的格式會變得非常混亂。我最終使用openssl將其轉換爲DER格式。 – 2010-12-02 21:37:36

-1

您可以創建一個KeyStore.pem文件,像這樣:

private KeyStore getTrustStore(final InputStream pathToPemFile) throws IOException, KeyStoreException, 
     NoSuchAlgorithmException, CertificateException { 
    final KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); 
    ks.load(null); 

    // load all certs 
    for (Certificate cert : CertificateFactory.getInstance("X509") 
      .generateCertificates(pathToPemFile)) { 
     final X509Certificate crt = (X509Certificate) cert; 

     try { 
      final String alias = crt.getSubjectX500Principal().getName(); 
      ks.setCertificateEntry(alias, crt); 
      LOG.info("Added alias " + alias + " to TrustStore"); 
     } catch (KeyStoreException exp) { 
      LOG.error(exp.getMessage()); 
     } 
    } 

    return ks; 
} 
+0

此代碼對我來說不起作用,因爲:(1)pem文件具有需要刪除的「----- BEGIN CERTIFICATE -----」和「----- END CERTIFICATE -----」在'generateCertificates()'之前完成; (2)它沒有考慮嵌入在'.pem'文件中的私鑰。正確的解決方案可在這裏:http://stackoverflow.com/questions/12501117/programmatically-obtain-keystore-from-pem – 2016-07-23 18:15:52