`

转:Java Tomcat SSL 服务端/客户端双向认证(一)

阅读更多

双向认证(个人理解):
客户端认证:
客户端通过浏览器访问某一网站时,如果该网站为HTTPS网站,浏览器会自动检测系统中是否存在该网站的信任证书,如果没有信任证书,浏览器一般会拒绝访问,IE会有一个继续访问的链接,但地址栏是红色,给予用户警示作用,即客户端验证服务端并不是强制性的,可以没有服务端的信任证书,当然是否继续访问完全取决于用户自己。如何去除地址栏的红色警告呢?后续会介绍导入服务端证书到浏览器的方法。

服务端认证:
服务端需要获取到客户端通过浏览器发送过来的认证证书,该证书在服务端的证书库中已存在,仅仅是个匹配过程,匹配成功即通过认证,可继续访问网站资源,反之则无法显示网页,后续有截图。

基本逻辑:
1、生成服务端密钥库并导出证书;
2、生成客户端密钥库并导出证书;
3、根据服务端密钥库生成客户端信任的证书;
4、将客户端证书导入服务端密钥库;
5、将服务端证书导入浏览器。

构建演示系统
演示环境:
JDK:1.6.0_32
Tomcat:apache-tomcat-7.0.27
开发工具:MyEclipse 10
浏览器:Internet Explorer 9

一、生成密钥库和证书
可参考以下密钥生成脚本,根据实际情况做必要的修改,其中需要注意的是:服务端的密钥库参数“CN”必须与服务端的IP地址相同,否则会报错,客户端的任意。
key.script

1、生成服务器证书库

keytool 
-validity 365 -genkey -v -alias server -keyalg RSA -keystore E:\ssl\server.keystore -dname "CN=127.0.0.1,OU=icesoft,O=icesoft,L=Haidian,ST=Beijing,c=cn" -storepass 123456 -keypass 123456


2、生成客户端证书库

keytool 
-validity 365 -genkeypair -v -alias client -keyalg RSA -storetype PKCS12 -keystore E:\ssl\client.p12 -dname "CN=client,OU=icesoft,O=icesoft,L=Haidian,ST=Beijing,c=cn" -storepass 123456 -keypass 123456


3、从客户端证书库中导出客户端证书

keytool 
-export -v -alias client -keystore E:\ssl\client.p12 -storetype PKCS12 -storepass 123456 -rfc -file E:\ssl\client.cer


4、从服务器证书库中导出服务器证书

keytool 
-export -v -alias server -keystore E:\ssl\server.keystore -storepass 123456 -rfc -file E:\ssl\server.cer


5、生成客户端信任证书库(由服务端证书生成的证书库)

keytool 
-import -v -alias server -file E:\ssl\server.cer -keystore E:\ssl\client.truststore -storepass 123456


6、将客户端证书导入到服务器证书库(使得服务器信任客户端证书)

keytool 
-import -v -alias client -file E:\ssl\client.cer -keystore E:\ssl\server.keystore -storepass 123456


7、查看证书库中的全部证书

keytool 
-list -keystore E:\ssl\server.keystore -storepass 123456



二、Tomat配置
使用文本编辑器编辑${catalina.base}/conf/server.xml
找到Connector port="8443"的标签,取消注释,并修改成如下:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" SSLEnabled="true"
               maxThreads
="150" scheme="https" secure="true"
               clientAuth
="true" sslProtocol="TLS"
               keystoreFile
="${catalina.base}/key/server.keystore" keystorePass="123456"
               truststoreFile
="${catalina.base}/key/server.keystore" truststorePass="123456"/>


备注:
keystoreFile:指定服务器密钥库,可以配置成绝对路径,如“D:/key/server.keystore”,本例中是在Tomcat目录中创建了一个名称为key的文件夹,仅供参考。
keystorePass:密钥库生成时的密码
truststoreFile:受信任密钥库,和密钥库相同即可
truststorePass:受信任密钥库密码

三、建立演示项目
项目结构图:
项目名称:SSL(随意)


SSLServlet.java

package com.icesoft.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.security.cert.X509Certificate;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * <p>
 * SSL Servlet
 * </p>
 * 
 * 
@author IceWee
 * @date 2012-6-4
 * 
@version 1.0
 
*/

public class SSLServlet extends HttpServlet {

    
private static final long serialVersionUID = 1601507150278487538L;
    
private static final String ATTR_CER = "javax.servlet.request.X509Certificate";
    
private static final String CONTENT_TYPE = "text/plain;charset=UTF-8";
    
private static final String DEFAULT_ENCODING = "UTF-8";
    
private static final String SCHEME_HTTPS = "https";

    
public void doGet(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException {
        response.setContentType(CONTENT_TYPE);
        response.setCharacterEncoding(DEFAULT_ENCODING);
        PrintWriter out 
= response.getWriter();
        X509Certificate[] certs 
= (X509Certificate[]) request.getAttribute(ATTR_CER);
        
if (certs != null) {
            
int count = certs.length;
            out.println(
"共检测到[" + count + "]个客户端证书");
            
for (int i = 0; i < count; i++) {
                out.println(
"客户端证书 [" + (++i) + "]: ");
                out.println(
"校验结果:" + verifyCertificate(certs[--i]));
                out.println(
"证书详细:\r" + certs[i].toString());
            }

        }
 else {
            
if (SCHEME_HTTPS.equalsIgnoreCase(request.getScheme())) {
                out.println(
"这是一个HTTPS请求,但是没有可用的客户端证书");
            }
 else {
                out.println(
"这不是一个HTTPS请求,因此无法获得客户端证书列表 ");
            }

        }

        out.close();
    }


    
public void doPost(HttpServletRequest request, HttpServletResponse response)
            
throws ServletException, IOException {
        doGet(request, response);
    }

    
    
/**
     * <p>
     * 校验证书是否过期
     * </p>
     * 
     * 
@param certificate
     * 
@return
     
*/

    
private boolean verifyCertificate(X509Certificate certificate) {
        
boolean valid = true;
        
try {
            certificate.checkValidity();
        }
 catch (Exception e) {
            e.printStackTrace();
            valid 
= false;
        }

        
return valid;
    }


}


web.xml
说明:该演示项目强制使用了SSL,即普通的HTTP请求也会强制重定向为HTTPS请求,配置在最下面,可以去除,这样HTTP和HTTPS都可以访问。

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns
="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation
="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
>
      
<display-name>Secure Sockets Layer</display-name>    
    
    
<servlet>
        
<servlet-name>SSLServlet</servlet-name>
        
<servlet-class>com.icesoft.servlet.SSLServlet</servlet-class>
    
</servlet>
    
<servlet-mapping>
        
<servlet-name>SSLServlet</servlet-name>
        
<url-pattern>/sslServlet</url-pattern>
    
</servlet-mapping>
    
    
<welcome-file-list>
      
<welcome-file>index.jsp</welcome-file>
    
</welcome-file-list>

    
<!-- 强制SSL配置,即普通的请求也会重定向为SSL请求 -->  
    
<security-constraint>
        
<web-resource-collection>
            
<web-resource-name>SSL</web-resource-name>
            
<url-pattern>/*</url-pattern><!-- 全站使用SSL -->
        
</web-resource-collection>
        
<user-data-constraint>
            
<description>SSL required</description>
            
<!-- CONFIDENTIAL: 要保证服务器和客户端之间传输的数据不能够被修改,且不能被第三方查看到 -->
            
<!-- INTEGRAL: 要保证服务器和client之间传输的数据不能够被修改 -->
            
<!-- NONE: 指示容器必须能够在任一的连接上提供数据。(即用HTTP或HTTPS,由客户端来决定)-->
            
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
        
</user-data-constraint>
    
</security-constraint>
</web-app>



index.jsp

<%@ page language="java" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>客户端证书上传</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">    
</head>
<body>
<form action="${pageContext.request.contextPath}/sslServlet" method="post">
    
<input type="submit"  value="提交证书"/>
</form>
</body>
</html>



四、演示及配置
发布演示项目,通过浏览器访问:http://127.0.0.1:8080/SSLhttps://127.0.0.1:8443/SSL,得到相同的结果,如图:






得到如上结果的原始是因为客户端没有通过服务端的安全认证,接下来将服务端给客户端颁发的证书导入到浏览器中:
双击“client.p12”



弹出窗口,下一步



默认,下一步



输入生成密钥时的密码“123456”,下一步



下一步



完成



成功



再次访问http://127.0.0.1:8080/SSLhttps://127.0.0.1:8443/SSL,弹出提示框:



点击确定后,IE浏览器自动阻止了继续访问,并给予警告提示,原因是浏览器中未导入该网站的可信证书





点击“继续浏览此网站”,弹出提示,点击确定



哇!鲜红的地址栏,够醒目吧!你访问的网站不安全那,亲!



点击“提交证书”按钮,返回正确结果!



可以看出,客户端并没有服务端那么严格,只要未通过验证就甭想访问,下面将服务端生成的信任证书导入到浏览器的根证书中,这样红色的地址栏就会消失了!
开始导入服务端信任证书,不能双击“server.cer”,需要手动导入到受信任的根证书机构中去。



浏览器Internet选项-内容-证书



点击“受信任的根证书颁发机构”



点击“导入”



下一步



手动选择“server.cer”,下一步






下一步



完成



点“是”




成功





可以看到我们刚刚导入的根证书



把所有浏览器窗口都关掉,再次访问网站,发现鲜红色已经逝去



点击“提交证书”按钮,一切正常了,双向认证的DEMO结束了!

分享到:
评论

相关推荐

    只需要用一张图片素材文档选择器.zip

    只需要用一张图片素材文档选择器.zip

    浙江大学842真题09-24 不含答案 信号与系统和数字电路

    浙江大学842真题09-24 不含答案 信号与系统和数字电路

    无标题baci和jbaci

    无标题baci和jbaci

    完整的雷达系统仿真程序,完整的雷达系统仿真程序 matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    实体商品销售源码最新优化.zip

    实体商品销售源码最新优化.zip

    戴尔存储MD1400机柜维护操作与安全指导

    内容概要:本文档详细介绍了戴尔存储MD1400机柜的安全注意事项、电源指示灯解释、故障排除方法以及硬件维护步骤,包括卸下和安装直流电源设备、硬盘驱动器和背板的具体操作流程。 适用人群:IT运维人员、数据中心管理员和技术支持工程师。 使用场景及目标:在维护和管理戴尔存储MD1400机柜时作为参考指南,确保正确安装和故障排查,避免安全隐患和设备损坏。 其他说明:文档提供了丰富的图文指导,帮助使用者更好地理解和执行相关操作。

    PyClass 课程计划.zip

    PyClass 课程计划Noisebridge Python 课程每周一晚上 7 点至 9 点(太平洋时间)在旧金山 Noisebridge 二楼电子室举行。自 2024 年 8 月起,该课程目前暂停。请参阅 wiki 页面了解更多信息。本课程免费!如果您希望捐款,请捐赠给 Noisebridge。建议捐款15 美元、50 美元、200 美元以上建议每月捐款每月 10 美元、20 美元、40 美元、80 美元以上所有 Python 课程均遵循Noisebridge 反骚扰政策、 Noisebridge 冲突解决指南和 recurse.org 社交规则课后,我们欢迎您提供反馈! 在此提交表格内容课程课程描述新生阅读迭代次数Noisebridge Python 课程至少早在 2015 年就已经存在,拥有许多不同的讲师和版本。从 2017 年到 2018 年,该课程似乎由Jared Garst负责。(?)。从 2023 年到 2024 年,该课程由Travis Briggs负责。如果您有其他关于此类历史的信息想要分享,请在此处创建 PR、

    自动化部署管道创建的代码库(含 Concourse 和 Jenkins 相关).zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

    一种新的混合优化算法,即瞬态三角哈里斯鹰优化器(Tthho) matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    1-中国各地万达广场地理分布数据2006-2021-社科数据.zip

    万达广场作为城市综合体的代表,在中国各地的地理分布数据集覆盖了2006至2021年。这些数据详细记录了万达广场的多个关键指标,包括项目名称、项目信息、具体地点、开业时间、商业面积以及精确的经度和纬度。万达广场不仅是商业地产开发的先行者,还以其成熟的商业模式、完善的产业链和丰富的商业资源,在全国范围内形成了独立的大型商圈。这些综合体集购物、餐饮、文化、娱乐等多种功能于一体,对提升城市商业档次、增加就业岗位、创造税收以及丰富群众消费需求等方面产生了显著的社会效益。数据集提供了420条样本,为研究中国区域经济发展特征及其未来趋势提供了宝贵的信息资源。

    正在月下弹琴的古装美女flash场景动画.zip

    正在月下弹琴的古装美女flash场景动画.zip

    理光Ricoh-MP C8003打印机驱动下载

    理光 MP C8003 是一款彩色激光多功能数码复合机。 【基础性能】 打印复印速度:黑白和彩色打印 / 复印速度均可达 80 页每分钟,能够快速高效地完成大量文档的输出任务,有效提高工作效率 分辨率:拥有 1200x4800dpi 的高分辨率,可输出色彩鲜艳、细节丰富、图像清晰的文档和图像,满足专业级的打印和复印需求,尤其适合对色彩精度要求较高的设计图纸、宣传资料等文件的输出 首张输出时间:黑白首张复印时间为 4.7 秒,彩色首张复印时间为 6.3 秒,在启动打印或复印任务时无需长时间等待,可迅速响应,进一步提升工作效率 纸张容量:标准配置的纸张容量为单 2500 页抽屉和双 550 页抽屉,还可通过扩展将纸张容量从 3700 页提升至 8100 页,能够满足不同规模的打印任务需求,减少纸张添加的频率 【功能多样性】 多功能一体:集复印、打印、扫描、传真功能于一身,可满足办公室多样化的文档处理需求,一台设备即可替代多台单一功能的设备,节省空间和成本 扫描功能:具备高速扫描能力,可通过多种扫描至选项将原件扫描并以电子形式分发,支持将扫描后的文件直接发送至个人移动设备

    《The Annotated Transformer》环境配置

    《The Annotated Transformer》环境配置

    基于深度学习resnet50和vgg16卷积神经网络的汉字书法识别项目源码+训练集+测试集 【可用于课设-毕设】

    深度学习大作业基于resnet50和vgg16卷积神经网络的汉字书法识别项目源码+训练集+测试集 操作步骤 将下载的训练集和测试集,解压到工程中 运行对应的data.py文件,进行转录,将原始数据集转录为numpy矩阵,生成data.npy及label.npy 运行对应的train.py进行训练 运行test.py使用训练完成的网络测试。

    直接序列扩频(DSSS) matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手

    代码

    代码

    ECharts柱状图-基础柱状图.rar

    图表效果及代码实现讲解链接:https://blog.csdn.net/zhangjiujiu/article/details/143996614

    Spring Data Key Value 特性的示例项目.zip

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。

    营销策划 -魔術絲-黑松露香蕉莓果饮品-新品发布会产品介绍-终版.pptx

    营销策划 -魔術絲-黑松露香蕉莓果饮品-新品发布会产品介绍-终版.pptx

    成都市数据条例.docx

    成都市数据条例.docx

Global site tag (gtag.js) - Google Analytics