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;
}

}

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

4

2 回答 2

0

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

但是,如果您明确编码 SSL 握手,则客户端应用程序负责选择密钥库,并将证书作为握手的一部分提供。

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

一个有用的 glassfish ssl 示例

SSL 套接字客户端示例

在客户端选择密钥库的示例。

于 2012-04-11T02:33:54.593 回答
0

有两种方法可以做到这一点第一种:

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

  • 配置
  • 您的集群/实例配置。
  • jvm设置
  • jvm 选项
  • 您会在项目列表中的某个位置找到此行 -Dcom.sun.enterprise.security.httpsOutboundKeyAlias=s1as

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

另一种选择是将系统属性添加到您的代码 System.setProperty("com.sun.enterprise.security.httpsOutboundKeyAlias", "your certificate alias");

于 2014-05-06T03:53:15.093 回答