gpt4 book ai didi

java - 如何请求需要客户端证书进行身份验证的 URL

转载 作者:太空狗 更新时间:2023-10-29 22:53:08 26 4
gpt4 key购买 nike

我需要从使用客户端证书进行身份验证的服务器请求 URL,但找不到为我的应用程序执行此操作的方法。

我的问题是,我正在使用的 Java 客户端具有本地可用的证书文件,但由于将在其上运行的 PC 的限制,无法将证书安装在 keystore 中。

简而言之,我只想能够明确指定用于我需要检索的 URL 的证书。

有什么建议吗?

最佳答案

不清楚您所说的限制是什么。更具体地说,我不确定您认为本地证书文件和 keystore 之间的区别是什么。大多数 keystore 都是基于文件的,因此您可以通过这种方式直接加载文件,而无需安装过程。这些限制是否与 JVM 本身使用的安全策略相关(这可能会阻止您实例化 KeyStore s)?

首先,客户端需要的不仅仅是证书,还有它的私钥。通常,人们在此上下文中使用“证书”一词来表示两者,但您确实需要确保您的文件不包含没有私钥的证书。通常,您会在 PKCS#12 文件 (.p12/.pfx) 中找到私钥 + 证书的组合,很多工具都以这种格式导入/导出;它也是 Sun JVM 原生支持的 keystore 格式(类型 PKCS12 )。

要使其正常工作,您需要配置与适当的 keystore 建立连接的内容。 SSL/TLS 客户端证书身份验证始终由服务器启动:如果客户端有一个证书(并且想要使用它),则客户端会使用证书进行响应。要为特定的 URL 配置它,您需要找出是什么建立了连接(可能是 HttpsURLConnection )并将其设置在那里(除非它是在默认上下文中设置的——即使它是在默认上下文中设置的,它也会仅用于请求它的服务器)。

要在 JVM 上全局设置 keystore (这可能是您的限制阻止您做的),您可以设置 javax.net.ssl.keyStore javax.net.ssl.keyStorePassword (和相关的)系统属性。 (因为密码可能是可见的,所以最好不要在命令行上这样做)。

这些系统属性用于配置默认 SSLContext (通常透明地由库或类使用,例如 HttpsURLConnection 来构建 SSLSocketFactory,然后是 SSLSocket,使用这些属性进行初始化)。

你可以 build SSLContext从您的文件中专门用于该连接。 SSLContext实际上是 SSLSocketFactory 的工厂或 SSLEngine , 你可以设置 SSLSocketFactory在给定的 HttpsURLConnection .

以下将构建一个 SSLContext使用“/path/to/file.p12”作为您的 keystore (即带有您的私钥和您要发送的证书的 keystore )并保留信任库的默认设置(您需要捕获异常对于输入流也是如此)。

KeyStore ks = KeyStore.getInstance("PKCS12");
FileInputStream fis = new FileInputStream("/path/to/file.p12");
ks.load(fis, "password".toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, "password".toCharArray());
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(kmf.getKeyManagers(), null, null);

从那里你可以像这样配置连接(如果这是你正在使用的):

HttpURLConnection connection = (HttpURLConnection) url.openConnection();
if (connection instanceof HttpsURLConnection) {
((HttpsURLConnection)connection)
.setSSLSocketFactory(sc.getSocketFactory());
}

有些图书馆会让你传递 SSLContext直接(Apache HTTP Client 4 支持,这可以通过 Apache HTTP Client 3 using this 完成。)

请注意,您不需要在加载 keystore 时将密码作为直接参数提供,您也可以使用回调(从 GUI 的角度来看可能更好)。

也许 this library可以帮助(但不是必需的):你可以使用 KeystoreLoader 为它的助手做这件事。还有SSLContextFactories在此库中(但您可能不需要任何包装器,因为它们往往用于自定义信任管理或 key 选择)。

这通常是使用客户端证书的配置方式,但如果不澄清您的限制到底是什么(以及您正在使用哪些库),就很难提供更多详细信息。

关于java - 如何请求需要客户端证书进行身份验证的 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3734613/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com