All the time I got exceptions when I met ssl or https in java.
To ignore those exceptions you need to prepare keystore and init TrustManager.
Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
- Prepare an empty keystore for JSSE.
- By default, a cert file in jre; %JRE_HOE%\lib\security\cacerts exists. You can use it or create our own keystore. *
1
2%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA
copy %USER_HOME%\.keystore d:\trustKeyStore.jks
-Djavax.net.ssl.trustStore=path/to/trustKeyStore.jks
or
System.setProperty(“javax.net.ssl.trustStore”, “trustKeyStore.jks”);
//System.setProperty(“javax.net.ssl.trustStorePassword”,password);
- Just invoke initTrustManager in the begging of your system.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40static class MyTrustManager implements javax.net.ssl.X509TrustManager, javax.net.ssl.TrustManager {
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public boolean isServerTrusted(java.security.cert.X509Certificate[] certs) {
return true;
}
public boolean isClientTrusted(java.security.cert.X509Certificate[] certs) {
return true;
}
@Override
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException {
return;
}
@Override
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) throws java.security.cert.CertificateException {
return;
}
}
static private TrustManager[] getTrustManager() {
javax.net.ssl.TrustManager[] trustAllCerts = { new MyTrustManager() };
return trustAllCerts;
}
static public void initTrustManager() throws NoSuchAlgorithmException, KeyManagementException{
Protocol.registerProtocol("https", new Protocol("https", new MySSLSocketFactory(), 443));
// Install the all-trusting trust manager
final SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, getTrustManager(), new java.security.SecureRandom());
// Create an ssl socket factory with our all-trusting manager
final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
HttpsURLConnection.setDefaultSSLSocketFactory(sslSocketFactory);
}
reference: http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#X509TrustManager
reference: http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html