JAVA通过servlet读IE端的证书即为什么老是得到null值的最终解决方案

更详细的内容参考我的另一篇:

网上交易安全之九阳神功-使用JAVA调用U盾进行客户认证的total solution

需要解决的问题:

1.      Servlet如何读客户端的认证

很多网上的朋友都说

“我用X509Certificate[]certs = (X509Certificate[]) request                                                                    .getAttribute("javax.servlet.request.X509Certificate");

得到的证书是个null”

几乎没有答案,这边给出解决方案

a.      客户端访问这个servlet,客户端和放这个servlet的j2eeapp必须实现“双向认证”

b.     J2ee app端(假设我们这边用TOMCAT实现),在实现双向认证后,其实还不够,需要加一个参数,很多人可能没注意到这个参数,下面给出方案:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"

 enableLookups="false"disableUploadTimeout="true"

  useURIValidationHack="false"

  scheme="https"secure="true"

  keystoreFile="D:/tomcat/conf/shnlap93.jks"keystorePass="xxxxxxx"

  truststoreFile="D:/tomcat/conf/truststore.jks"truststorePass="aaaaaa"

   truststoreType="JKS"

   clientAuth="true"sslProtocol="TLS" />

看到上面那个标红的地方了吧?就是这个参数没加,因此很多人就算启用了双向认证,你的servlet在拿ie端的证书时还是会得到null值

2.      好,现在客户端的公钥拿到了,怎么拿私钥?

前面说了,我们先做一个简单的,写死的,就是把客户端的私钥放在我们的网站的某个目录下,然后用程序去读出来。

因此我们的过程如下:

a.      客户端通过IE输入他的交易密码

b.     然后点“提交”按钮,POST到我们的这个servlet

c.      Servlet先读放在网站某个目录下的该客户的私钥,loadPrivateKey后用私钥对客户提交的form里的密码进行签名。

d.     Servlet获得客户端IE里的证书,把公钥拿出来,然后用公钥对签完名的byte[]进行verify, 得到true代表认签成功,false认签失败,下面是我们的servlet

此处需要注意的是我们用openssl签出的private key是不能直接被java所访问的,因为它含用:

#begin certificate

#end certificate

这样的东西,而JAVA只认#begin…#end当中的那块东西,怎么办:

使用下面这条使用把openssl签出的key转成我们java可以认的rsa的KEY

opensslpkcs8 -topk8 -inform PEM -outform DER -in shnlap93.key -out pkcs8_der.key –nocrypt

下面是我们的servlet的核心片段, 拿客户端IE的公钥,拿网站某个目录摆放的私钥,然后调用标准的JAVA电子签名

private PublicKey getPubKeyFromIE(HttpServletRequest request,

HttpServletResponse response) throws ServletException, IOException {

System.out.println("...security receive done..." + request.getScheme());

String issue, after, before, subject;

String serialno, signalg;

int version;

String cipherSuite = "";

PublicKey pk = null;

try {

cipherSuite = (String) request

                                .getAttribute("javax.servlet.request.cipher_suite");

                System.out.println("cipherSuite=====" + cipherSuite);

// response.setContentType("text/plain");

// FileInputStream fis = new FileInputStream("d://paramita.cer ");

PrintWriter out = response.getWriter();

if (cipherSuite != null) {

                X509Certificate[] certs = (X509Certificate[]) request                                        .getAttribute("javax.servlet.request.X509Certificate");

                /* ibm http server us followings */

                // X509Certificate[] certs = (X509Certificate[]) request

                                // .getAttribute("javax.net.ssl.peer_certificates");

 

if (certs != null) {

                if (certs.length > 0) {

                                X509Certificate t = certs[0];

                                pk = t.getPublicKey();

                }

} else {

                if ("https".equals(request.getScheme())) {

                                out.println("This was an HTTPS request, "

                                                + "but no client certificate is available");

                } else {

                                out.println("This was not an HTTPS request, "

                                + "so no client certificate is available");

                }

}

}

return pk;

} catch (Exception e) {

                throw new ServletException(e);

}

                }

