我需要从使用客户端证书进行身份验证的服务器请求URL,但是找不到为我的应用程序执行此操作的方法。
我的问题是我正在使用的Java客户端具有本地可用的证书文件,但是由于PC的限制,它将在其上运行,因此无法在密钥库中安装证书。
简而言之,我只是希望能够明确指定要用于我要检索的URL的证书。
有什么建议?
目前尚不清楚您所讨论的限制是什么。更具体地说,我不确定您认为本地证书文件和密钥库之间的区别是什么。大多数密钥库都是基于文件的,因此您可以直接以这种方式加载文件,而无需安装过程。这些限制是否与JVM本身使用的安全策略有关(这可能会阻止您实例化KeyStore
s)?
首先,它不仅是客户端所需的证书,还包括其私钥。人们经常在此上下文中使用“证书”一词来表示两者,但是您需要确保您的文件不包含没有私钥的证书。通常,您会在PKCS#12文件(.p12
/ .pfx)中找到私钥+证书的组合,很多工具都以这种格式导入/导出;它也是Sun JVM(类型PKCS12
)本地支持的密钥库格式。
要使此工作有效,您需要配置与适当的密钥库建立连接的方式。SSL /
TLS客户端证书身份验证始终由服务器启动:如果客户端拥有证书(并希望使用该证书),则客户端将使用证书进行响应。要为特定的URL配置它,您需要找出是什么原因造成的连接(可能是HttpsURLConnection
)并在那里进行设置(除非它是在默认上下文中设置的-
即使它是在默认上下文中设置的,也仅会使用它)对于请求它的服务器)。
要在JVM上全局设置密钥库(这可能是您的限制阻止您执行的操作),可以设置javax.net.ssl.keyStore
javax.net.ssl.keyStorePassword
(和相关的)系统属性。(因为密码是可见的,所以最好不要在命令行上输入密码)。
这些系统属性用于配置默认属性SSLContext
(通常透明地由库或类使用,例如HttpsURLConnection
用于构建SSLSocketFactory
,然后SSLSocket
用这些属性初始化)。
您可以SSLContext
从文件中构建专门用于该连接的文件。该SSLContext
实际上是对一个工厂SSLSocketFactory
或者SSLEngine
,你可以设置SSLSocketFactory
在给定的HttpsURLConnection
。
下面的代码将SSLContext
使用“
/path/to/file.p12”作为密钥库(这是一个具有私钥和要发送的证书的密钥库),并保留信任库的默认设置(您可以还需要捕获输入流的异常)。
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可以使用this来完成。)
请注意,加载密钥库时不需要提供密码作为直接参数,还可以使用回调(从GUI的角度来看可能更好)。
也许这个库可以提供帮助(但不是必须的):您可以使用的KeystoreLoader
帮助器来实现这一点。该库中也有SSLContextFactories(但是您可能不需要任何包装,因为它们通常用于自定义信任管理或密钥选择)。
通常,这是使用客户端证书进行配置的方式,但是如果不弄清您的限制到底是什么(以及您使用的是哪个库),则很难提供更多详细信息。
我不熟悉SSL和证书。我一直在做关于客户端证书认证的研究。我看过这个和wiki。 因此,如果我必须为我的B2B REST服务实现客户端证书身份验证解决方案,我应该执行以下操作 要求客户端生成自己的私钥,并为其公钥生成证书(CA 颁发?)。通过电子邮件或 USB 闪存盘发送该证书。 在服务器端将客户端的公共证书导入信任存储区并启用客户端身份验证 在握手期间,客户端会出示其证书并进行身份验证,因为服务
问题内容: 我需要导入证书,以便向Spring Boot应用程序中的外部服务发出http请求。 我该如何设置Spring Boot来做到这一点? 那里有很多信息,但我发现所有这些都令人困惑。似乎我可能只需要创建类似“ truststore.jks”密钥库的内容并导入正确的证书,然后将一些条目添加到我的application.properties中即可。 问题答案: 打开您的终端或 回答所有问题。在
问题内容: 我想使用带有身份验证的其余api。我正在尝试包括标头,但没有得到任何回应。它抛出的输出通常是在没有身份验证时抛出的。谁能建议我一些解决方案。下面是我的代码 问题答案: 该请求模块将使您的生活更轻松。现在,它包括“ 基本身份验证”作为选项,因此您不必自己构建标题。 安装请求执行
问题内容: 设置请求客户端身份验证的嵌入式Jetty服务器非常容易:只需添加以下语句即可:SslContextFactory.setNeedClientAuth(true); 配置服务器时访问ssl上下文。在服务器的信任库中具有其证书的任何客户端都将能够建立与服务器的TLS连接。 但是,我需要知道所有可能的受信任客户端中的哪个客户端当前正在发出请求;换句话说,我需要知道在此连接中使用的客户端证书,
我有我的应用程序在本地工作正常,但当我试图连接到远程服务器我得到这个错误:CLIENT_PLUGIN_AUTH是必需的。
授权服务器为进行客户端身份验证的目的,为Web应用客户端创建客户端凭据。授权服务器被鼓励考虑比客户端密码更强的客户端身份验证手段。Web应用程序客户端必须确保客户端密码和其他客户端凭据的机密性。 授权不得向本地应用程序或基于用户代理的应用客户端颁发客户端密码或其他客户端凭据用于客户端验证目的。授权服务器可以颁发客户端密码或其他凭据给专门的设备上特定安装的本地应用程序客户端。 当客户端身份验证不可用