Adding StartCom Certificates in Java (Netbeans) - java

I am making an Java client application that needs to access some data from website using https and signed by StartCom.
First, I tried to use HttpsURLConnection to access https://blabla.com/blabla.file, but I got sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target. error.
I guess the reason is that StartCom is not added in Java trust certs.
Then, I added two StartCom certificate files (ca.crt and startcom.sub.class1.server.ca.crt) in Java cacerts and I can see them with keytools, but I still get the same error as before.
So, is it possible to use StartCom signed websites in java application without adding it to Java cacerts, and
why can not I use StartCom signed websites even if I added their certificates to my cacerts file, what did I do wrong?
Thank you in advance!
Edit 1: If I try to access https://google.com (for example) from my application there are no errors.
Edit 2: Certificates where added by this command keytool -keystore cacerts -importcert -alias startcom.ca -file ca.crt.

Related

javax.mail.MessagingException: Can't send command to SMTP host;

I have imported the certificate to cacerts (to where the JAVA_HOME is pointing) but still getting this error. Not able to figure out the issue. There is no firewall issue from client's mail server which is a Microsoft ESMTP server. I am able to telnet this from my server. Tried SSLpoke but it's getting timed out. Tried tcpdump of port 25, can see the communication back and forth. Basically trying to a trigger an outbound email from the mail server.
The detailed error log is:
Caused by: javax.mail.MessagingException: Can't send command to SMTP
host; nested exception is:
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
at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1420)
at com.sun.mail.smtp.SMTPTransport.sendCommand(SMTPTransport.java:1408)
at com.sun.mail.smtp.SMTPTransport.ehlo(SMTPTransport.java:847)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:384)
at javax.mail.Service.connect(Service.java:297)
at javax.mail.Service.connect(Service.java:156)
at javax.mail.Service.connect(Service.java:105)
at javax.mail.Transport.send0(Transport.java:168)
at javax.mail.Transport.send(Transport.java:98)
at com.issuetracker.esb.mail.GmailImpl.transportMessage(GmailImpl.java:94)
at com.issuetracker.esb.mail.Mail.sendSRMail(Mail.java:188)
Did you use the -trustcacerts parameter when importing the cert with keytool?
Edit: My conversation on this topic has covered specific reasons for the error to occur but did not have the appearance of an 'answer', so here's a rewrite.
PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to
find valid certification path to requested target
This error indicates that a valid certificate chain for the purposes of trusting an incoming certificate could not be obtained from the resident keystore file being used by the running JRE (by default, in the JRE's jre/lib/security/cacerts file).
Typical causes of this include:
Neglecting to include the parameter -trustcacerts when importing the certificate with the keytool command.
When the JRE is looking for certificates it knows about to match the incoming one, it will only consider the certificates that have been marked as trusted in this way.
The certificate has been signed by a root CA for whom the JRE does not already have the root certificate installed for.
Typically this is caused by having the certificate signed by an unknown root certificate authority (CA), such as a company's own internal CA that the JRE knows nothing about (yet), or even by some third party root CAs that aren't as popular as some other big-name vendors, and so whilst a browser or OS may have a root certificate already, Java may not have shipped with it.
To rectify this, you will also need to obtain and install the root CA certificate and mark it trusted too.
There are also companies that provide certificate signing that are acting as intermediaries, meaning that they don't have their own root CA themselves, but have been given a certificate by a trusted root CA to allow them to further sign certificate signing requests (CSRs).
In these cases, whilst you may have your own certificate and the underlying root CA already installed and trusted, unless you also obtain and install the intermediate certificate, then the 'certificate chain' is broken and a valid certificate path cannot be made.
So possible solutions in summary include:
Perform all certificate installations for other sites with the -trustcacerts parameter.
Check that the root CA certificate exists in the keystore file also, if not, obtain and install it using keytool -importcert -trustcacerts as well.
Check if there is also an intermediate certificate to complete the full chain, and if so, obtain and install that using keytool -importcert -trustcacerts into the keystore file also.
Note: Examining the .crt file in Windows by double-clicking the file can give you an opportunity to examine the certificate path and see if and which root and intermediary CAs were involved to help show what you will need.
Once a complete and valid certificate chain has been installed and trusted into the keystore file, the error should pass.

Disconnected TeamCity Build Agent after update TeamCity Server SSL certificate

We use TeamCity 7.1.5., I updated TeamCity Server site certificate (replaced server.p12 file with new one) for new time period and TeamCity Server lost connection with single Agent. Agent status is Disconnected, Authorized, Enabled. With WEB Browser I navigated to TeamCity site and made sure new certificate is valid.
Into teamcity-agent.log file I see many similar messages, for sample:
[2014-03-20 16:37:11,694] WARN - jetbrains.buildServer.AGENT - Ping problem: Call https://example.com/RPC2 buildServer.ping: 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
How I can fix this Agent connectivity problem with new certificate?
With old site certificate TeamCity worked properly.
I see difference in Details of old and new certificate. Old Certificate Signature Algorithm is PKCs #1 SHA-1 With RSA Encryption. New Certificate Signature Algorithm is PKCs #1 SHA-256 With RSA Encryption.
I solved the same problem by adding the new cert to default truststore of java:
And import it into java default truststore:
keytool -import -trustcacerts -file <ca_file> -alias <CA_ALIAS> -keystore $JAVA_HOME/jre/lib/security/cacerts
[tmpFile] - name of generated file.
[servers-keystore] - configured keystore of your server
[CA_ALIAS] - alias of the cert to identify in keystore
[ca_file] - ca_file from webside (maybe get with chrome expor)
Check, that the $JAVA_HOME path is correct, maybe replace it with absolut path.
The default passwort for truststore (cacerts) is: changeit
For more information about java keytool: here
If you do not have the ca_file check this post
For TeamCity agent installed under Windows, use "agent_installation_path/jre" as "JAVA_HOME". Source

Connecting via SSL with Java: The basics

I need to connect to a URL over HTTPS using Java. I don't have any experience with SSL certificates, and most of the questions here assume some basic knowledge. I was hoping someone here could get me started on the basics.
When I put the URL in my browser, it connects just fine. When I do it using Java:
new URL("https://mysite.com/").openStream()
it throws 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 question shows how to ignore the whole certificate thing, but that doesn't feel right. I simply want to use the same certificate my browser does.
I've already tried adding the -Djavax.net.ssl.trustStore=cacerts property, which changes the exception to javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty, which I've taken from this question to mean it can't find the trust store called cacerts. I'm not sure what else to specify, though.
Many sites use self-signed certificates for ssl. You should add them to your JRE's cacerts file. In such cases I use following steps:
Go to https://mysite.com with your browser
Save its certificate to your local machine
Import it to your cacerts with keytool command. The command line looks like this: keytool -import -alias mysite -file mysite.cer -keystore {path/to/cacerts}
As an alternative, you can use openssl s_client utility to retreive mysite.com certificate.

SSL Self-signed Expired Certificate in Java

Hi I am accessing a developmental API that only has a self signed, expired certificate through Java, and unexpectedly I am getting the error about unable to find valid certification path to requested target. so I went to the url with firefox and exported the certificate to add to my keystore, using keytool -importcert -alias mycert -file mycert.cert -keystore cacert, thinking that it should work now. But upon making the call, I am still getting the same error.
Am I missing some step to link up the cert to java?
the error is
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:318)
... 22 more
UPDATE: problem solved. location of keystore was wrong.
should be {location of java home}/lib/security/cacerts
exported the certificate to add to my keystore
No you didn't, you added it to your truststore. You shouldn't modify the one in the JRE, for the reason GregS gave, you should create your own and tell the server to use it.

Java HttpsURLConnection SSLHandshakeException

I am attempting to make a HTTPS connection to a website using HttpsURLConnection, and then perform a PUT request. When I try to create the OutputStreamWriter from HttpsURLConnection.getOutputStream(), the following exception is thrown:
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
The page has just gotten its certificate (issued by StartCom) - do I need to manually do something to make Java recognise the certificate is present now? I can connect to other pages of the same website with no difficulty, but they have a different certificate.
You can import the root certificate of StartCom yia the tool keytool (from JDK) into a Java Key Store (JKS) and then set the key store as "trusted store".
See section "Exporting and Importing Certificates" on:
http://java.sun.com/developer/technicalArticles/Security/secureinternet2/
Commands mentioned in that article:
Import certifificate to trustedcerts.jks:
keytool -import -keystore trustedcerts.jks -alias qusay -file server.crt
Start Java using custom tuststore:
java -Djavax.net.ssl.trustStore=trustedcerts.jks com.example.MyClass
Alternatively you can set the truststore at runtime:
System.setProperty("javax.net.ssl.trustStore","./trustedcerts.jks");
Please also see this question: Import StartCom CA certificates in Windows JRE
It links to a script for importing StartCom certificates into your JDK trusted store.

Categories

Resources