以下代码执行我认为的预期 - 将具有整个证书层次结构的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
答案 0 :(得分:0)
我必须做些什么才能让服务器显示CA的证书,以便浏览器显示“可信连接”?
您不会在服务器上为CA执行任何操作。由客户来信任您正在使用的CA.如果客户端不信任您正在使用的CA,那么您无法对此做任何事情(不要求用户信任您正在使用的CA)。
发送服务器证书以及构建从服务器证书到CA证书的路径所需的任何中间证书 。这避免了“哪个目录”问题,以及它在PKI中的一个众所周知的问题。从本质上讲,“哪个目录”问题意味着客户端不知道去哪里获取丢失的中间证书。为避免此问题,请在握手期间发送。
我做错了什么?
只是猜测,但是发生了两件事之一(没有明显的事情,比如证书过期或密钥使用不正确)。
首先,客户端不信任服务器正在使用的CA.要解决此问题,请让用户信任您的CA;或使用客户端软件信任的其他CA.
其次,将构建路径所需的缺失中间证书从服务器证书发送到CA证书。