2012-04-10 84 views
0

我有一个在GlassFish 3.x上运行的应用程序。它通过https与远程服务器通信。在我的cacerts文件中,我添加了服务器证书。在我的keystore.jks中,我添加了运行远程服务器的公司发给我的私钥。这对Glassfish 2.x非常有用,但是在3.x中,他们远程服务器不断抱怨我拥有的密钥无效。我的应用程序如何知道使用什么私钥

如果我从密钥库中删除密钥,则会得到相同的错误。这是因为如果它甚至没有加载密钥,这已经让我不知道如何应用程序/容器知道我需要哪些关键

我的连接代码如下所示:

public class SSLSocket { 

private static Logger logger = LoggerFactory.getLogger(SSLSocket.class); 
private ConnectionProperties connectionProperties; 

public TuSSLSocket(ConnectionProperties connectionProperties) { 
    this.connectionProperties = connectionProperties; 
} 

public SSLSocket getSSLSocket() throws Exception{ 
    SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault(); 
    SSLSocket socket = (SSLSocket) factory.createSocket(connectionProperties.getHost(), connectionProperties.getPort()); 
    socket.setSoTimeout(90000); 

    return socket; 
} 

} 

我设置的主机和端口相应地,但没有我说的地方去在密钥库中寻找这个别名。所以...应用程序如何知道别名是什么?

+1

只是为了澄清“在我的keystore.jks中,我添加了运行远程服务器的公司发给我的私钥”并未发生。没有人会给你他们的私钥。你有什么是他们的公钥。 – 2012-04-11 01:23:08

+0

可能是...... keytool -list等......说这是一个私钥。 – Preston 2012-04-11 02:50:14

+0

如果确实是来自别处的私钥,则应立即调用安全性。由于不止一方知道私钥,所以私钥是毫无价值的。它不能用来唯一标识您的意图,并且所得到的事务在您的部分是不可批准的,所以它不会为远程服务器公司提供任何级别的安全性。您应该生成您自己的私钥和证书,并获取由CA签名的证书。 – EJP 2012-04-11 06:16:34

回答

0

解释双向ssl和爵士乐正在耗尽。我会尽力找到一个有用的链接。但是,对于部署在glassfish中的应用程序作为客户端通过SSL与服务器通信(例如通过SSL端口配置的LDAP服务器领域)进行通信的情况,为了您的信息,它将使用glassfish服务器的身份证书(来自其密钥库)作为其客户端证书。

但是,如果您明确地编写了SSL握手代码,则客户端应用程序负责选择密钥库并将证书作为握手的一部分进行呈现。

由于它在以前版本的Glassfish中工作,相同的代码应该适合您。您的问题很可能与配置有关。我有点困惑,你已经添加到服务器的keystore.jks一般其他服务器的证书添加到信任存储什么cacerts.jks

一个useful glassfish ssl example

SSL Socket client example

Example of choosing keystore in client.

+0

感谢您的例子。这些都没有显示应用程序如何找到别名。 – Preston 2012-04-11 15:41:50

0

有两种方法完成此操作 第一个:

从admi打开以下路径n控制台页面。

  • 配置
  • 群集/实例配置。
  • JVM设置
  • JVM选项
  • ,你会发现这条线一些地方在项目列表 -Dcom.sun.enterprise.security.httpsOutboundKeyAlias =为s1as

更改为s1as价值的要使用的证书别名。其他选项是将系统属性添加到您的代码中 System.setProperty(“com.sun.enterprise.security.httpsOutboundKeyAlias”,“your certificate alias”);

相关问题