我有一个在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;
}
}
我相应地设置了主机和端口,但是没有我说的去查找密钥库中的别名。那么......应用程序如何知道要抓取哪个别名?
答案 0 :(得分:0)
解释双向ssl和所有爵士乐都在用尽。我会尝试找到一个有用的链接。但是,对于您在glassfish中部署的应用程序充当客户端通过SSL与服务器通信(例如通过SSL端口配置的LDAP服务器领域)时的信息,它将使用glassfish服务器的身份证书(来自其密钥库)作为其客户端证书。
但是,如果您明确编写SSL握手编码,则客户端应用程序负责选择密钥库,并在握手过程中提供证书。
由于它在以前版本的Glassfish中运行,因此相同的代码应该适合您。您的问题很可能与配置有关。我对您添加到服务器keystore.jks
的内容感到有点困惑,通常将其他服务器的证书添加到信任存储区cacerts.jks
答案 1 :(得分:0)
有两种方法可以实现这一目标 第一个:
从管理控制台页面打开以下路径。
将s1as值更改为您要使用的证书别名。
另一个选项是为您的代码添加系统属性 System.setProperty(" com.sun.enterprise.security.httpsOutboundKeyAlias","您的证书别名");