1

所以这可能是一个愚蠢的问题,但我整天都在网上搜索,试图弄清楚如何将受信任的 SSL 证书放入我的 java 服务器。

细节:

我创建了一个创建 SSLServerSocket 接受连接的 java 服务器。我使用 keytool 创建了一个名为 domain.key 的密钥库以及一个证书请求 (csr)。然后我联系了证书颁发机构(starfield)并给了他们我的 csr,他们做了他们的事情并将证书退还给我(crt)。我有 3 个。一个叫 domain.com.crt,一个叫 sf_bundle.crt,一个叫 sf_intermediate.crt

经过大量搜索后,我发现我需要将证书导入密钥库,并且密钥库可以与具有我的公钥/私钥的密钥库相同,也可以位于单独的文件中。我选择将它放入一个名为 domain.trust 的单独文件中。

然后我修改了我的服务器以使用以下命令导入信任库和密钥库:

System.setProperty("javax.net.ssl.keyStore", "domain.key");
System.setProperty("javax.net.ssl.trustStore", "domain.trust");

沿着密钥库密码和信任库密码的相应行。

问题是,当我尝试使用任何客户端进行连接时,它总是说证书是出售签名的。

我一直在使用http://certlogik.com/ssl-checker/来测试它。

我显然错过了一步,但我不知道在哪里。

任何帮助将不胜感激

4

3 回答 3

0

首先,您似乎对密钥库和信任库之间的区别感到困惑。这个答案可能很有趣。

从本质上讲,除非您想使用客户端证书身份验证,否则从服务器的角度来看,您无需更改信任库。

经过大量搜索后,我发现我需要将证书导入密钥库,并且密钥库可以与具有我的公钥/私钥的密钥库相同,也可以位于单独的文件中。

为了能够使用您从最初拥有的 CSR 获得的证书,您必须将该证书重新导入生成 CSR 的密钥库中,并且您必须将其与整个证书链一起导入到正确的别名中,存储私钥的地方。

这与此问题中的问题本质上是相同的问题,但来自服务器端。

使用以下命令查找具有您的私钥的别名keytool -list -keystore store.jks

Your keystore contains 1 entry

myalias, Feb 15, 2012, PrivateKeyEntry, 
Certificate fingerprint (MD5): xxxxxxxx

以正确的顺序准备包含您的证书和 CA 证书链的捆绑包(首先是您自己的证书,然后是每个颁发者一个一个):

-----BEGIN CERTIFICATE-----
MIICajCCAdOgAwIBAgIBAjANBgkqhkiG9w0BAQUFADA7MQswCQYDVQQGEwJVSzEa
....
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIICkjCCAfugAwIBAgIJAKm5bDEMxZd7MA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNV
....
-----END CERTIFICATE-----

(您可以使用每个块来验证每个证书的内容openssl x509 -text -noout并将其粘贴---BEGIN/END---到其标准输入中,包括分隔符。)

然后,一步导入​​该文件:

keytool -importcert -keystore store.jks -alias myalias -file bundle.pem
于 2012-10-31T01:52:38.670 回答
0

您首先需要了解 SSL 握手期间发生的情况。也许那时你可以缩小问题的范围。您可以参考互联网上的各种文档。http://www.pierobon.org/ssl/ch/detail.htm

  1. 您正在运行的服务器必须安装有 CA StarField。或者它应该与 CA StarField 有信任关系。
  2. 您的 rclient 证书必须是 CA StarField 签署的 CSR,我猜您已经这样做了。
  3. 现在,当您将证书提交给服务器时,它会检查它拥有的 CA。
  4. 因此,如果服务器具有 CA StarField 并且您的证书由 StarField 签名,那么您将不会收到自签名错误。
  5. 仅当您的证书未由 CA 签名时,您才会得到它。只需打开您的证书并检查其颁发者详细信息即可确认。
于 2012-10-30T21:39:30.573 回答
0

问题是,当我尝试使用任何客户端进行连接时,它总是说证书是出售签名的。

这表明根 CA 证书正在发送到客户端。
你没有提到你是如何创建你使用的这个单独的密钥库的。
您应该执行以下操作:

keystore.setKeyEntry("alias", privateKey, password, chain);  

并且链将具有:
chain[0]->您的服务器的证书
chain[1]->签名者的证书
....-
chain[N]>签名者到根

于 2012-10-30T21:28:01.560 回答