2012-04-09 6 views
13

Ich versuche, eine HTTPS-Verbindung mit dem Server CER-Zertifikatsdatei herzustellen. Ich bin in der Lage, die Zertifikatsdatei manuell über einen Browser zu erhalten und sie mit keytool in den Keystore zu legen. Ich kann dann mithilfe von Java-Code auf den Keystore zugreifen, das Zertifikat abrufen, das ich dem Keystore hinzugefügt habe, und eine Verbindung zum Server herstellen.Hinzufügen von Zertifikat zu Keystore mit Java-Code

Ich möchte jetzt auch den Prozess des Erhalts der Zertifikatsdatei und das Hinzufügen zu meinem Schlüsselspeicher mit Java-Code und ohne Verwendung von Keytool oder Browser, um ein Zertifikat zu erhalten.

Kann mir bitte jemand sagen, wie ich das angehen soll und was ich tun muss?

+0

Welchen Zweck dient das? Ich kann mir nicht vorstellen, warum du das machen willst. – erickson

+0

Ich versuche, den Formularinhalt auf meinem internen Server zu überprüfen, bevor ich die Anfrage des Clients an den Server von HP zurückschicke. Dies würde meiner Meinung nach dazu führen, dass browserbasierte Zahlungsmanipulationen verhindert werden, und mein Server könnte alle erwarteten Prüfungen durchführen, anstatt die Website von hp zu verwenden. Dafür muss ich jedoch das Serverzertifikat mit Java-Code abrufen, um den Handshake durchzuführen. Ich möchte das Zertifikat nicht jedes Mal manuell herunterladen und in meinen Keystore legen. Ich möchte, dass der Code diesen Teil automatisch ausführt. – Rohit

+0

Sie sollten das Serverzertifikat nicht in Ihrem Schlüsselspeicher benötigen. Wenn der Server korrekt konfiguriert ist, benötigen Sie lediglich den "Stamm" der Zertifikatskette des Servers. – erickson

Antwort

13

Edit: This scheint genau das zu tun, was Sie wollen.

Mit dem folgenden Code ist es möglich, während der Laufzeit einen Trust Store hinzuzufügen.

import java.io.InputStream; 
import java.security.KeyStore; 

import javax.net.ssl.SSLContext; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.TrustManagerFactory; 

public class SSLClasspathTrustStoreLoader { 
    public static void setTrustStore(String trustStore, String password) throws Exception { 
     TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("X509"); 
     KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     InputStream keystoreStream = SSLClasspathTrustStoreLoader.class.getResourceAsStream(trustStore); 
     keystore.load(keystoreStream, password.toCharArray()); 
     trustManagerFactory.init(keystore); 
     TrustManager[] trustManagers = trustManagerFactory.getTrustManagers(); 
     SSLContext sc = SSLContext.getInstance("SSL"); 
     sc.init(null, trustManagers, null); 
     SSLContext.setDefault(sc); 
    } 
} 

Ich habe diesen Code verwendet, um eine sichere LDAP-Verbindung mit einem Active Directory-Server herzustellen.

This könnte auch nützlich sein, an der Unterseite gibt es eine Klasse, die in der Lage ist, ein Zertifikat zur Laufzeit zu importieren.

+0

Danke für Ihre Antwort Sandro. Ich habe eine zusätzliche Frage bitte. Wie bekommen Sie das Zertifikat für eine bestimmte URL? – Rohit

+2

