Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未设置getAttribute(“javax.servlet.request.X509Certificate”(Spring、CXF、Jetty、JAX-RSv1.1)_Java_Ssl_Httpclient - Fatal编程技术网

未设置getAttribute(“javax.servlet.request.X509Certificate”(Spring、CXF、Jetty、JAX-RSv1.1)

未设置getAttribute(“javax.servlet.request.X509Certificate”(Spring、CXF、Jetty、JAX-RSv1.1),java,ssl,httpclient,Java,Ssl,Httpclient,我的客户端通过以下方式实现双向SSL: private final static String KEYSTORE = "/security/client.jks"; private final static String KEYSTORE_PASSWORD = "secret"; private final static String KEYSTORE_TYPE = "JKS"; private final static String TRUSTSTORE = "/sec

我的客户端通过以下方式实现双向SSL:

private final static String KEYSTORE = "/security/client.jks"; private final static String KEYSTORE_PASSWORD = "secret"; private final static String KEYSTORE_TYPE = "JKS"; private final static String TRUSTSTORE = "/security/certificates.jks"; private final static String TRUSTSTORE_PASSWORD = "secret"; private final static String TRUSTSTORE_TYPE = "JKS"; ... KeyStore keystore = KeyStore.getInstance(KEYSTORE_TYPE); FileInputStream keystoreInput = new FileInputStream(new File(KEYSTORE)); keystore.load(keystoreInput, KEYSTORE_PASSWORD.toCharArray()); KeyStore truststore = KeyStore.getInstance(TRUSTSTORE_TYPE); FileInputStream truststoreIs = new FileInputStream(new File(TRUSTSTORE)); truststore.load(truststoreIs, TRUSTSTORE_PASSWORD.toCharArray()); SSLSocketFactory socketFactory = new SSLSocketFactory(keystore, KEYSTORE_PASSWORD, truststore); Scheme scheme = new Scheme("https", 8543, socketFactory); SchemeRegistry registry = new SchemeRegistry(); registry.register(scheme); ClientConnectionManager ccm = new PoolingClientConnectionManager(registry); httpclient = new DefaultHttpClient(ccm); HttpResponse response = null; HttpGet httpget = new HttpGet("https://mylocalhost.com:8543/test"); response = httpclient.execute(httpget); ... 私有最终静态字符串KEYSTORE=“/security/client.jks”; 私有最终静态字符串KEYSTORE\u PASSWORD=“secret”; 私有最终静态字符串密钥库_TYPE=“JKS”; 私有最终静态字符串TRUSTSTORE=“/security/certificates.jks”; 私有最终静态字符串TRUSTSTORE\u PASSWORD=“secret”; 私有最终静态字符串TRUSTSTORE_TYPE=“JKS”; ... KeyStore KeyStore=KeyStore.getInstance(KeyStore\u类型); FileInputStream keystoreInput=新FileInputStream(新文件(密钥库)); load(keystoreInput,keystore_PASSWORD.toCharArray()); KeyStore truststore=KeyStore.getInstance(信任库类型); FileInputStream truststoreIs=新FileInputStream(新文件(信任库)); load(truststoreIs,truststore_PASSWORD.toCharArray()); SSLSocketFactory socketFactory=新的SSLSocketFactory(密钥库、密钥库\密码、信任库); 方案=新方案(“https”,8543,socketFactory); SchemeRegistry registry=新SchemeRegistry(); 注册处.注册(计划); ClientConnectionManager ccm=新池客户端连接管理器(注册表); httpclient=新的默认httpclient(ccm); HttpResponse响应=null; HttpGet HttpGet=新的HttpGet(“https://mylocalhost.com:8543/test"); response=httpclient.execute(httpget); ... 我尝试通过javax.servlet.http.HttpServletRequest.getAttribute(“javax.servlet.request.X509Certificate”)从客户端检索服务器端的X.509证书,如下所述:

我通过:
HttpServletRequest servletRequest=(HttpServletRequest)msg.get(“HTTP.REQUEST”);通过我的拦截器类的handleMessage(Message msg)方法扩展AbstractPhaseInterceptor。我必须在服务器端使用JAX-RS 1.1.1,因为有些Maven依赖项不允许我更改,因此我不能使用ContainerRequestFilter(上支持JAX-RS 2.0)

我的问题是服务器端的getAttribute(“javax.servlet.request.X509Certificate”)总是返回null。如果我验证服务器和客户机之间的通信量,我可以看到来自服务器的证书被发送到客户机,即握手有效。但是我看不到客户端证书被发送到服务器,我认为这就是
getAttribute(“javax.servlet.request.X509Certificate”)
返回
null
的原因。有人知道我如何解决这个问题吗?我已经在客户端尝试了一些其他的实现,但是没有改变

我做错了什么?非常感谢


附加信息:我在服务器端看到设置了javax.servlet.request.ssl_session_id、javax.servlet.request.key_size和javax.servlet.request.cipher_套件,但没有设置密钥javax.servlet.request.X509Certificate。我使用的是Jetty服务器8.1.15、ApacheCXF2.7.x和JAX-RS1.1.1。我通过和尝试了Jetty配置,但属性仍然没有设置。

问题已经解决。这不是代码中的问题,只是证书问题。我的问题是,我也是X509证书的初学者,这是服务器和客户端之间的握手问题。在这种情况下,只有SSL/握手调试对我有所帮助。调试日志告诉服务器只接受来自特定CA的客户端证书,服务器在ServerHello消息期间在证书请求中告诉客户端所需的CA。由于客户端没有来自该CA的证书,因此它没有发送任何内容,并且客户端和服务器之间的连接随后关闭,结果是没有设置javax.servlet.request.X509Certificate

对于所有其他可能在某个时候遇到相同问题的人(这似乎是IBM常见的SSL配置问题,如下面第一个链接所述),以下来源对我帮助很大:
- (第16页和第17页)
-(显示为握手的外观)
-(显示如何在Java中调试ssl错误)
-(德语,但也许你能找到一个英语版)
-(继续德国文章)
-(如何创建密钥库和信任库)

在创建自己的CA、服务器和客户端证书以及为这两者创建密钥库和信任库之后,现在设置了属性:
-这里15_1:javax.servlet.request.X509Certificate
-此处16_2:class[Ljava.security.cert.X509Certificate;
-此处16_3:[Ljava.security.cert.X509Certificate;@43b8f002

服务器代码现在也可以提取客户端证书信息。

标题表明您要签署HTTPS请求,问题的内容看起来好像您正在尝试使用客户端证书。这是不同的事情。您好,Bruno,客户端应由服务器通过X.509证书进行身份验证。我想提取X.509证书,以便服务器可以将证书与其信任库进行比较。我还无法确定问题是在客户端还是服务器端。因此,我的问题可能有点不具体。请耐心等待,我是这里的初学者。非常感谢!我在上面添加了其他信息。备注:我应该补充这一点“javax.net.ssl.SSLHandshakeException:null cert chain”仅在服务器端的标志……和……设置为true时由服务器引发。如果needClientAuth设置为false,则客户端和服务器不会引发错误消息,因为此时不需要客户端证书。