Tengo un archivo pkcs12. Necesito usar para conectarse a una página web utilizando el protocolo https. Me encontré con algunos, donde el código para conectarse a una página web segura que tengo que establezca las siguientes propiedades del sistema:

System.setProperty("javax.net.ssl.trustStore", "myTrustStore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
System.setProperty("javax.net.ssl.keyStore", "new_cert.p12");
System.setProperty("javax.net.ssl.keyStorePassword", "newpass");

Tengo el p12(pkcs12) archivo. Todo lo que necesitas es un almacén de confianza de archivo.

He extraído los certificados de uso:

openssl.exe pkcs12 -in c:/mykey.p12 -out c:/cert.txt -nokeys -clcerts

Ahora convertido el cert PEM archivo der

openssl.exe x509 -in c:/cert.txt -outform DER -out c:/CAcert.der 

Agregando ahora el der archivo de almacén de claves

keytool -import -file C:/Cacert.der -keystore mytruststore

Ahora tengo el almacén de confianza, pero cuando lo uso, me sale el siguiente error

Exception in thread "main" java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)

Actualización:
Después de la eliminación de ciertas propiedades y configuración sólo el «almacén de confianza», «trustStorePassword» y «trustStoreType» de la propiedad, tengo la siguiente excepción

java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

Ayuda Por Favor.

  • Si usted puede publicar más de la traza de la pila (la información a partir de los marcos de pila, no sólo el mensaje de excepción) voy a echar un vistazo a él.
  • Otra cosa a comprobar es que su confianza en la ubicación de la tienda está correctamente especificado; si javax.net.ssl.almacén de confianza especificado pero que no existe, un vacío de almacén de confianza se crea sobre la marcha. Su nuevo mensaje de error hace sonar como esto podría estar sucediendo.
InformationsquelleAutor user27221 | 2009-02-11

