CertPath问题 - HTTPS服务器未显示CA证书

时间:2014-06-14 10:30:43

标签: java ssl https

以下代码执行我认为的预期 - 将具有整个证书层次结构的PrivateKey放入KeyStore(然后在本地保存为.jks文件)。我用KeyStore Explorer仔细检查了它,它看起来很好。

但是,当我实际使用该条目创建HTTPS服务器的实例时,我只能看到签名的证书,因此该连接不受信任。当我使用KSE生成,创建CSR和CA回复并导入签名证书时,同样的事情不会发生。

我做错了什么?我该怎么做才能使服务器显示CA的证书,以便浏览器显示“可信连接”?

X509Certificate caCert = (new X509CertImpl(caKeyStore.getCertificate(rootDN).getEncoded()));

X509Certificate signed = CertificateMisc.bouncyCastle_Sign(csr,
        (PrivateKey) caKeyStore.getKey(rootDN, caKeyPairPassword),
        caCert.getSubjectDN().getName(),
        CA.algorithm, Misc.generateRandomBigInteger(), notBefore, notAfter,
        keyUsage, emailAddress);

KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(null, null);

keyStore.setKeyEntry(dn, keyPair.getPrivate(), keyPairPassword,
        new X509Certificate[]{signed, caCert});

这是CA的KeyUsage和签名的证书。

KeyUsage.dataEncipherment | KeyUsage.keyEncipherment | KeyUsage.keyCertSign
| KeyUsage.digitalSignature | KeyUsage.keyAgreement | KeyUsage.keyCertSign
| KeyUsage.nonRepudiation | KeyUsage.cRLSign

1 个答案:

答案 0 :(得分:0)

  

我必须做些什么才能让服务器显示CA的证书,以便浏览器显示“可信连接”?

您不会在服务器上为CA执行任何操作。由客户来信任您正在使用的CA.如果客户端不信任您正在使用的CA,那么您无法对此做任何事情(不要求用户信任您正在使用的CA)。

发送服务器证书以及构建从服务器证书到CA证书的路径所需的任何中间证书 。这避免了“哪个目录”问题,以及它在PKI中的一个众所周知的问题。从本质上讲,“哪个目录”问题意味着客户端知道去哪里获取丢失的中间证书。为避免此问题,请在握手期间发送。


  

我做错了什么?

只是猜测,但是发生了两件事之一(没有明显的事情,比如证书过期或密钥使用不正确)。

首先,客户端不信任服务器正在使用的CA.要解决此问题,请让用户信任您的CA;或使用客户端软件信任的其他CA.

其次,将构建路径所需的缺失中间证书从服务器证书发送到CA证书。