Authors Top

If you have a few years of experience in the Java ecosystem, and you’d like to share that with the community, have a look at our Contribution Guidelines.

Security Top – Temp

I just announced the new Learn Spring Security course, including the full material focused on the new OAuth2 stack in Spring Security 5:

>> CHECK OUT THE COURSE
Frontegg – Security – Text1
announcement - icon User management is very complex, when implemented properly. No surprise here.

Not having to roll all of that out manually, but instead integrating a mature, fully-fledged solution - yeah, that makes a lot of sense.
That's basically what Frontegg is - User Management for your application. It's focused on making your app scalable, secure and enjoyable for your users.
From signup to authentication, it supports simple scenarios all the way to complex and custom application logic.

Have a look:

>> Elegant User Management, Tailor-made for B2B SaaS

1. Overview

In this tutorial, we'll explain what a trust anchor is. Additionally, we'll show the default location of a TrustStore and the expected file format. Finally, we'll clarify the reasons for an error: “java.security.InvalidAlgorithmParameterException: trust anchors parameter must be non-empty”.

2. Trust Anchor Definition

Let's first explain what the trust anchor is. In cryptographic systems, a trust anchor defines the root entity for which trust is assumed and derived. In architectures like X.509, a root certificate is a trust anchor. Additionally, the root certificate guarantees trust for all other certificates in the chain.

3. TrustStore Location and Format

Let's now have a look at a TrustStore location and format in Java. First, Java looks for the TrustStore in two locations (in order):

  • $JAVA_HOME/lib/security/jssecacerts
  • $JAVA_HOME/lib/security/cacerts

We can overwrite the default location with the parameter -Djavax.net.ssl.trustStore.

Additionally, the parameter -Djavax.net.ssl.trustStorePassword allows us to provide a password to the TrustStore. Finally, the command looks like this:

java -Djavax.net.ssl.trustStore=/some/loc/on/server/ our_truststore.jks -Djavax.net.ssl.trustStorePassword=our_password -jar application.jar

Moreover, JKS is the default TrustStore format. The parameter -Djavax.net.ssl.trustStoreType allows overwriting the default TrustStore type.

Let's have a look at the output from the keytool utility in Java 16 executed for $JAVA_HOME/lib/security/cacerts:

$ keytool -list -cacerts
Enter keystore password:
Keystore type: JKS
Keystore provider: SUN

Your keystore contains 90 entries
....

As expected, the KeyStore type is JKS. Additionally, we got all 90 certificates stored in the file.

4. Reasons for the Exception

Let's now have a look at the exception “java.security.InvalidAlgorithmParameterException: trustAnchors parameter must be non-empty”.

First, the Java runtime creates the InvalidAlgorithmParameterException only in the PKIXParameters class, which is used for reading certificates from a KeyStore. The constructor of PKIXParameters collects trustAnchors from the KeyStore given as a parameter.

The exception is thrown when the provided KeyStore has no trustAnchors:

...
if (trustAnchors.isEmpty()) {
    throw new InvalidAlgorithmParameterException("the trustAnchors " +
        "parameter must be non-empty");
}
...

Let's try to reproduce the case. First, let's create an empty KeyStore:

private KeyStore getKeyStore() throws CertificateException, NoSuchAlgorithmException, IOException, KeyStoreException {
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
    ks.load(null, "changeIt".toCharArray());
    return ks;
}

Let's now test the instantiation of the PKIXParameters class:

@Test
public void whenOpeningTrustStore_thenExceptionIsThrown() throws Exception {
    KeyStore keyStore = getKeyStore();
    InvalidAlgorithmParameterException invalidAlgorithmParameterException =
      Assertions.assertThrows(InvalidAlgorithmParameterException.class, () -> new PKIXParameters(keyStore));
    Assertions.assertEquals("the trustAnchors parameter must be non-empty", invalidAlgorithmParameterException.getMessage());
}

That is to say, the constructor threw the exception as expected. In other words, it's not possible to create an instance of the PKIXParameters class when there are no trusted certificates in the given KeyStore.

5. Conclusion

In this short article, we described what a trust anchor is. Then, we showed a default TrustStore location and file format. Finally, we showed the reasons for the “trust anchors parameter must be non-empty” error.

As always, the source code of the example is available over on GitHub.

Security bottom

I just announced the new Learn Spring Security course, including the full material focused on the new OAuth2 stack in Spring Security 5:

>> CHECK OUT THE COURSE
Security footer banner
Comments are closed on this article!