Googeln für "Java-Download-Zertifikat von der Website" Ich fand [dies] (http://snippets.dzone.com/posts/show/4736). Es scheint genau das zu tun, was du willst. – Sandro

+0

Danke für den Link Sandro ... Es hat wirklich geholfen. – Rohit

0

Ich schrieb kleine Bibliothek ssl-utils-android, um dies zu tun.

Sie können ein beliebiges Zertifikat einfach laden, indem Sie den Dateinamen aus dem Verzeichnis "Assets" angeben.

Verbrauch:

OkHttpClient client = new OkHttpClient(); 
SSLContext sslContext = SslUtils.getSslContextForCertificateFile(context, "BPClass2RootCA-sha2.cer"); 
client.setSslSocketFactory(sslContext.getSocketFactory()); 
0

gefolgt Gerade

https://docs.oracle.com/cd/E19509-01/820-3503/ggfgo/index.html https://www.sslshopper.com/article-most-common-java-keytool-keystore-commands.html

javac -cp .:/home/ec2-user/velu/*: QuickStart.java 
java -cp .:/home/ec2-user/velu/*: QuickStart 


[[email protected] velu]$ ls 
QuickStart.class commons-codec-1.2.jar  input-payload.txt   logback-core-1.1.3.jar 
QuickStart.java commons-httpclient-3.1.jar httpclient-4.5.jar jdk-8u101-linux-x64.rpm slf4j-api-1.7.12.jar 
certificates  commons-logging-1.2.jar  httpcore-4.4.1.jar logback-classic-1.1.3.jar 



import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 

import org.apache.commons.httpclient.HttpClient; 
import org.apache.commons.httpclient.HttpMethod; 
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; 
import org.apache.commons.httpclient.methods.PostMethod; 
import org.apache.commons.httpclient.methods.StringRequestEntity; 
import org.apache.commons.httpclient.params.HttpClientParams; 
import org.apache.http.impl.client.CloseableHttpClient; 
import org.apache.http.impl.client.HttpClients; 

public class QuickStart { 

     public static void main(String[] args) throws Exception { 
       System.setProperty("javax.net.ssl.keyStore", "/home/user/velu/certificates/myownOut.pkcs12"); 
       System.setProperty("javax.net.ssl.keyStorePassword", "password"); 

       System.setProperty("javax.net.ssl.trustStore", "/home/user/velu/certificates/myTrustStore"); 
       System.setProperty("javax.net.ssl.trustStorePassword", "password"); 

System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.SimpleLog"); 
System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true"); 
System.setProperty("org.apache.commons.logging.simplelog.log.httpclient.wire", "debug"); 
System.setProperty("org.apache.commons.logging.simplelog.log.org.apache.commons.httpclient", "debug"); 

       CloseableHttpClient httpclient = HttpClients.createDefault(); 

       HttpClientParams params = new HttpClientParams(); 
       params.setConnectionManagerClass(MultiThreadedHttpConnectionManager.class); 
       HttpClient client = new HttpClient(params); 

       HttpMethod m = new PostMethod("https://velu.org:443/Services/com/Echo"); 

       m.setRequestHeader("content-type", "application/xml"); 
       //m.setRequestHeader("Accept", "application/xml"); 
//    m.setRequestHeader("SOAPAction", "Echo"); 
       try { 

         ((PostMethod) m).setRequestEntity(new StringRequestEntity(getFileContent(), "application/xml", "UTF-8")); 
         System.out.println("VELU EXCUTING"); 
         client.executeMethod(m); 
         if (m.getStatusCode() == 200) { 
           System.out.println("VELU RECEIVED:" + m.getResponseBodyAsString()); 
         } 
       } catch (IOException e) { 
         System.out.println(e.toString()); 
       } finally { 
         m.releaseConnection(); 
       } 

     } 

     public static String getFileContent() { 

       BufferedReader br = null; 
       String fileContent = ""; 
       try { 

         br = new BufferedReader(new FileReader(
             "/home/user/velu/input-payload.txt")); // Note that this file format should be proper. 
         String sCurrentLine = ""; 
         while ((sCurrentLine = br.readLine()) != null) { 
           fileContent += sCurrentLine; 
         } 
         System.out.println(fileContent); 

       } catch (IOException e) { 
         e.printStackTrace(); 
       } finally { 
         try { 
           if (br != null) 
             br.close(); 
         } catch (IOException ex) { 
           ex.printStackTrace(); 
         } 
       } 
       return fileContent; 
     }