当前位置: 首页 > 面试题库 >

如何在连接之前告诉SSLSocket想要的密钥输入别名?

淳于慎之
2023-03-14
问题内容

我在Java密钥库中有两个证书/密钥对。这些键输入的别名为“ foo”和“ bar”。

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

如何在连接之前告诉SSLSocket想要的密钥输入别名?

当前代码如下:

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

问题答案:

默认值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”密钥条目。现在,客户端在连接握手期间向服务器发送错误的证书(“bar”)。 在连接之前,我如何告知SSLSocket的所需密钥条目的别名? 目前代码如下:

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

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

  • 下面的代码片段是从JoinedStreams的javadoc复制的 这两个流仅基于一个键(通过< code>t =计算)进行连接 我会问我如何基于多个键进行连接,例如,one.a = two.a和

  • 我正在做一个问题,其中我为拼字游戏创建了各种功能。首先,我想让用户输入或或开始新游戏/重放最后一手牌/结束游戏。 一旦游戏开始,我想让用户输入或来让用户或计算机玩。 我陷入了问题的最后一部分。 我的代码: 如果内部循环的选择不是u或c,它应该反复通知并询问,直到u或c是输入。但它是在初审后从那个循环中出来的。 理想输出: 我的输出: 问题是,当用户在第二级输入无效命令时,我的代码开始询问第一级的问

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