当前位置: 首页 > 知识库问答 >
问题:

spring boot SSL和密钥存储证书安装

应和悦
2023-03-14

我在配置spring boot tomcat SSL以使用Comodo EV证书时遇到问题。然而,这是我第一次这样做,所以很明显,我在某处犯了一些愚蠢的错误。如果有任何帮助,我会非常感激,因为我已经在这方面挣扎了好几天了...

所以,我的场景是这样的:

>

  • Java spring boot。

    我创建了keystore2.jks,创建了CSR,并将其发送给了Comodo。我还导出了私钥,以防我搞砸了什么东西(我希望有可能将私钥导入到一个新的密钥存储库,以防我搞砸了整个密钥存储库。)

    Comodo颁发了证书并发送了4个文件:

    1.根CA证书-AddTrustExternalCaroot.crt 2.中间CA证书-ComoDorsaAddTrustca.crt 3.中间CA证书-ComoDorsaExtendedValidationSecureReserverca.crt 4.正EV SSL证书-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
    

    我在spring boot项目中将keystore2.jks移动到/src/main/resources。

    我的spring boot应用程序.属性配置:

    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): ...
    

    有没有可能cert没有与私钥或其他东西对齐?

    怎么查?

    别名命名有什么功能意义吗?

    我对spring boot使用JKS还是PKCS12密钥存储格式有关系吗?

    这是我第一次安装外部证书。我做了很多次没有任何问题的自签名证书,但这一次...请救命!提前道谢!

  • 共有1个答案

    闻人博
    2023-03-14

    这里的问题是您的密钥库中没有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): ..
    

    免责声明:我是自学的,最近也是,所以我不是专家。

     类似资料:
    • 证书、私钥(客户端)和客户端证书都是pem格式的,我必须将它们添加到信任存储区和密钥存储区中。我该怎么做呢?到目前为止,我在cmd(windows)中有命令: > 要生成PKC(key:客户端私钥,cert:客户端cert,CA:CACERT):openssl pkcs12-inKey key.pem-in cert.pem-export-out keystored.p12-certfile CA

    • 本任务将演示将现有的证书和密钥添加到 Istio CA 中。 默认情况下,Istio CA 生成自签名 CA 证书和密钥,并使用它们签署工作负载证书。Istio CA 也可以使用我们指定的证书和密钥来签署工作负载证书。接下来我们将演示将证书和密钥插入 Istio CA 的示例。 开始之前 根据安装指南中的快速入门指南,在 Kubernetes 集群中安装 Istio。 在安装步骤的第四步应该启动身

    • 资源组 集成帐户 密钥库 Active Directory 使用命令set-azurermkeyvaultaccesspolicy向我的用户授予所有密钥和机密的权限 每当我转到集成帐户>Certificates>Add>choose[Certificate Type]=“Private”时,组合框资源组和密钥库会自动填充,但密钥名称会抛出以下错误: 与密钥库[MY_KEY_VAULT]通信失败。请

    • 问题内容: 我们可以在密钥存储区中加载多个证书和密钥吗? 是否总是需要仅加载对(即证书和密钥一起)? 如果密钥库具有多个证书和密钥,那么当Java SSL尝试建立作为服务器的连接时,将选择哪个证书和密钥? 问题答案: 尽管这取决于KeyStore类型,但是通常,您可以在单个存储中存储多个私钥和证书。 基于Java的服务器使用哪种密钥和证书组合取决于应用程序的实现方式。许多应用程序允许您使用 别名

    • 我最近为我的网站购买了ann SSL证书,在生成密钥库时遇到了一些奇怪的事情。在Godaddy教程中,它说要导入根证书,安装中间证书,并将颁发的证书安装到密钥库中。 从GoDaddy下载文件时,虽然它给了我三个。crt文件。一个文件名为十六进制,这是实际的证书,另外两个文件名为:gdig2。crt和gd_束-g2-g1。crt。 我该如何使用导入这些文件的方式呢? 注意:当查看bundle文件时,

    • 问题内容: 我的Java程序如何知道包含证书的密钥库在哪里?或者,如何告诉我的Java程序在哪里寻找密钥库? 在以某种方式指定了密钥库之后,如何指定用于对服务器进行身份验证的证书? 问题答案: