在一个别名下将服务器信任证书链导出到 Truststore

Export server trust certificate chain to Truststore under one alias

我们从客户端获得了 .p7b 格式的服务器证书链,我们需要使用 Java/Scala API

导出到我们的客户端信任库

他们的证书文件包含三个证书:root、intermediate、actual server...

我们如何以相同的别名将其中三个导出到我们的信任库中?

真的需要用一个别名导出它们吗?

这是我们目前所做的...

//load default cacerts first in order to export the server cert
val keystore = KeyStore.getInstance(KeyStore.getDefaultType)
keystore.load(new FileInputStream(cacertsPath), decryptedPass.toCharArray)

val cf = CertificateFactory.getInstance("X.509")
//this is the server cert we are trying to export 
val bais = fullStream(customTrustFile)  
val certs = cf.generateCertificates(bais) -->  this returns a chain of 3 certs

certs.toArray[Certificate](new Array[Certificate](certs.size())).zipWithIndex.foreach {
    case (cert, i) => keystore.setCertificateEntry("api.*.*.site-" + i, cert)

// Save the new keystore contents
keystore.store(new FileOutputStream(cacertsPath),decryptedPass.toCharArray)

如果你看到,我们插入证书的方式,它使用了三个后缀为 -1 、-2、-3 的别名,所以我们最终将三个条目插入到信任库中,不确定这是否正确插入证书链..

  1. 有没有办法在单个别名下插入证书链?

  2. 客户端如何找到匹配的服务器信任?它使用别名吗?客户端也只需要服务器根证书吗?或者它需要所有三个?

谢谢

1.Is there a way to insert the cert chain under a single alias ?

不,每个可信证书都有一个别名

别名标识唯一的可信证书条目、私钥条目或秘密密钥条目。私钥条目也可以伴随相应 public 密钥的证书链。

2 How does the client finds the matching server trust ? is it using alias ? Also does the client requires only server root cert ? or it needs all three ?

您只需将根证书导入信任库即可。不需要别名

连接期间的客户端将收到服务器证书和证书链(无根证书)。它将尝试将链的最后一个证书(从叶到上)与信任库的一些证书进行匹配。这是为了验证证书的签名是否与根证书的 public 密钥相对应