我有一个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类,但我真的不明白如何使用它们。
答案 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个条目,如果这真的是您想要的。如果没有,那么你应该使用不同的方法(为什么不限制或硬编码授权服务器列表?)。