让Java只接受一个SSL证书

时间:2010-02-15 20:31:39

标签: java ssl ssl-certificate

我有一个java applet,可以加载一些预安装的本机代码扩展,以在浏览器中显示自定义内容。其中一些内容可能包含由JVM加载的本机代码。显然,这是一个安全问题。我想强制所有内容仅来自授权服务器。

我一直在遵循的路径是创建一个只包含一个SSL证书的密钥库。我设置了密钥库位置和密码,并打开了调试输出。

System.setProperty("javax.net.ssl.keyStore", "C:\\keys\\keystore");
System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
System.setProperty("javax.net.debug", "ssl");

我的印象是,这意味着JVM只能访问一个密钥库文件,因此只能访问其中的一个密钥。事实上,除了我添加的一个密钥之外,SSL调试信息还列出了75个CA密钥。显然,这并不能阻止任何人向我们发送不受信任的代码。

有没有办法告诉SSL系统只使用一个证书?我应该采用完全不同的方法吗?

更新: 更改cacerts文件实际上不是一个选项。对于使用它的其他应用程序,JVM应继续正常运行。有没有办法在运行时选择不加载该文件?我正在查看TrustManager和KeyManager类,但我真的不明白如何使用它们。

4 个答案:

答案 0 :(得分:1)

您需要将javax.net.ssl.trustStore系统属性设置为指向包含一个证书的密钥库。密钥库用于您的身份验证凭据,而不是您的身份验证凭据。

答案 1 :(得分:1)

这里的问题是错的。证书只是身份证明。您没有授权证书,您授权身份。如果同一个客户提供新证书怎么办?

正确答案是安装检查对等身份的HandshakeCompletedListener。信任库仅用于身份验证,即他们所说的那个人。你正在做的是授权,完全是另一回事。您不应使用信任库(或任何PKI机制)进行授权。

答案 2 :(得分:0)

您还可以使用JRE安装全局密钥库,JRE是存储所有CA的地方。尝试重命名它,看看会发生什么。

答案 3 :(得分:0)

您仍然“看到”位于cacerts的系统级JRE java.home/jre/lib/security文件的CA证书,这是正常的。

现在,引用关于此文件的keytool documentation

  

重要提示:验证您的cacerts文件
  因为您信任CA.   cacerts文件作为实体   签署和颁发证书   其他实体,你必须管理   cacerts谨慎归档。 cacerts   文件应仅包含证书   您信任的CA.这是你的   有责任验证受信任的人   捆绑在中的根CA证书   cacerts文件,并建立自己的信任   决定。删除不受信任的CA.   来自cacerts文件的证书,请使用   keytool的删除选项   命令。您可以找到cacerts文件   在JRE安装目录中。   如果是,请联系您的系统管   您无权编辑   这个档案。

在您的情况下,使用您自己的密钥库完全替换cacerts可能更容易,而不是删除所有75个条目,如果这真的是您想要的。如果没有,那么你应该使用不同的方法(为什么不限制或硬编码授权服务器列表?)。