我的应用程序如何知道要使用的私钥

时间:2012-04-10 23:06:58

标签: java ssl glassfish

我有一个在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;
}

}

我相应地设置了主机和端口,但是没有我说的去查找密钥库中的别名。那么......应用程序如何知道要抓取哪个别名?

2 个答案:

答案 0 :(得分:0)

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

但是,如果您明确编写SSL握手编码,则客户端应用程序负责选择密钥库,并在握手过程中提供证书。

由于它在以前版本的Glassfish中运行,因此相同的代码应该适合您。您的问题很可能与配置有关。我对您添加到服务器keystore.jks的内容感到有点困惑,通常将其他服务器的证书添加到信任存储区cacerts.jks

A useful glassfish ssl example

SSL Socket client example

Example of choosing keystore in client.

答案 1 :(得分:0)

有两种方法可以实现这一目标 第一个:

从管理控制台页面打开以下路径。

  • 构造
  • 您的群集/实例配置。
  • jvm settings
  • jvm options
  • 您会在项目列表中的某些位置找到此行 -Dcom.sun.enterprise.security.httpsOutboundKeyAlias =为s1as

将s1as值更改为您要使用的证书别名。

另一个选项是为您的代码添加系统属性 System.setProperty(" com.sun.enterprise.security.httpsOutboundKeyAlias","您的证书别名");