It’s truly easy to generate a SSL certificate for example to use with tomcat (see here). This certificate is invalid as it is self-signed by you and it often doesn’t match the hostname. This is no problem when your access the project with a browser, with more or less jumps through hoops you accept the development certificate and you’re done.
If you access the site through java itself you’ll have problem with all tools that basically use an URLConnection. You’ll end up with an exception like this:
Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
This is will hit you for example using HtmlUnit or my oembed client.
It isn’t enough to import the certificate in question using keytool (at least, it didn’t work for me).
I search and i found this post titled “SSL Trust Provider for Java”. Interesting stuff.
This works by providing a “java.security.Provider” through the Security API accepting all certificates. Nice tip, thanks!
I didn’t want to change my sources though so i wrote a very little java agent to instrument my development setup. I also added a “javax.net.ssl.HostnameVerifier” that accepts all host names, in case the certificates cn doesn’t match the development machines hostname. If i want my vm to trust all and everything, i just add “-javaagent:full/path/to/java-trustprovideragent-0.0.1-SNAPSHOT.jar”.
The code is on github java-trustprovideragent, please feel free to use it.
Thanks to the original authors on devcentral.f5.com.