2010-11-10 30 views
6

Tôi muốn truy cập theo chương trình trang web yêu cầu chứng chỉ ứng dụng khách, mà tôi có trong tệp PEM. Trong ứng dụng này tôi không muốn thêm chúng vào kho khóa của tôi, sử dụng keytool, hoặc openssl nếu tôi có thể tránh làm như vậy. Tôi cần phải đối phó với họ trực tiếp trong mã.Tệp chứng chỉ Apache HttpClient và 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(); 

Tôi sẽ gửi chứng chỉ theo yêu cầu bằng cách nào?

+0

Hoặc là có một tập tin định dạng (ngoài PEM) mà có thể làm này dễ dàng hơn để thực hiện? –

Trả lời

6

dễ nhất cũng có thể sử dụng định dạng đuôi .p12 (mặc dù những người khác làm việc tốt quá - chỉ cần cẩn thận với dòng thêm bên ngoài các khối base64) và thêm một cái gì đó như:

// 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"); 

Hoặc cách khác - sử dụng những thứ chẳng hạn như

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

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

để tạo thay thế trên bay. Và thay vì dựa vào thuộc tính hệ thống - hãy sử dụng somethng như:

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

giữ riêng biệt với kho khóa.

DW.

+1

KeyManagerFactory là cách tôi cần. Tôi thực sự muốn sử dụng một tệp PEM (vì đó là những gì tôi có). Tôi đã không nhận ra nó sẽ rất lộn xộn để thử và chuyển đổi nó sang một định dạng khác trên bay. Tôi đã kết thúc chuyển đổi nó sang định dạng DER bằng cách sử dụng openssl. –

-1

Bạn có thể tạo một KeyStore từ .pem các tập tin như vậy:

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

Mã này không hoạt động đối với tôi vì: (1) tệp pem có '----- BEGIN CHỨNG NHẬN -----' và '----- END CHỨNG NHẬN ----- 'cần được loại bỏ trước khi 'generateCertificates()' có thể được thực hiện; (2) nó không tính đến khóa riêng được nhúng trong tệp '.pem'. Giải pháp đúng có sẵn tại đây: http://stackoverflow.com/questions/12501117/programmatically-obtain-keystore-from-pem –

Các vấn đề liên quan