Вы можете использовать cron4j. http://www.sauronsoftware.it/projects/cron4j/manual.php
Для любого встречающегося с аналогичной ситуацией я смог решить проблему выше следующим образом:
Повторно создают Ваш 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
Импорт сертификат CA с сервера в TrustStore (или Ваше собственное, или Java keystore в $JAVA_HOME/jre/lib/security/cacerts
, пароль: changeit
).
Набор следующие системные свойства:
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");
Тест Ваш URL.
Courtesy@ http://forums.sun.com/thread.jspa?threadID=5296333
Кажется, что Вы извлекаете Вас сертификат из базы ключей № 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
свойство в файл, который не существует; если бы файл не может быть открыт, пустая созданная база ключей, который привел бы к этой ошибке.
Это пример использования ТОЛЬКО файла 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);
Я понимаю, что эта статья может быть устаревшей, но все же я хотел бы попросить 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 );
}
}
В этом примере показано, как вы можете установить 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();