如何在 Web 服务的 Java HttpsServer 实现中获取客户端证书?
Posted
技术标签:
【中文标题】如何在 Web 服务的 Java HttpsServer 实现中获取客户端证书?【英文标题】:How to get client certificate in a Java HttpsServer implementation for a webservice? 【发布时间】:2012-08-27 00:58:40 【问题描述】:我使用 Sun Ws 实现编写了一个 Web Service 服务器,并使用 HttpsServer 进行发布(TLS 相互身份验证)。
httpServer=HttpsServer.create(...);
ssl=SSLContext.getInstance("TLS");
...
ssl.init(keyFactory.getKeyManagers(),trustFactory.getTrustManagers(),new SecureRandom());
configurator=new HttpsConfigurator(ssl)
public void configure (HttpsParameters params)
SSLContext context;
SSLParameters sslparams;
context=getSSLContext();
sslparams=context.getDefaultSSLParameters();
sslparams.setNeedClientAuth(true);
params.setSSLParameters(sslparams);
;
((HttpsServer)httpServer).setHttpsConfigurator(configurator);
...
endPoint=getSunWsProvider().createEndPoint(...);
httpContext=httpServer.createContext(...);
endPoint.publish(httpContext);
httpServer.start();
...
一切正常。当Web Service的服务器端的实现由客户端执行时,我想知道哪个客户端在执行代码(管理权限)。知道每个客户端都有自己的证书,如何在 Web 服务调用之前获取用于 TLS 协商的客户端证书? (我更愿意根据客户端证书分析找到解决方案,而不是在每个 Web Service 调用中添加标识信息)。
感谢您的帮助。
【问题讨论】:
您的 Web 服务是否在“Sun Ws 实现”中实现为 Servlet?如果是这样,getUserPrincipal()
给出了什么? (在HttpServletRequest
。)
在web服务实现中... @Resource WebServcieContext wsctx;
@martijno 在 Web 服务实现中... WebServcieContext wsctx; MessageContext mctx=wsctx.getMessageContext(); mctx.get(MessageContext.SERVLET_CONTEXT) ... 为空 mctx.get(MessageContext.SERVLET_REQUEST) ... 为空且 wsctx.getUserPrincipal() 为空。
【参考方案1】:
在您的处理程序中,您得到的不是HttpExchange
实例,而是它的子类HttpsExchange
的实例,它具有额外的方法:
抽象SSLSessiongetSSLSession();
除其他外,SSLSession 公开对等身份
【讨论】:
【参考方案2】:getUserPrincipal()
为您提供httpservletrequest
中的证书。
【讨论】:
不,它没有。它给你一个校长。以上是关于如何在 Web 服务的 Java HttpsServer 实现中获取客户端证书?的主要内容,如果未能解决你的问题,请参考以下文章