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

在Java中使用同一主机使用多个SSL客户端证书

司国源
2023-03-14
问题内容

在我的Java应用程序中,我需要使用SSL连接到同一主机,但每次都使用不同的证书。我需要使用其他证书的原因是,远程站点使用嵌入在证书中的用户ID属性来标识客户端。

这是一个在3个不同的操作系统上运行的服务器应用程序,我需要能够在不重新启动进程的情况下切换证书。


问题答案:

SSL可以向客户端提示要显示的证书。这 可能
使您可以使用一个具有多个身份的密钥存储,但是,不幸的是,大多数服务器不使用此提示功能。因此,如果您指定要用于每个连接的客户端证书,它将更加健壮。

这是SSLContext使用指定的身份和信任存储库设置示例代码。您可以重复这些步骤来创建多个上下文,每个要使用的客户端证书都需要一个上下文。每个人SSLContext都可能使用相同的信任库,但使用不同的身份库(包含要在该上下文中使用的单个客户端密钥条目)。

初始化一次所需的上下文,然后为每个连接重用正确的上下文。如果要建立多个连接,则可以利用SSL会话。

KeyManagerFactory kmf = 
  KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(identityStore, password);
TrustManagerFactory tmf =
  TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustStore);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

稍后,您可以直接创建套接字:

SSLSocketFactory factory = ctx.getSocketFactory();
Socket socket = factory.createSocket(host, port);

或者,如果您使用的是URL类,则可以指定SSLSocketFactory发出HTTPS请求时要使用的:

HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
con.setSSLSocketFactory(ctx.getSocketFactory());

Java 6有一些附加的API,可以根据您对密码套件等的喜好更轻松地配置套接字。



 类似资料:
  • 问题内容: 在Python中,我使用了这样的请求: 非常简单。 现在,我需要使用Apache HttpClient在Java中实现相同的功能。使用HttpClient进行请求时如何通过客户端证书? 问题答案: 我认为主要区别在于,在Java中,通常将密钥和证书放在密钥存储区中,然后从那里使用它。就像您提到的那样,人们经常希望为此使用单独的库,例如提到的httpcomponents客户端(就像您在p

  • 问题内容: 我们的系统与多个Web服务提供商进行通信。它们都是从单个Java客户端应用程序调用的。到目前为止,所有的Web服务都已通过SSL进行,但是没有一个使用客户端证书。好吧,一个新的合作伙伴正在改变这一现状。 使应用程序使用证书进行调用很容易;设置和将做到这一点。但是,现在的问题是如何制作它,使其仅在调用该特定Web服务时使用证书。我想更一般地说,我们希望能够选择要使用的客户端证书(如果有)

  • 我正在开发一个新的应用程序,该应用程序订阅JBoss 4上的两个主题并处理传入的消息。实际上,我正在使用两连接的持久订阅。 当我对持久订阅使用相同的ClientID时,容器将失败,错误如下: 是否有可能两个人对两个不同的目的地使用相同的clientId。是否有其他可以使用一个容器实例处理多个目的地? 我们尝试使用相同的clientId的原因是因为我们尝试用it订阅替换旧的应用程序。这个旧应用程序连

  • 我正在使用Netty4创建一个需要为多个客户端连接提供服务的服务器。ServerBootstrap由父线程组和工作线程组构成。根据ServerBootStrap上的文档。group()方法it “为父(接收器)和子(客户端)设置EventLoopGroup。这些EventLoopGroup用于处理SocketChannel和Channel的所有事件和IO。” 据我所知,ParentExecutor

  • 我通过SSL证书使用Axis实现调用Web服务。我使用keytool将证书添加到密钥库中。 它显示为"证书已添加到密钥库"。但是当我运行java程序时,我得到以下异常 故障代码:{http://schemas.xmlsoap.org/soap/envelope/}服务器。userException faultSubcode:faultString:javax。网ssl。SSLHandshakeEx

  • 问题内容: 我想使用jQuery函数对REST服务进行XHR调用。基本上,这可以正常工作,但是REST服务只能通过https访问,并且要求客户端使用客户端证书进行身份验证。 如何使用jQuery的功能发送客户端证书? 问题答案: 如果请求源和目标位于同一域中,并且使用https:保护AJAX和SSL,则可以进行ssl ajax调用。但是您不能在ajax调用中进行ssl认证。