我的客户端通过以下方式实现双向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);
    ...

我尝试通过javax.servlet.http.HttpServletRequest.getAttribute(“javax.servlet.request.X509Certificate”)从客户端检索服务器端的X.509证书,如下所述:http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletRequest.html#getAttribute%28java.lang.String%29.

我通过以下方式在服务器端获得HttpServletRequest:
HttpServletRequest servletRequest =(HttpServletRequest)msg.get(“HTTP.REQUEST”);通过我的拦截器类的handleMessage(Message msg)方法,它扩展了AbstractPhaseInterceptor< Message>.我必须在服务器端使用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_suite,但未设置密钥javax.servlet.request.X509Certificate .我正在使用Jetty Server 8.1.15,Apache CXF 2.7.x和JAX-RS 1.1.1.我尝试通过http://cxf.apache.org/docs/jetty-configuration.html和http://cxf.apache.org/docs/secure-jax-rs-services.html#SecureJAX-RSServices-Configuringendpoints进行Jetty配置,但属性仍未设置.

解决方法

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

对于可能在某个时间加入同一问题的所有其他人(这似乎是关于IBM的常见SSL配置问题,如下面第一个链接中所述),以下来源对我有很大帮助:
– http://www-01.ibm.com/support/docview.wss?uid=swg27038122&aid=1
(第16和17页)
– http://java.dzone.com/articles/how-analyze-java-ssl-errors(显示握手应该看)
– need help Debugging SSL handshake in tomcat(显示如何在Java中调试ssl错误)
– https://thomas-leister.de/internet/eigene-openssl-certificate-authority-ca-erstellen-und-zertifikate-signieren/(德语,但也许您可以找到相当于英语的英语)
– https://access.redhat.com/site/documentation/en-US/Red_Hat_JBoss_Fuse/6.0/html/Web_Services_Security_Guide/files/i382674.html(德国文章的延续)
– http://www.webfarmr.eu/2010/04/import-pkcs12-private-keys-into-jks-keystores-using-java-keytool/(如何创建密钥库和信任库)

创建自己的CA,服务器和客户端证书后,在为两者创建密钥库和信任库之后,该属性现在已设置: – Here15_1:javax.servlet.request.X509Certificate – Here16_2:class [Ljava.security.cert.X509Certificate; – Here16_3:[Ljava.security.cert.X509Certificate; @ 43b8f002服务器代码现在也能够提取客户端证书信息.

未设置getAttribute(“javax.servlet.request.X509Certificate”)(Spring,CXF,Jetty,JAX-RSv1.1)的更多相关文章

  1. SpringBoot如何切换成其它的嵌入式Servlet容器(Jetty和Undertow)

    这篇文章主要介绍了SpringBoot如何切换成其它的嵌入式Servlet容器(Jetty和Undertow),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  2. JAX-RS获取打开连接时间

    我正在使用JAX-RS进行HTTP请求。是否有方法获取打开连接所需的时间?打开连接和读取响应似乎对调用函数是隐藏的。

  3. ubuntu-10.04 – 配置Jetty以接受来自Ubuntu Lucid上所有主机的连接

    你需要:–听其他主持人所以最小的/etc/default/jetty文件包括:–

  4. ubuntu – Jetty 9支持TLS_FALLBACK_SCSV

    我需要更多配置Jetty吗?我需要修改一些特殊的Ubuntu配置吗?它还没有在Java中实现–但它计划用于Java9.您可以按照#JDK-8061798进行更新.

  5. ubuntu – nginx正在运行但没有服务?

    有没有办法找到Nginx使用的conf文件?编辑3根据Paziscomment我添加了root但不确定它应该在哪里或它应该是什么.我补充了一些建议.哪一个是正确的?

  6. CentOS下安装neo4j

    本文记录一下在CentOS6.7上,安装neo4j图数据库,本文安装的版本为neo4j-community-2.3.9-unix.tar.gz。

  7. CentOS 安装 SonaType Nexus Maven Repository以及旧库迁移

    转载:http://www.cnblogs.com/zhangqingsh/archive/2013/03/14/2959301.htmlCentOS下安装SonaTypeNexus:1.1下载SonaTYpeNexus:cd/usr/local/srcwgethttp://download.sonatype.com/nexus/oss/nexus-2.3.1-01-bundle.tar.gz1.

  8. windows – Jetty Maven插件忽略了自定义webdefault.xml

    我试图通过在webdefault.xml中将useFileMappedBuffer设置为false的技术来绕过commonissueofJettylockingstaticfilesonWindows.不幸的是,每次Jetty都没有拿起我自定义的webdefault.xml.我使用ApacheMaven3.0.2.我试过使用maven-jetty-plugin(v6.1.26)和jetty-mav

  9. Ubuntu 14.04.2下安装JDK并配置Jetty服务器

    e.export是把这三个变量导出为全局变量。f.大小写必须严格区分。·用文本编辑器打开用户目录下的.bashrc文件·在.bashrc文件末尾加入:setJAVA_HOME=/usr/share/jdk1.5.0_05exportJAVA_HOMEsetPATH=$JAVA_HOME/bin:$PATHexportPATHsetCLAsspATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexportCLAsspATH·重新登录③.直接在shell下

  10. 反向Ajax,第3部分:Web服务器和Socket.IO

    系列的第2部分说明了如何使用WebSocket来实现反向Ajax,一些代码例子被用来帮助说明WebSocket、FlashSocket、服务器端的约束、请求作用域服务以及暂停长生存期请求等。Socket.IO使用功能检测来确定连接是使用WebSocket、Ajax长轮询、Flash还是其他方式来建立。你也已经了解到了WebSocket的使用是服务器端依赖的,且并非所有的服务器都支持WebSocket。本节内容说明了如果适用的话,那么在Jetty、Tomcat和Grizzly等web服务器上是如何使用Com

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部