Java:从密钥库文件中确定密钥库的类型

Posted

技术标签:

【中文标题】Java:从密钥库文件中确定密钥库的类型【英文标题】:Java: Determine type of KeyStore from Keystore file 【发布时间】:2019-05-10 23:05:12 【问题描述】:

所以我有一个应用程序,允许用户使用 HTTPS 配置服务器。服务器使用 Undertow。要将 HTTPS 处理程序添加到 Undertow,我需要调用 Keystore.getInstance("JKS") 函数,该函数返回基于提供程序的实现。 Java 原生只支持 3 个提供程序(JKS、PKCS12 和 JCEKS),但据我了解,您可以添加自己的密钥库实现提供程序。

所以我的问题是,仅给定密钥库文件,是否可以确定它是什么类型的密钥库?我不能依赖文件扩展名,因为 PKCS12 密钥库也可以存储在 .p12 文件扩展名中。是否可以通过编程方式获取此值,以便将其传递给 Keystore.getInstance() 还是只需要从用户那里获取该输入?

【问题讨论】:

Keystore.getInstance("JKS") function which returns the implementation based on the provider:不,它没有。它返回 JKS 类型的 KeyStore。如果这是您需要进行的方法调用,那么您没有问题。如果确实有问题,则需要将参数设为变量。我不会担心用户提供自己的提供商。 @user207421 我的意思是作为一个例子。我要么必须从文件中找出密钥库的类型并调用 getInstance 方法,要么将其作为输入公开给用户。最好是第一个。 究竟是什么例子?一般来说,你不能做第一个,对吗?您只需要尝试所有已知的提供商,或者让用户告诉您。 【参考方案1】:

目前 WildFly 正在使用 Elytron 项目进行此类功能。你可以看看[1]。

一些密钥库可以通过格式模式来区分。但是我认为在您的情况下,最简单的方法是尝试一一加载 Keystore.getInstance("PKCS12")、Keystore.getInstance("JKS")、Keystore.getInstance("JCEKS") 并查看哪一个通过。

我也认为用户可以提供密钥库类型。

[1]https://issues.jboss.org/browse/WFCORE-4058

【讨论】:

如果只有3种的话,一个一个加载看看能不能用。还有其他提供程序以及自定义密钥库实现。所以这个解决方案不能涵盖所有可能的实现。

以上是关于Java:从密钥库文件中确定密钥库的类型的主要内容,如果未能解决你的问题,请参考以下文章

IBM MobileFirst 7.1 中生成密钥库的位置

jetty SSL如何与java密钥库和多个别名一起使用

markdown 密钥库的配置文件。

markdown 密钥库的配置文件。

密钥库类型:使用哪一种?

如何从 Java 密钥库创建 PFX 文件?