2010-02-17 52 views
1

使用下面的代码来测试在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 

任何帮助非常感谢!

回答

0

对我来说,听起来好像HelloImpl服务器提供的证书存在问题,这可能意味着您启动服务器的方式或密钥/证书生成过程的问题。也许你可以运行

keytool -list -v -keystore keystore 
对您的HelloImpl服务器正在开始与密钥库

,也许开始在服务器和客户端-Djavax.net.debug = SSL可以看到如果添加的信息可用? (如果是这样,用这些细节编辑你的问题)从上面很难说出错误可能是什么,而不知道密钥库和信任库的状态,以及创建它们的过程。

0

编辑:

一个bad_certificate意味着服务器的证书的格式的客户端,也无法理解或者想要拒绝。

没有太多可以做,除了得到一个新的服务器证书前。

但是,当SSL握手期间获取的服务器证书过期,自签名,主机名验证失败等情况时,某些浏览器发送bad_certficate警报以关闭HTTPS连接。Firefox使用此警报关闭HTTPS连接,同时向用户显示一个页面,询问是否信任该证书。如果用户同意,Firefox会打开一个新的HTTPS连接,并且此时接受证书而不是发送bad_certificate警报。

假设发送了警报而不是仅仅关闭连接,所以服务器可以记录实际发生的事情,或者可能在握手阶段中止连接,而不是冒着发送数据的风险。

相关问题