Error: “trustAnchors parameter must be non-empty” – 错误:“trustAnchors参数必须是非空的&#8221。

最后修改: 2022年 2月 15日

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: “ trust anchors parameter must be non-empty”.

在本教程中,我们将解释什么是信任锚。此外,我们将展示一个TrustStore的默认位置和预期的文件格式。最后,我们将阐明出错的原因。” trust anchors参数必须是非空的”。

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


Additionally, the parameter allows us to provide a password to the TrustStore. Finally, the command looks like this:


java our_truststore.jks -jar application.jar

Moreover, JKS is the default TrustStore format. The parameter 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:

让我们看看Java 16中的keytool工具对$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 “ trustAnchors parameter must be non-empty”.

现在让我们来看看异常” trustAnchors参数必须为非空”。

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:


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.

在这篇短文中,我们描述了什么是信任锚。然后,我们展示了一个默认的TrustStore位置和文件格式。最后,我们展示了 “信任锚的参数必须为非空 “错误的原因。

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