首页 > 解决方案 > KeyStore 和 TrustStore 加载失败 - 私钥必须附有证书链

问题描述

我使用以下命令创建了一个自签名证书:

keytool -genkeypair -keyalg RSA -alias test-api -keystore test-api.p12 -storepass password -validity 3650 -keysize 2048 -storetype pkcs12

然后我将此密钥库导入新的信任库:

keytool -import -trustcacerts -alias test-api-2018 -file test.crt -keystore trusted-keystore.p12 -storetype pkcs12

在 Java 中,创建自定义 SSL 存储提供程序 ( org.springframework.boot.context.embedded.SslStoreProvider)。作为其中的一部分,使用以下 Java 代码加载了密钥库和信任库:

try {

        try (final InputStream keyStoreStream = new ByteArrayInputStream(Base64.decode(keyStoreEncoded))) {

            keyStore = KeyStore.getInstance(KEYSTORE_TYPE_PKCS12);

            LOGGER.info("Loading a KeyStore object based on the decoded value.");

            keyStore.load(keyStoreStream, serverSslKeyPassword.toCharArray());
        }

        ....    
            trustStore.load(trustStoreStream, serverSslTrustStorePassword.toCharArray());
        }

EmbeddedServletContainerCustomizer创建并设置 SSL Provider的自定义实现:

public void customize(final ConfigurableEmbeddedServletContainer configurableEmbeddedServletContainer) {
    configurableEmbeddedServletContainer.setSslStoreProvider(awsSslStoreProvider);
}

由于以下错误,应用程序无法启动:

Caused by: java.lang.IllegalArgumentException: Private key must be accompanied by certificate chain
at java.security.KeyStore.setKeyEntry(KeyStore.java:1136)
at org.apache.tomcat.util.net.jsse.JSSEUtil.getKeyManagers(JSSEUtil.java:253)
at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:114)
... 19 common frames omitted

标签: javasslkeystore

解决方案


我只是把这个问题带到今天,当 application.properties 文件中的安全配置配置不正确时,就会出现问题,这会导致证书链中断。

在我的情况下,我使用

 server.ssl.key-password=123456789

代替

server.ssl.key-store-password=123456789

像这样的小问题可能会导致问题。


推荐阅读