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

Java 我的应用程序如何知道要使用的私钥,java,ssl,glassfish,Java,Ssl,Glassfish,我有一个在GlassFish 3.x上运行的应用程序。它通过https与远程服务器通信。在我的cacerts文件中,我添加了服务器证书。在我的keystore.jks中,我添加了运行远程服务器的公司发给我的私钥。这在GlassFish2.x上非常有效,但是在3.x上,远程服务器一直抱怨我的密钥无效 如果从密钥库中删除密钥,则会出现相同的错误。这就好像它甚至没有加载密钥,这让我想知道应用程序/容器如何知道我需要哪个密钥 我的连接代码如下所示: public class SSLSocket { p

我有一个在GlassFish 3.x上运行的应用程序。它通过https与远程服务器通信。在我的cacerts文件中,我添加了服务器证书。在我的keystore.jks中,我添加了运行远程服务器的公司发给我的私钥。这在GlassFish2.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;
}

}

我相应地设置了主机和端口,但我不想说去哪里在密钥库中查找这个别名。所以应用程序如何知道要获取哪个别名?

解释双向ssl和所有jazz让人筋疲力尽。我将尝试找到一个有用的链接。但是,当部署在glassfish中的应用程序充当通过SSL(例如通过SSL端口配置的LDAP服务器域)与服务器通信的客户端时,它将使用glassfish服务器的身份证书(来自其密钥库)作为其客户端证书,供您参考

但是,如果您显式地为SSL握手编码,则客户端应用程序负责选择密钥库,并将证书作为握手的一部分呈现

因为它在Glassfish的早期版本中工作,所以相同的代码应该适用于您。您的问题很可能与配置有关。我对您添加到服务器的
keystore.jks
中的内容感到有点困惑,通常其他服务器的证书会添加到信任存储
cacerts.jks

A

一个


有两种方法可以实现这一点 第一:

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

  • 配置
  • 您的群集/实例配置
  • jvm设置
  • jvm选项
  • 您将在项目列表中的某些位置找到这一行 -Dcom.sun.enterprise.security.httpsOutboundKeyAlias=s1as
将s1as值更改为要使用的证书别名

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

只是为了澄清“在mykeystore.jks中,我添加了运行远程服务器的公司发给我的私钥”并没有发生。没有人会给你他们的私钥。你拥有的是他们的公钥。可能是。。。键工具-列表等。。。说它是私钥。如果它真的是来自其他地方的私钥,你应该立即呼叫安全部门。由于不止一方知道该私钥,因此该私钥毫无价值。它不能按预期唯一地标识您,并且生成的事务对您来说是不可否认的,因此它根本不能为远程服务器公司提供任何级别的安全性。您应该生成自己的私钥和证书,并获得由CA签名的证书。感谢您提供的示例。这些都没有显示应用程序如何查找别名。