当前位置: 首页 > 知识库问答 >
问题:

在连接之前,我如何告知SSLSocket的所需密钥条目的别名?

欧阳杰
2023-03-14

我在java密钥库中有两个证书/密钥对。这些关键条目的别名是“foo”和“bar”。

我的TLS客户端(java程序)使用密钥库。TLS客户端身份验证在连接打开期间完成。当TLS服务器从客户端请求证书时,客户端程序应该使用“foo”密钥条目。现在,客户端在连接握手期间向服务器发送错误的证书(“bar”)。

在连接之前,我如何告知SSLSocket的所需密钥条目的别名?

目前代码如下:

final SSLSocket ss = (SSLSocket)SSLSocketFactory.getDefault().createSocket(); 
ss.setEnabledProtocols( new String[] {"TLSv1"});
ss.connect( targetAddress ); 

共有1个答案

蔚楷
2023-03-14

默认的KeyManager将发送它发现的第一个与服务器请求的条件相匹配的证书,也就是说,它将发送它发现的第一个证书,它可以在服务器发送的一个CA名称上建立一个认证链在请求期间。

如果总是希望选择特定的别名,则需要实现自己的X509KeyManager,可能需要包装默认的管理器。这方面的工作应该是可行的(这段实际代码没有经过测试,可能有一些打字错误):

KeyStore keystore = ... // create and load your keystore.

KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keystore, password.toCharArray());

final X509KeyManager origKm = (X509KeyManager)kmf.getKeyManagers()[0];

X509KeyManager km = new X509KeyManager() {
    public String chooseClientAlias(String[] keyType, Principal[] issuers, Socket socket) {
        return "foo";
    }

    public X509Certificate[] getCertificateChain(String alias) {
        return origKm.getCertificateChain(alias);
    }

    // Delegate the rest of the methods from origKm too...
}

然后将其用于您的SSLContext

SSLContext sslContext = sslContext.getInstance("TLS");
sslContext.init(new KeyManager[] { km }, null, null);
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
 类似资料:
  • 问题内容: 我在Java密钥库中有两个证书/密钥对。这些键输入的别名为“ foo”和“ bar”。 我的TLS客户端(java程序)使用密钥库。TLS客户端身份验证在连接打开期间完成。TLS服务器从客户端请求证书时,客户端程序应使用“ foo”键输入。现在,客户端在连接握手期间向服务器发送了错误的证书(“条”)。 如何在连接之前告诉SSLSocket想要的密钥输入别名? 当前代码如下: 问题答案:

  • 问题内容: 我用别名为:的密钥对我的JWS应用程序MemorizEasy进行了签名。 我不记得为什么选择了这么长的别名。我怀疑这只是备忘录,但是在我的项目设置中,我有: 我现在正在更新应用程序,并使用maven将别名指定为: 但这行不通。尝试使用别名的另一个键是可行的。 那我可以更改密钥的别名吗?如果是这样,怎么办?否则,为什么Maven不接受我的别名? 问题答案: 可以使用以下命令在密钥库中复制

  • Windows 10上的Android Studio 无法加载密钥存储:无法识别的密钥存储项 我有一个现有的应用程序编译和签署。我已经创建了一个新版本。应用程序的唯一id是相同的(com.name.appname)。我想用现有的密钥对新版本进行签名。我有钥匙。我知道密码。我知道别名是正确的。我得到的结果是:无法加载密钥存储:无法识别的密钥存储条目 我在这里漏掉了什么?我需要编辑一些东西来让它知道我

  • 我正在Windows服务器x64上使用redis 2.6.12,配置为:maxmemory 45GB,内存策略易失性ttl(我所有的密钥都有ttl,但它们永远不会过期,因为过期时间是几年后)。每天有一次,在某个时间,我使用BGSAVE创建转储。内存大部分时间都是满的,因为我总是添加新的键,而最旧的键被逐出。 问题是,每隔一段时间,在数据库保存后,redis也会立即删除我的所有密钥,内存从45GB下

  • 对于一个非常简单的应用程序,它主要依赖于通过JSch建立的ssh连接,我想在登录屏幕上询问密码短语,尝试解密私钥,如果错误,返回登录窗口。 我找不到方法来发现 在尝试建立任何会话之前,是否有任何方法可以检测密码短语是否正确? 谢谢你。

  • 本文向大家介绍超级密钥和候选密钥之间的区别,包括了超级密钥和候选密钥之间的区别的使用技巧和注意事项,需要的朋友参考一下 超级键和候选键都用于从表中获取记录。这些键还用于创建表之间的关系。超级键和候选键都用于唯一标识表中的记录。两个键都可以具有空值。 以下是超级键和候选键之间的重要区别。 序号 键 超级钥匙 候选键 1 定义 超级键用于标识关系中的所有记录。 候选键是超级键的子集。 2 使用 所有超