Java RMI SSL是否存在密钥库/信任库错误?
问题描述:
使用下面的代码来测试在RMI SSL连接:Java RMI SSL是否存在密钥库/信任库错误?
public class HelloImpl extends UnicastRemoteObject implements Hello {
public HelloImpl() throws RemoteException {
super(0, new SslRMIClientSocketFactory(), new SslRMIServerSocketFactory());
}
public String sayHello() {
return "Hello World!";
}
public static void main(String args[]) throws Exception {
// Get reference to the RMI registry running on port 3000 in the local host
Registry registry = LocateRegistry.getRegistry(null, 3000);
// Bind this object instance to the name "HelloServer"
HelloImpl obj = new HelloImpl();
registry.bind("HelloServer", obj);
System.out.println("HelloServer bound in registry");
}
}
其余部分是相当普通的(使用了一些代码从这里:http://blogs.oracle.com/lmalventosa/entry/using_the_ssl_tls_based),基本上试图做的仅服务器身份验证以获取SSL加工。然而,得到这个唠叨错误:
RMI RenewClean-[146.169.51.86:60013,[email protected]], READ: TLSv1 Alert, length = 2
RMI RenewClean-[146.169.51.86:60013,[email protected]], RECV TLSv1 ALERT: fatal, bad_certificate
RMI RenewClean-[146.169.51.86:60013,[email protected]], called closeSocket()
RMI RenewClean-[146.169.51.86:60013,[email protected]], Exception while waiting for close javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate
RMI RenewClean-[146.169.51.86:60013,[email protected]], handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate
它从调试转储,他们试图做一个握手,至于交换对称密钥去,但在这件事上失败,对于一些无法解释的原因出现
。在编译期间,我们指定存储在文件夹中的信任存储:
# $ java -Djavax.net.ssl.trustStore=truststore -Djavax.net.ssl.trustStorePassword=trustword HelloClient
任何帮助非常感谢!
答
对我来说,听起来好像HelloImpl服务器提供的证书存在问题,这可能意味着您启动服务器的方式或密钥/证书生成过程的问题。也许你可以运行
keytool -list -v -keystore keystore
对您的HelloImpl服务器正在开始与密钥库
,也许开始在服务器和客户端-Djavax.net.debug = SSL可以看到如果添加的信息可用? (如果是这样,用这些细节编辑你的问题)从上面很难说出错误可能是什么,而不知道密钥库和信任库的状态,以及创建它们的过程。
答
编辑:
一个bad_certificate意味着服务器的证书的格式的客户端,也无法理解或者想要拒绝。
没有太多可以做,除了得到一个新的服务器证书前。
但是,当SSL握手期间获取的服务器证书过期,自签名,主机名验证失败等情况时,某些浏览器发送bad_certficate警报以关闭HTTPS连接。Firefox使用此警报关闭HTTPS连接,同时向用户显示一个页面,询问是否信任该证书。如果用户同意,Firefox会打开一个新的HTTPS连接,并且此时接受证书而不是发送bad_certificate警报。
假设发送了警报而不是仅仅关闭连接,所以服务器可以记录实际发生的事情,或者可能在握手阶段中止连接,而不是冒着发送数据的风险。