`

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);

}

}


分享到:
评论

相关推荐

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

    标题和描述中提到的问题主要集中在Java通过Servlet读取IE浏览器客户端证书时总是获取到null值,以及如何解决这个问题。在Java Web开发中,有时需要实现客户端与服务器之间的双向身份认证,这时就需要用到SSL/TLS协议...

    基于java+Servlet的前后端分离编写的机票预订管理系统源码.zip

    基于java+Servlet的前后端分离编写的机票预订管理系统源码.zip基于java+Servlet的前后端分离编写的机票预订管理系统源码.zip基于java+Servlet的前后端分离编写的机票预订管理系统源码.zip基于java+Servlet的前后端...

    java web servlet实例

    Java Web Servlet实例是Java开发Web应用的基本组成部分,它在服务器端处理HTTP请求并生成响应。Servlet是Java EE(企业版)规范的一部分,用于扩展服务器的功能,尤其是与Web应用程序交互。这个实例是为初学者设计的...

    java_servlet_project

    Java Servlet是Java EE平台的一部分,它提供了一种服务器端编程模型,用于扩展Web服务器的功能。Servlet通过接收并响应来自Web客户端(如浏览器)的请求,动态生成HTML或其他类型的响应内容。 2. **Servlet生命...

    java+servlet项目.zip

    总体而言,这个"java+servlet项目"为初学者提供了一个全面的实践机会,涵盖了Web开发中的多个关键点,包括前后端交互、数据库操作、用户认证和查询优化等。通过学习和实践这个项目,开发者可以深入理解Java Web开发...

    java.servlet.jar

    Java Servlet API是Java Web开发中的核心组件,它定义了服务器端如何处理HTTP请求以及与客户端进行交互的标准。这个"java.servlet.jar"文件包含了Servlet API的所有类和接口,开发者可以使用这些组件来构建动态Web...

    java+servlet源码

    【Java + Servlet 源码解析】 在Java Web开发中,Servlet扮演着核心角色,它是一种服务器端的Java应用程序,负责处理HTTP请求并生成响应。本项目"ProjectManagementSys"是一个基于Java和Servlet的源码实例,展示了...

    Java+Servlet和JSP教程

    - **良好的可移植性**:由于 Servlet 是用 Java 编写的,并且遵循一套完善的标准(Servlet API),因此可以轻松地将为某个服务器编写的 Servlet 移植到其他主流服务器上,如 Apache、Microsoft IIS 或 WebStar 等。...

    java servlet jar包

    Java Servlet是Java编程语言中用于开发服务器端应用程序的API,主要用于构建动态Web应用程序。Servlet是Java EE(Enterprise Edition)的一部分,它允许开发者扩展Web服务器的功能,处理HTTP请求并返回响应。在Java ...

    Java Servlet API 2.5

    Java Servlet API 2.5是Java Web开发中的一个重要组成部分,它是Java服务器端程序与Web应用程序交互的核心接口。这个API定义了一系列用于处理HTTP请求和响应的类和接口,为开发动态、交互式的Web应用提供了基础。在...

    JSP,java,servlet,javascript综合项目

    【JSP, Java, Servlet, JavaScript 综合项目】 在这个综合项目中,我们将深入探讨四种核心技术:JavaServer Pages(JSP)、Java、Servlet以及JavaScript,它们都是构建动态Web应用程序的关键组件。这些技术协同工作...

    spring mvc拦截器过滤json中的null值

    在Spring MVC框架中,我们经常需要处理JSON数据,这些数据可能包含null值。在某些情况下,为了保持数据的整洁和避免后端处理null值时出现异常,我们需要在数据传输前过滤掉这些null值。本教程将详细介绍如何使用...

    Java+Servlet+Api

    Java Servlet技术是Java平台上的一个核心技术,用于创建动态web应用程序。Servlet API是Java Servlet技术的基础,它提供了一系列的接口和类,使得开发者能够编写服务器端的Java程序,处理HTTP请求并生成响应。本资源...

    Java Servlet详细讲解

    Java Servlet是一种基于Java技术的服务器端组件,用于创建动态web应用程序。SUN公司(现在是Oracle)开源的Servlet规范使得开发者能够用Java语言编写能够处理HTTP请求的服务端程序。Servlet在Web开发中扮演着核心...

    java+servlet+ajax程序

    Java、Servlet 和 Ajax 是构建动态网站的关键技术,它们共同为用户提供了交互性和实时更新的能力。本指南将深入解析这些技术,并结合实际应用,帮助您理解和掌握如何利用它们来开发高效、响应迅速的网络应用。 一、...

    java Servlet学习笔记

    Servlet是Java EE(企业版)的一部分,它允许开发者在服务器端创建强大的、可扩展的网络应用程序。以下是对Servlet相关内容的详细说明: 一、Servlet概述 1.1 B/S架构(Browser/Server浏览器-服务器架构) B/S架构...

    Java Servlet 学习课件

    总结来说,Java Servlet是一种强大的服务器端编程模型,它利用Java的特性提供了高效、灵活且可移植的解决方案,用于构建动态、交互式的Web应用。通过学习和掌握Servlet技术,开发者可以构建出复杂的企业级应用系统,...

    Java Servlet Programming

    Java Servlet Programming是O'Reilly出版的一本关于Java Servlet编程的书籍,涵盖了Java Servlet的基础知识和高级主题。 本书共分为十四章,涵盖了Java Servlet的基础知识、Java Servlet的架构、Servlet生命周期、...

    JavaServlet帮助文档

    Java Servlet技术是Java平台上的一个核心特性,用于构建动态web应用程序。Servlet是Java语言编写的服务端组件,它们扩展了服务器的功能,使得服务器能够处理HTTP协议请求。Java Servlet Development Kit(简称...

    java Java Servlet小程序

    Java Servlet是一种Java编程技术,用于开发可扩展的Web应用程序。它是Java EE(企业版)平台的一部分,主要用于服务器端,处理HTTP请求并返回响应。Servlet API提供了与Web服务器交互的接口和类,允许开发者创建动态...

Global site tag (gtag.js) - Google Analytics