信任CA和父CA,但不信任其他衍生CA. Java应用程序

时间:2015-03-17 10:44:43

标签: java ssl

编辑1 https://security.stackexchange.com/questions/83972/trust-ca-and-parent-ca-but-not-other-derivative-cas。见评论。我的客户端/服务器是java,因此可能的解决方案是实现我自己的javax.net.ssl.TrustManager实现。

我遇到了客户端通过SSL加密套接字连接服务器的问题。我有3个CA:

  • root CA:用于签署其他CA证书。
  • 测试人员CA:由根CA签名,用于签署测试版客户端证书。
  • 生产CA:由根CA签名,用于签署生产客户端证书。

我想为服务器创建一个信任库:

  • 允许测试人员CA签署所有已签名的客户端证书。
  • 允许根CA的所有已签名客户端证书。
  • 拒绝生产CA的所有已签名客户端证书。

我的问题:如果我生成仅包含测试人员CA证书的信任库,则根CA签署的客户端证书将失败(我希望证书链允许它)。如果我生成包含测试CA和根CA的信任库,则还允许通过生产签署的证书。

有什么办法吗?

1 个答案:

答案 0 :(得分:0)

有一种肮脏的方式!您可以打破服务器证书链 - >您在KeyStore中的中间证书(生产CA),以便前者无法由根CA验证。

从密钥库导出服务器证书条目,并从PEM文件中删除颁发者(生产CA)证书并将其导回。

>keytool -exportcert -rfc -file scert.pem -keystore store.jks -alias salias

打开pem文件,第一个----- BEGIN CERTIFICATE -----<> ----- END CERTIFICATE -----是服务器证书,下面的将是发行人(Prod CA)。删除颁发者并重新导入.pem文件。

> keytool -importcert -keystore store.jks -alias salias -file broken.pem

现在,当服务器证书提交给客户端时,它不能被TrustStore中的根CA验证为服务器证书 - >生产CA->根CA已损坏。