2012-04-09 8 views
13

Estoy tratando de establecer una conexión https utilizando el archivo de certificado .cer del servidor. Puedo obtener el archivo de certificado manualmente usando un navegador y ponerlo en el almacén de claves usando la herramienta de claves. Luego puedo acceder al almacén de claves usando el código java, obtener el certificado que agregué al almacén de claves y conectarme al servidor.Agregar certificado al almacén de claves usando el código de java

Ahora, sin embargo, quiero implementar incluso el proceso de obtener el archivo de certificado y agregarlo a mi almacén de claves usando código java y sin usar keytool o el navegador para obtener el certificado.

¿Puede alguien decirme cómo abordar esto y lo que debo hacer?

+0

Qué propósito sirve esto? No puedo imaginar por qué querrías hacer esto. – erickson

+0

Estoy intentando verificar el contenido del formulario en mi servidor interno antes de enviar la solicitud del cliente al servidor de hp. Esto creo que evitaría cualquier alteración de pagos basada en el navegador y mi servidor podría hacer todos los controles esperados en lugar de hacer que el sitio web de hp lo haga. Para hacerlo, sin embargo, necesito obtener el certificado del servidor usando el código de Java para realizar el saludo. No quiero descargar manualmente el certificado cada vez y ponerlo en mi almacén de claves. Quiero que el código haga esa parte automáticamente. – Rohit

+0

No debería necesitar el certificado del servidor en su almacén de claves. Si el servidor está configurado correctamente, todo lo que necesita es la "raíz" de la cadena de certificados del servidor. – erickson

Respuesta

13

Editar: This parece hacer exactamente lo que quiere.

Utilizando el siguiente código, es posible agregar un almacén de confianza durante el tiempo de ejecución.

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); 
    } 
} 

Utilicé este código para establecer una conexión LDAP segura con un servidor de directorio activo.

This también podría ser útil, en la parte inferior hay una clase, que es capaz de importar un certificado durante el tiempo de ejecución.

+0

Gracias por su respuesta Sandro. Tengo una pregunta adicional por favor. ¿Cómo obtenemos el certificado de una URL particular? – Rohit

+2

buscando en Google "certificado de descarga de java desde el sitio web" Encontré [esto] (http://snippets.dzone.com/posts/show/4736). Parece hacer exactamente lo que quieres. – Sandro

+0

Gracias por el enlace Sandro ... Realmente ayudó. – Rohit

0

Escribí una pequeña biblioteca ssl-utils-android para hacerlo.

Puede simplemente cargar cualquier certificado dando el nombre de archivo desde el directorio de activos.

Uso:

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

simplemente seguimos

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; 
     } 
Cuestiones relacionadas