Java – keytool creates a trusted self signed certificate
I'm trying to create a self signed certificate using (Java) keytool, but when I try to use it, I get the following exception (see the entire exception at the bottom)
...<5 more exceptions above this> Caused by: sun.security.validator.ValidatorException: No trusted certificate found at sun.security.validator.SimpleValidator.buildTrustedChain(SimpleValidator.java:304) at sun.security.validator.SimpleValidator.engineValidate(SimpleValidator.java:107) at sun.security.validator.Validator.validate(Validator.java:203) at com.sun.net.ssl.internal.ssl.x509trustmanagerImpl.checkServerTrusted(x509trustmanagerImpl.java:172) at com.sun.net.ssl.internal.ssl.Jssex509trustmanager.checkServerTrusted(SSLContextImpl.java:320) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:841) ... 22 more
I know I can bypass this with this Code:
import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLSession; HostnameVerifier hv = new HostnameVerifier() { public boolean verify(String urlHostName,SSLSession session) { System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost()); return true; } }; HttpsURLConnection.setDefaultHostnameVerifier(hv);
(source)
But I'm not interested in this solution because I think it will create security vulnerabilities If I am wrong, please correct me
Who can point me in the right direction? I'm testing locally now, so it's easy to change I can access server code, client code and Keystore file
to update
I tried to use one for the client and server Keystore file, but to simplify my problem, I created server Keystore (see below) and client Truststore (see below) I have reason to believe that the certificate is correct, but I would appreciate it if someone could prove it
server. keystore
hostname[username:/this/is/a/path][711]% keytool -list -keystore server.keystore -v Enter keystore password: Keystore type: JKS Keystore provider: SUN Your keystore contains 1 entry Alias name: hostname Creation date: Feb 4,2010 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=hostname,OU=hostname,O=hostname,L=hostname,ST=hostname,C=hostname Issuer: CN=hostname,C=hostname Serial number: 4b6b0ea7 Valid from: Thu Feb 04 13:15:03 EST 2010 until: Wed May 05 14:15:03 EDT 2010 Certificate fingerprints: MD5: 81:C0:3F:EC:AD:5B:7B:C4:DA:08:CC:D7:11:1F:1D:38 SHA1: F1:78:AD:C8:D0:3A:4C:0C:9A:4F:89:C0:2A:2F:E2:E6:D5:13:96:40 Signature algorithm name: SHA1withDSA Version: 3 ******************************************* *******************************************
client. truststore
hostname[username:/this/is/a/path][713]% keytool -list -keystore client.truststore -v Enter keystore password: Keystore type: JKS Keystore provider: SUN Your keystore contains 1 entry Alias name: mykey Creation date: Feb 4,2010 Entry type: trustedCertEntry Owner: CN=hostname,C=hostname Serial number: 4b6b0ea7 Valid from: Thu Feb 04 13:15:03 EST 2010 until: Wed May 05 14:15:03 EDT 2010 Certificate fingerprints: MD5: 81:C0:3F:EC:AD:5B:7B:C4:DA:08:CC:D7:11:1F:1D:38 SHA1: F1:78:AD:C8:D0:3A:4C:0C:9A:4F:89:C0:2A:2F:E2:E6:D5:13:96:40 Signature algorithm name: SHA1withDSA Version: 3 ******************************************* *******************************************
to update
I think it might be useful to include the entire exception:
javax.xml.soap.soAPException: java.io.IOException: Could not transmit message at org.jboss.ws.core.soap.soAPConnectionImpl.callInternal(SOAPConnectionImpl.java:115) at org.jboss.ws.core.soap.soAPConnectionImpl.call(SOAPConnectionImpl.java:66) at com.alcatel.tpapps.common.utils.soAPClient.execute(SOAPClient.java:193) at com.alcatel.tpapps.common.utils.soAPClient.main(SOAPClient.java:280) Caused by: java.io.IOException: Could not transmit message at org.jboss.ws.core.client.RemotingConnectionImpl.invoke(RemotingConnectionImpl.java:192) at org.jboss.ws.core.client.soAPRemotingConnection.invoke(SOAPRemotingConnection.java:77) at org.jboss.ws.core.soap.soAPConnectionImpl.callInternal(SOAPConnectionImpl.java:106) ... 3 more Caused by: org.jboss.remoting.CannotConnectException: Can not connect http client invoker. sun.security.validator.ValidatorException: No trusted certificate found. at org.jboss.remoting.transport.http.HTTPClientInvoker.useHttpURLConnection(HTTPClientInvoker.java:368) at org.jboss.remoting.transport.http.HTTPClientInvoker.transport(HTTPClientInvoker.java:148) at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:141) at org.jboss.remoting.Client.invoke(Client.java:1858) at org.jboss.remoting.Client.invoke(Client.java:718) at org.jboss.ws.core.client.RemotingConnectionImpl.invoke(RemotingConnectionImpl.java:171) ... 5 more Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:150) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1584) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:174) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:168) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:848) at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:106) at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:495) at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:433) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:877) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1089) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1116) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1100) at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:402) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:170) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:857) at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230) at org.jboss.remoting.transport.http.HTTPClientInvoker.useHttpURLConnection(HTTPClientInvoker.java:288) ... 10 more Caused by: sun.security.validator.ValidatorException: No trusted certificate found at sun.security.validator.SimpleValidator.buildTrustedChain(SimpleValidator.java:304) at sun.security.validator.SimpleValidator.engineValidate(SimpleValidator.java:107) at sun.security.validator.Validator.validate(Validator.java:203) at com.sun.net.ssl.internal.ssl.x509trustmanagerImpl.checkServerTrusted(x509trustmanagerImpl.java:172) at com.sun.net.ssl.internal.ssl.Jssex509trustmanager.checkServerTrusted(SSLContextImpl.java:320) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:841) ... 22 more
Solution
You need to "build trust" between the server and the client (I assume you only need server-side authentication) This is because you use a self - signed certificate
On the server side:
keytool -keystore <keystore file> -alias <alias> -export -file <certfilename>.cert
Will Copy the cert file to the client, and then:
keytool -keystore <truststore file> -alias <alias> -import -file <certfilename>.cert