时间: 2024-10-18 21:38:49

JAVA通过servlet读IE端的证书即为什么老是得到null值的最终解决方案的相关文章

java ssl https 连接详解 生成证书

我们先来了解一下什么理HTTPS 1. HTTPS概念         1)简介            HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL.这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面.  

java基于servlet实现文件上传功能解析_java

最近项目需要做一个文件上传功能,做完了分享下,顺带当做笔记. 上传功能用后台用java实现,前端主要是js的ajax实现.后台还加入定时删除临时文件. 效果如图 首先是上传功能的主要类,下面是代码 package util.upload; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Iterat

如何使用Java、Servlet创建二维码

归功于智能手机,QR码逐渐成为主流,它们正变得越来越有用.从候车亭.产品包装.家装卖场.汽车到很多网站,都在自己的网页集成QR码,让人们快速找到它们.随着智能手机的用户量日益增长,二维码的使用正在呈指数上升. 让我们来看看QR码的简要概述,以及如何在Java中生成它们. QR码介绍 QR码(Quick Response 快速响应码)是矩阵条形码(或二维码)的一种类型,最先为于汽车行业而设计.得益于其快速读取性和较大的存储容量,QR码开始在汽车行业以外流行.图案是在白色背景上由有序排列的黑色方块组

java多线程的读写锁问题

问题描述 java多线程的读写锁问题 package cn.fans.chapter2.six; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** @author fcs @date 2015-4-12 描述:使用读写锁实现同步访问 说明:使用ReadWriteLock接口. */ public class PricesInf

java sql server jsp-JSP java SQL servlet实现页面表格生成Excel文件

问题描述 JSP java SQL servlet实现页面表格生成Excel文件 使用JSP java SQL server做了个小系统,现在想实将现通过查询功能生成的表,通过页面上的按钮触发,生成Excel文件.求大神指导! 解决方案 http://271788203.iteye.com/blog/491052

用java开发servlet都用加什么包

问题描述 用java开发servlet都用加什么包 如题,好像是用到了一些jar包和什么api包,具体都用哪些,详细的说一下 解决方案 下一个tomcat就可以了,, 解决方案二: 一般会默认引用一些基础包,其他的自己用到什么包,再加什么包,一般编译器也会提示你,然后自动加入对应包 解决方案三: 你有tocate的安装包么?在tomcat的lib文件下,有个servlet-api.jar包,就是Servlet需要的jar包. 解决方案四: 不需要引入什么第三方包吧,只要在写类的时候继承servl

java中Servlet类运行于哪里,如何运行一个Servlet类接受和发送数据

问题描述 java中Servlet类运行于哪里,如何运行一个Servlet类接受和发送数据 java中Servlet类运行于哪里,如何运行一个Servlet类接受和发送数据 解决方案 servlet运行在容器中,如tomcat等等,你可以创建一个javaweb工程,打包成war包之后,部署到tomcat,就可以使用servlet来做请求和响应了. 请关注 : http://git.oschina.net/wangkang/llsfw 希望能够帮到你.

Java SOS 7.35发布 一套Java的Servlet集合

Java SOS是一套Java的Servlet集合,例如日程.表单处理.聊天的,可以用来快速的搭建网站.是由一组用于快速建站可配置的Java servlets所组成.包括Forums.Chat.Calendar.HttpProxy等servlets. Java SOS 7.35对代码库进行了更新,增加了新的组件. 下载地址:http://www.servletsuite.com/servlets/sos_735.zip

https部署-tomcat部署https后,pc端访问证书是好的,为什么手机浏览器访问提示安全证书有问题

问题描述 tomcat部署https后,pc端访问证书是好的,为什么手机浏览器访问提示安全证书有问题 我server.xml的配置如下: maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="D:\apache-tomcat-8.0.28\keystore\y