KeyStore和TrustStore加载失败 - 私钥必须附带证书链

时间:2018-05-07 10:09:44

标签: java ssl keystore

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

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提供程序:

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

2 个答案:

答案 0 :(得分:2)

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

我使用的是

 server.ssl.key-password=123456789

代替

server.ssl.key-store-password=123456789

这样的小问题可能会引起问题。

答案 1 :(得分:1)

当使用BouncyCastle作为PKCS12密钥存储提供程序并且密钥别名使用不正确的大写字母时,也会发生这种情况。

例如(不正确):

server.ssl.key-alias=17B2E92E5694C7AE11A65C4A4EBFC75558399E05

代替(正确):

server.ssl.key-alias=17b2e92e5694c7ae11a65c4a4ebfc75558399e05

此错误的奇怪之处在于找到了密钥,因此显然不区分大小写,但是对ks.getCertificateChain(keyAlias)的检查是。