8 Comentarios

  1. 21

    Para cualquier persona que se enfrenta una situación similar es la que yo era capaz de resolver el problema anterior como sigue:

    1. Regenerar su archivo pkcs12 de la siguiente manera:

      openssl pkcs12 -in oldpkcs.p12 -out keys -passout pass:tmp
      openssl pkcs12 -in keys -export -out new.p12 -passin pass:tmp -passout pass:newpasswd
    2. Importar el certificado de la CA de servidor en un almacén de confianza ( ya sea la suya o la de java keystore en $JAVA_HOME/jre/lib/security/cacerts, contraseña: changeit).

    3. Establezca las siguientes propiedades del sistema:

      System.setProperty("javax.net.ssl.trustStore", "myTrustStore");
      System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
      System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
      System.setProperty("javax.net.ssl.keyStore", "new.p12");
      System.setProperty("javax.net.ssl.keyStorePassword", "newpasswd");
    4. Prueba ur url.

    Cortesía [email protected] http://forums.sun.com/thread.jspa?threadID=5296333

    • Escribir una respuesta a su propia pregunta y la aceptación de que es un poco cuestionable, si usted me pregunta. Un poco como upvoting a ti mismo (que por supuesto no es posible)
    • parece perfectamente razonable para mí. Creo que probablemente hay algo en el FAQ, aunque.
  2. 5

    No puedo comentar porque de la 50pts umbral, pero no creo que la respuesta que se proporciona en https://stackoverflow.com/a/537344/1341220 es correcta.
    Lo que en realidad está describiendo es la forma de insertar certificados de servidor en los sistemas de almacén de confianza predeterminado:

    $JAVA_HOME/jre/lib/security/cacerts, password: changeit)

    Esto funciona, de hecho, pero esto significa que usted realmente no especificar un almacén de confianza de local para su proyecto, pero en vez aceptado el certificado universially en su sistema.

    Que en realidad nunca use su propio almacén de confianza que se define aquí:

    System.setProperty("javax.net.ssl.trustStore", "myTrustStore");
    System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
    • Yo tiene su punto. Pero, me pregunto, ¿la declaración System.setProperty cambiar el valor predeterminado de almacén de confianza o no ? Su mencionó en su respuesta, de que no es posible utilizar el almacén de confianza de definir en el código ya que él/ella ya está utilizando el valor predeterminado de uno. Es eso realmente cierto ? Entonces, ¿cuál es el punto de System.setProperty si el defecto de la tienda no se puede cambiar ?
  3. 4

    Parece que se están extrayendo usted certificado de las claves PKCS #12 de la tienda y la creación de un nuevo Java almacén de claves (con el tipo «JKS»). Usted no estrictamente necesario proporcionar un almacén de confianza de la contraseña (aunque su uso le permite poner a prueba la integridad de sus certificados raíz).

    Es así, pruebe su programa con sólo la siguiente SSL propiedades de conjunto. La lista que se muestra en tu pregunta es sobre-especificado y puede causar problemas.

    System.setProperty("javax.net.ssl.trustStore", "myTrustStore");
    System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

    También, usando el archivo PKCS #12 directamente como el almacén de confianza debería funcionar, siempre y cuando el certificado de CA es detectado como «de confianza» de la entrada. Pero en ese caso, tendrás que especificar el javax.net.ssl.trustStoreType propiedad como "PKCS12" demasiado.

    Tratar con estas propiedades sólo. Si aparece el mismo error, sospecho que tu problema no es el almacén de claves. Si aún así se produce, después de más de la traza de la pila en su pregunta a limitar el problema.


    El nuevo error, «el trustAnchors parámetro no puede ser vacío,» podría ser debido a la configuración de la javax.net.ssl.trustStore propiedad a un archivo que no existe; si el archivo no se puede abrir, un vacío de almacén de claves creado, lo que daría lugar a este error.

    • I establecer las propiedades especificadas, ahora me sale el siguiente excepción: «InvalidAlogrithmException: el trustAnchors parámetro no puede ser vacío»
    • Sólo quiero dar las gracias a esta respuesta, porque yo no sabía que «mediante el archivo PKCS #12 directamente como el almacén de confianza debe trabajar» y que esta resuelto mi propio tema
  4. 4

    Este es un ejemplo de uso de SÓLO archivo p12 no optimazed pero funciona.
    El archivo pkcs12 donde generado por OpenSSL por mí.
    Ejemplo de cómo cargar archivo p12 y construir la Confianza de la zona de es…
    Se emite los certificados de archivo p12 y agregar una buena certificados al almacén de confianza

    KeyStore ks=KeyStore.getInstance("pkcs12");
    ks.load(new FileInputStream("client_t_c1.p12"),"c1".toCharArray());
    
    KeyStore jks=KeyStore.getInstance("JKS");
    jks.load(null);
    
    for (Enumeration<String>t=ks.aliases();t.hasMoreElements();)
    {
        String alias = t.nextElement();
        System.out.println("@:" + alias);
        if (ks.isKeyEntry(alias)){
            Certificate[] a = ks.getCertificateChain(alias);
            for (int i=0;i<a.length;i++)
            {
                X509Certificate x509 = (X509Certificate)a[i];
                System.out.println(x509.getSubjectDN().toString());
                if (i>0)
                    jks.setCertificateEntry(x509.getSubjectDN().toString(), x509);
                System.out.println(ks.getCertificateAlias(x509));
                System.out.println("ok");
            }
        }
    }
    
    System.out.println("init Stores...");
    
    KeyManagerFactory kmf=KeyManagerFactory.getInstance("SunX509");
    kmf.init(ks, "c1".toCharArray());
    
    TrustManagerFactory tmf=TrustManagerFactory.getInstance("SunX509");
    tmf.init(jks);
    
    SSLContext ctx = SSLContext.getInstance("TLS");
    ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
  5. 1

    Este ejemplo se muestra cómo se puede layer (SSL) en la parte superior de un zócalo existente, obteniendo el cliente cert de un archivo PKCS#12. Es conveniente cuando usted necesita para conectarse a un servidor ascendente a través de un proxy, y quiere manejar el protocolo completo por sí mismo.

    Esencialmente, sin embargo, una vez que el SSL Contexto, se puede aplicar a un HttpsURLConnection, etc, etc.

    KeyStore ks = KeyStore.getInstance("PKCS12");
    InputStream is = ...;
    char[] ksp = storePassword.toCharArray();
    ks.load(is, ksp);
    KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
    char[] kp = keyPassword.toCharArray();
    kmf.init(ks, kp);
    sslContext = SSLContext.getInstance("SSLv3");
    sslContext.init(kmf.getKeyManagers(), null, null);
    SSLSocketFactory factory = sslContext.getSocketFactory();
    SSLSocket sslsocket = (SSLSocket) factory.createSocket(socket, socket
        .getInetAddress().getHostName(), socket.getPort(), true);
    sslsocket.setUseClientMode(true);
    sslsocket.setSoTimeout(soTimeout);
    sslsocket.startHandshake();
  6. 1
    URL url = new URL("https://test.domain:443");   
    String  keyStore = "server.p12"
    String   keyStorePassword = "changeit";    
    String  keyPassword = "changeit";    
    String   KeyStoreType= "PKCS12";    
    String   KeyManagerAlgorithm = "SunX509";    
    String   SSLVersion = "SSLv3";    
    public HttpURLConnection getHttpsURLConnection(URL url, String  keystore,
        String   keyStorePass,String  keyPassword, String  KeyStoreType
        ,String KeyManagerAlgorithm, String  SSLVersion)
        throws NoSuchAlgorithmException, KeyStoreException,
            CertificateException, FileNotFoundException, IOException,
            UnrecoverableKeyException, KeyManagementException {
        System.setProperty("javax.net.debug","ssl,handshake,record");
    
        SSLContext sslcontext = SSLContext.getInstance(SSLVersion);
        KeyManagerFactory kmf =  KeyManagerFactory.getInstance(KeyManagerAlgorithm);
        KeyStore ks = KeyStore.getInstance(KeyStoreType);
        ks.load(new FileInputStream(keystore), keyStorePass.toCharArray());
        kmf.init(ks, keyPassword.toCharArray());
    
         TrustManagerFactory tmf = TrustManagerFactory
                .getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(ks);
        TrustManager[] tm = tmf.getTrustManagers();
    
        sslcontext.init(kmf.getKeyManagers(), tm, null);
        SSLSocketFactory sslSocketFactory = sslcontext.getSocketFactory();
        HttpsURLConnection.setDefaultSSLSocketFactory(sslSocketFactory);
        HttpsURLConnection httpsURLConnection = ( HttpsURLConnection)uRL.openConnection();
    
        return httpsURLConnection;
    }
  7. 1

    Los siguientes pasos le ayudarán a resolver su problema.

    Pasos:
    developer_identity.cer <= descargar desde Apple
    mykey.p12 <= la clave privada

    Comandos a seguir:

        openssl x509 -in developer_identity.cer -inform DER -out developer_identity.pem -outform PEM
    
        openssl pkcs12 -nocerts -in mykey.p12 -out mykey.pem
    
        openssl pkcs12 -export -inkey mykey.pem -in developer_identity.pem -out iphone_dev.p12

    Final p12 que vamos a exigir es iphone_dev.archivo p12 y la frase de contraseña.

    utilizar este archivo como su p12 y vuelva a intentarlo. De hecho, esto es la solución.:)

  8. 0

    Me doy cuenta de que este artículo puede ser anticuado, pero todavía me gustaría preguntar smithsv para corregir su código fuente, contiene muchos errores, me las arreglé para corregir la mayoría de ellos, pero aún no sabes qué tipo de objeto x509 podría ser.Aquí está el código fuente, como creo que debería ser:

    import java.io.FileInputStream;
    import java.security.KeyStore;
    import java.security.cert.Certificate;
    import java.util.Enumeration;
    import javax.net.ssl.KeyManagerFactory;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.TrustManagerFactory;
    public class Connection2 {
    public void connect() {
    /*
    * This is an example to use ONLY p12 file it's not optimazed but it
    * work. The pkcs12 file where generated by OpenSSL by me. Example how
    * to load p12 file and build Trust zone from it... It outputs
    * certificates from p12 file and add good certs to TrustStore
    */
    KeyStore ks = KeyStore.getInstance( "pkcs12" );
    ks.load( new FileInputStream( cert.pfx ), "passwrd".toCharArray() );
    KeyStore jks = KeyStore.getInstance( "JKS" );
    jks.load( null );
    for( Enumeration t = ks.aliases(); t.hasMoreElements(); ) {
    String alias = (String )t.nextElement();
    System.out.println( "@:" + alias );
    if( ks.isKeyEntry( alias ) ) {
    Certificate[] a = ks.getCertificateChain( alias );
    for( int i = 0; i == 0; )
    jks.setCertificateEntry( x509Cert.getSubjectDN().toString(), x509 );
    System.out.println( ks.getCertificateAlias( x509 ) );
    System.out.println( "ok" );
    }
    }
    System.out.println( "init Stores..." );
    KeyManagerFactory kmf = KeyManagerFactory.getInstance( "SunX509" );
    kmf.init( ks, "c1".toCharArray() );
    TrustManagerFactory tmf = TrustManagerFactory.getInstance( "SunX509" );
    tmf.init( jks );
    SSLContext ctx = SSLContext.getInstance( "TLS" );
    ctx.init( kmf.getKeyManagers(), tmf.getTrustManagers(), null );
    }
    }

Dejar respuesta

Please enter your comment!
Please enter your name here