Java 向jvm添加不同的p12证书

Java 向jvm添加不同的p12证书,java,ssl,jvm,certificate,aem,Java,Ssl,Jvm,Certificate,Aem,我的应用程序中有不同的使用SSL的服务,这些服务使用不同的.p12文件来连接不同的密码。现在java在每次调用时加载信任库和密钥库+文件,因此我希望删除此行为并将证书添加到我的JVM中。默认情况下,这是我可以使用 -Djavax.net.ssl.keyStore="{mycert.p12}" -Djavax.net.ssl.keyStorePassword={mypassword} -Djavax.net.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.trust

我的应用程序中有不同的使用SSL的服务,这些服务使用不同的.p12文件来连接不同的密码。现在java在每次调用时加载信任库和密钥库+文件,因此我希望删除此行为并将证书添加到我的JVM中。默认情况下,这是我可以使用

-Djavax.net.ssl.keyStore="{mycert.p12}" -Djavax.net.ssl.keyStorePassword={mypassword} -Djavax.net.ssl.keyStoreType=PKCS12 -Djavax.net.ssl.trustStore="{cacertsroute}" -Djavax.net.ssl.trustStorePassword=changeit
但我有不同的p12文件,所以我需要将它们连接到一个文件中,因为我无法指定jvm在命令行中使用多个p12文件和密码

我创建了一个新的p12文件为空,并使用keytool在其中添加了一个p12文件

keytool -importkeystore -srckeystore first.p12 -srcstoretype pkcs12 -srcstorepass firstp12pass -destkeystore newstore.p12 -deststoretype pkcs12 -deststorepass firstp12pass
之后,我有了一个新的密钥库,只有一个p12,它与使用first.p12证书的服务一起工作。我读到密钥库和p12应该有相同的密码,所以为了添加第二个p12文件,我创建了一个temp.p12文件,将第二个.p12的密码更改为第一个p12密码,所以现在它们有相同的密码,然后我使用使用与以前相同的命令将temp.p12(第二个.p12)添加到newstore.p12

现在,我只有一个文件,其中包含两个不同服务的条目,但当我使用证书时,它现在不起作用

我调试了ssl调用,似乎CN不正常。当我只使用一个条目调用p12时,它会将正确的CN发送到服务器,但当我使用两个条目时,它不会选择正确的CN

有人能帮我吗?也许不可能混合文件,或者有另一种方法


谢谢,

您这样做似乎是为了启用相互证书身份验证,而不是设置简单的HTTPS连接器

我建议将证书合并到一个
.pfx
文件中,方法是将它们导出为纯文本
.pem
文件并将它们连接起来。这也可用于手动创建证书链

  • 将PFX转换为PEM(转换两个PFX文件):
    openssl pkcs12-in example.pfx-out example.pem-nodes
  • 包括
    开始证书
    结束证书
    标记
  • 将组合的PEM文件转换回PFX:
    openssl pkcs12-export-in example.PEM-out example concat.PFX

  • 您这样做似乎是为了启用相互证书身份验证,而不是设置一个简单的HTTPS连接器

    我建议将证书合并到一个
    .pfx
    文件中,方法是将它们导出为纯文本
    .pem
    文件并将它们连接起来。这也可用于手动创建证书链

  • 将PFX转换为PEM(转换两个PFX文件):
    openssl pkcs12-in example.pfx-out example.pem-nodes
  • 包括
    开始证书
    结束证书
    标记
  • 将组合的PEM文件转换回PFX:
    openssl pkcs12-export-in example.PEM-out example concat.PFX

  • 为什么不为不同的服务使用不同的SSLContext?每个请求都有自己的密钥库,因为这样做的目的是避免使用更多的java代码,并停止在每个请求上加载文件。我可以在不加载java密钥库的情况下指定SSLContexts吗?没有必要每次都加载文件。您只需使用给定的信任库/密钥库初始化SSLContext一次,然后重用此SSLContext提供的SocketFactory。为什么不为不同的服务使用不同的SSLContext?每个请求都有自己的密钥库,因为这样做的目的是避免使用更多的java代码,并停止在每个请求上加载文件。我可以在不加载java密钥库的情况下指定SSLContexts吗?没有必要每次都加载文件。只需使用给定的信任库/密钥库初始化SSLContext一次,然后重用此SSLContext提供的SocketFactory。