Как соединиться с безопасным веб-сайтом с помощью SSL в Java с pkcs12 файлом?

Вы можете использовать cron4j. http://www.sauronsoftware.it/projects/cron4j/manual.php

18
задан user27221 12 February 2009 в 06:49
поделиться

5 ответов

Для любого встречающегося с аналогичной ситуацией я смог решить проблему выше следующим образом:

  1. Повторно создают Ваш pkcs12 файл следующим образом:

    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. Импорт сертификат CA с сервера в TrustStore (или Ваше собственное, или Java keystore в $JAVA_HOME/jre/lib/security/cacerts, пароль: changeit).

  3. Набор следующие системные свойства:

    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. Тест Ваш URL.

Courtesy@ http://forums.sun.com/thread.jspa?threadID=5296333

21
ответ дан 30 November 2019 в 07:23
поделиться

Кажется, что Вы извлекаете Вас сертификат из базы ключей № 12 PKCS и создаете новую базу ключей Java (с типом "JKS"). Вы не должны строго обеспечивать пароль базы доверенных сертификатов (хотя с помощью, каждого позволяет Вам тестировать целостность своих корневых сертификатов).

Так, попробуйте свою программу только следующий набор свойств SSL. Список, показанный в Вашем вопросе, чрезмерно определен и может вызывать проблемы.

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

кроме того, с помощью файла № 12 PKCS непосредственно, поскольку база доверенных сертификатов должна работать, пока сертификат CA обнаруживается как "доверяемая" запись. Но в этом случае, необходимо будет указать javax.net.ssl.trustStoreType свойство как "PKCS12" также.

Попытка с этими свойствами только. Если Вы получаете ту же ошибку, я подозреваю, что Вашей проблемой не является база ключей. Если это все еще происходит, отправьте больше отслеживания стека в своем вопросе сузить проблему.

<час>

новая ошибка, "trustAnchors параметр должен быть непустым", могла произойти из-за установки javax.net.ssl.trustStore свойство в файл, который не существует; если бы файл не может быть открыт, пустая созданная база ключей, который привел бы к этой ошибке.

4
ответ дан 30 November 2019 в 07:23
поделиться

Это пример использования ТОЛЬКО файла p12, он не оптимизирован, но работает. Файл pkcs12 сгенерирован мной OpenSSL. Пример того, как загрузить файл p12 и построить из него зону доверия ... Он выводит сертификаты из файла p12 и добавляет хорошие сертификаты в TrustStore

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);
4
ответ дан 30 November 2019 в 07:23
поделиться

Я понимаю, что эта статья может быть устаревшей, но все же я хотел бы попросить smithsv исправить его исходный код, он содержит много ошибок, мне удалось исправить большинство из них, но я все еще не знаю что за объект может быть x509. Вот исходный код, каким я думаю, он должен быть:

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 );
    }
}
0
ответ дан 30 November 2019 в 07:23
поделиться

В этом примере показано, как вы можете установить SSL поверх существующего сокета, получив сертификат клиента из файла PKCS # 12. Это уместно, когда вам нужно подключиться к вышестоящему серверу через прокси, и вы хотите самостоятельно обрабатывать весь протокол.

По сути, однако, когда у вас есть контекст SSL, вы можете применить его к HttpsURLConnection и т. Д. и т. д.

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();
1
ответ дан 30 November 2019 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: