Spring Boot SSL和密钥库证书安装

时间:2018-03-10 10:56:57

标签: java spring ssl spring-boot ssl-certificate

我在配置spring boot tomcat SSL以使用Comodo EV证书时遇到问题。然而,这是我第一次这样做,显然我在某处犯了一些愚蠢的错误。任何帮助都会受到很多赞赏,因为我已经在这几天挣扎了......

所以,我的方案如下: - Spring Boot,Java 8。 - 我创建了KeyStore2.jks,创建了CSR并将其发送给Comodo。我也导出了私钥,以防万一我弄乱了(我希望有可能将私钥导入新的密钥库,以防我弄乱整个密钥库..) - Comodo颁发证书并发送4个文件:

1.Root CA Certificate - AddTrustExternalCARoot.crt
2.Intermediate CA Certificate - COMODORSAAddTrustCA.crt
3.Intermediate CA Certificate - COMODORSAExtendedValidationSecureServerCA.crt
4.POSITIVE EV SSL Certificate - mydomain_com.crt

按照他们的指示,我已将所有4个导入我的密钥库:

keytool -import -trustcacerts -alias root -file  AddTrustExternalCARoot.crt -keystore KeyStore2.jks 
keytool -import -trustcacerts -alias intermediate -file COMODORSAAddTrustCA.crt -keystore KeyStore2.jks 
keytool -import -trustcacerts -alias intermediate2 -file COMODORSAExtendedValidationSecureServerCA.crt -keystore KeyStore2.jks 
keytool -import -trustcacerts -alias domain -file mydomain_com.crt -keystore KeyStore2.jks 

但是,在导入root后,我收到了警告:

Certificate already exists in system-wide CA keystore under alias <addtrustexternalca>
Do you still want to add it to your own keystore? [no]:  yes

我将KeyStore2.jks移动到Spring Boot项目中的/ src / main / resources。

My Spring Boot application.properties config:

server.port=8443
server.ssl.key-store=classpath:KeyStore2.jks
server.ssl.key-store-password=mykeystorepass
server.ssl.keyStoreType=JKS
server.ssl.keyAlias=domain
server.ssl.key-password=mykeypass

然后我们走了:

java.lang.IllegalArgumentException: java.io.IOException: Alias name [domain] does not identify a key entry

我现在正在使用试错法尝试所有方法,但没有。 如果我在.properties中注释掉最后两行:

server.ssl.keyAlias=domain
server.ssl.key-password=mykeypass

tomcat响应:

java.lang.IllegalArgumentException: java.security.KeyStoreException: Cannot store non-PrivateKeys

如果我使用keytool -list列出我的密钥库中的条目,那就是输出(省略指纹):

root, Mar 10, 2018, trustedCertEntry, Certificate fingerprint (SHA1):...
domain, Mar 10, 2018, trustedCertEntry, Certificate fingerprint (SHA1): .....
intermediate, Mar 10, 2018, trustedCertEntry, Certificate fingerprint (SHA1): ....
intermediate2, Mar 10, 2018, trustedCertEntry, Certificate fingerprint (SHA1): ...

证书是否可能与私钥或其他内容不一致?

如何检查?

别名命名是否有任何功能意义?

我是否使用JKS或PKCS12密钥库格式进行Spring Boot?

这是我第一次安装外部证书。我使用自签名证书多次这样做,没有任何问题,但这一个...请帮忙!提前谢谢!

1 个答案:

答案 0 :(得分:0)

这里的问题是您的密钥库中没有PrivateKeyEntry。所有证书都添加为trustedCertEntry。这意味着证书在那里,并且如果您将此密钥库用作信任库,则将受到信任,但是您的域证书私钥没有与证书一起正确添加。

据我所知,keytool无法做到这一点,但是您可以使用openssl代替此命令:

openssl pkcs12 -export -in my_domain.crt -inkey my_domain_key.key -out keystore.p12

这将创建一个PKCS12密钥库,并将您的域证书作为PrivateKeyEntry。

此后,您可以照常使用keytool来添加其他证书,尽管我认为您不需要根证书。

出于好奇,您是如何针对自签名证书执行此操作的?对于那些人来说,这也是一个问题。

我不时遇到的另一个问题是应用程序无法读取私钥。这总是由密钥库和密钥本身具有不同的密码引起的。我看到您已经专门配置了密钥密码,因此这对您来说可能不是一个问题(我不知道您可以这样做)。

别名的别名并不重要,只要别名在密钥库中是唯一的即可。

建议使用

PKCS12(甚至通过keytool本身)。 PKCS12是开放标准,而JKS是Java标准。

要验证密钥库是否正确设置,请像以前一样列出内容。它应该像这样(手动复制和修改):

root, Mar 10, 2018, trustedCertEntry, Certificate fingerprint (SHA1):...
domain, Mar 10, 2018, PrivateKeyEntry, Certificate fingerprint (SHA1): .....
intermediate, Mar 10, 2018, trustedCertEntry, Certificate fingerprint (SHA1): ....
intermediate2, Mar 10, 2018, trustedCertEntry, Certificate fingerprint (SHA1): ..

免责声明:我也是这个学科的自学者,所以我不是专家。