数字证书双向认证.docx
- 文档编号:11467304
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:33
- 大小:721.30KB
数字证书双向认证.docx
《数字证书双向认证.docx》由会员分享,可在线阅读,更多相关《数字证书双向认证.docx(33页珍藏版)》请在冰豆网上搜索。
数字证书双向认证
1.CA认证原理
1.1.概念
数字证书为发布公钥提供了一种简便的途径,其数字证书则成为加密算法以及公钥的载体,依靠数字证书,我们可以构建一个简单的加密网络应用平台,数字证书就好比我们生活中的身份证,现实中,身份证由公安机关签发,而网络用户的身份凭证由数字证书颁发认证机构—CA签发,只有经过CA签发的证书在网络中才具备可认证性,CA并不是一个单纯的防御手段,它集合了多种密码学算法:
⏹消息摘要算法:
MD5、和SHA(对数字证书本省做摘要处理,用于验证数据完整性服务器)
⏹对称加密算法:
RC2、RC4、IDEA、DES、AES(对数据进行加密/解密操作,用于保证数据保密性服务)
⏹非对称加密算法:
RSA、DH(对数据进行加密/解密操作,用于保证数据保密性服务)
⏹数字签名算法:
RSA、DSA(对数据进行签名/验证操作,保证数据的完整性和抗否认性)。
证书的签发过程实际上是对申请数字证书的公钥做数字签名,证书的验证过程实际上是对数字证书的公钥做验证签名,其中还包含证书有效期验证,通过CA数字证书,我们对网络上传输的数据进行加密/解密和签名/验证操作,确保数据机密性、完整性、抗否认性、认证性,保证交易实体身份的真实性,保证网络安全性。
所有证书有多种文件编码格式,主要包括:
●CER编码(规范编码格式):
是数字证书的一种编码格式,它是BER(基本编码格式)的一个变种,比BER规定得更严格
●DER(卓越编码格式):
同样是BER的一个变种,与CER的不同在于,DER使用定长模式,而CER使用变长模式。
所有证书都符合公钥基础设施(PKI)制定的ITU-TX509国际标准,PKCS(公钥加密标准)由RSA实验室和其他安全系统开发商为促进公钥密码的发展而制定的一系列标准,比如:
PKCS#7(密码消息语法标准----文件后缀名:
.p7b、.p7c、.spc)、PKCS#10(证书请求语法标准----文件后缀名:
.p10、.csr)、PKCS#12(个人信息交换语法标准----文件后缀名:
.p12、.pfx)等,在获得数字证书后,可以将其保存在电脑中,也可以保存在USBKey等相应的设备中。
1.2.SSL/TLS原理
我们先来看一个简单的证书机构签发的流程:
这里的认证机构如何是证书申请者本身,将获得自签名证书。
当客户端获得服务器下发的数字证书后,即可使用数字证书进行加密交互:
数字证书的应用环境是在https安全协议中,使用流程远比上述加密交互流程复杂,但是相关操作封装在传输层,对于应用层透明,在https安全协议中使用非对称加密算法交换密钥,使用对称加密算法对数据进行加密/解密操作,提高加密/解密效率。
要获得数字证书,我们需要使用数字证书管理工具:
KeyTool和OpenSSL构建CSR(数字证书签发申请),交由CA机构签发,形成最终的数字证书,这里我们不对KeyTool做讲解(KeyTool不含有根证书,因此KeyTool没有办法作为CA),网上资料对keytool讲解的也挺多的,我们下面针对OpenSSL进行讲解。
在我们搭建OPENSSL环境前,我们要知道HTTPS协议和SSL/TLS协议,简单的说,HTTPS就是HTTP+SSL(securesocketlayer)/TLS(TransportLayerSecurity)协议,HTTPS协议为数字证书提供了最佳的应用环境,HTTPS协议一般在服务器中配置,如HTTP服务器APACHE、TOMCAT等。
SSL:
位于TCP/IP中的网络传输层,作为网络通讯提供安全以及数据完整性的一种安全协议。
TLS:
作为SSL协议的继承者,成为下一代网络安全性和数据完整性安全协议SSL共有3个版本:
1.0、2.0、3.0,TLS也有1.0、2.0、3.0,通常我们说的SSL/TLS协议指的是SSL3.0/TLS1.0的网络传输层安全协议
SSL/TLS协议分为两层:
记录协议:
建议在可靠的传输协议之上,为高层协议提供数据封装、压缩、加密等基本功能的支持
握手协议:
建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等
经过了SSL/TLS握手协议交互后,数据交互双方确定了本次会话使用的对称加密算法以及密钥,就可以开始进行加密数据交互了,以下是握手协议服务器端和客户端构建加密交互的相关流程图:
协商算法
1、随机数为后续构建密钥准备
2、其他信息包括服务器证书、甚至包含获取客户端证书的请求
验证算法
如果服务器端回复客户端时带有其他信息,则进入数字证书验证阶段
客户端验证服务器端证书:
服务器端验证客户端证书:
产生密钥
当服务器端和客户端经过上述流程后,就开始密钥构建交互了,服务器端和客户端最初需要主密钥为构建会话密钥做准备:
上述5、6不存在次序关系,因为是异步完成
会话密钥
完成上述主密钥构建操作后,服务器端和客户端将建立会话密钥,完成握手协议:
加密交互
上述服务器端和客户端完成了握手协议以后就进入正式会话阶段,如果上述流程中有任何一端受到外界因素干扰发生异常,则重新进入协商算法阶段,下面流程表现进入会话阶段后,服务器端和客户端将使用会话密钥进行加密交互:
2.OpenSSL实现双向认证
OpenSSL是一个开放源代码软件包,实现了SSL以及相关加密技术,是最常用的证书管理工具,OpenSSL功能远胜于KeyTool,可用于根证书(KeyTool不含有,因此KeyTool没有办法作为CA)、服务器证书、客户证书的管理。
在OpenSSL官网下载:
http:
//www.openssl.org/source下载最新的源码,官网还提供了windows版的二进制发行版地址:
2.1.准备工作
✓选择适合自己操作系统的版本进行下载后,安装操作与普通软件一样,没有什么区别
✓设置环境变量:
打开配置文件openssl.cfg(%OpenSSL_Home%\bin\openssl.cfg),找到配置[CA_default]:
变量dir,它指向的是CA工作目录,可以对其进行修改
2.2.Cmd创建命令
整个bat文件的创建过程我们可以把它想象成这样一种场景:
高考结束,教育局来颁发毕业证书给各个学校,各个学校在把证书发给学生,具体步骤如下:
1) 教育局先有空白证书了
2) 教育局又有自己的公章
3) 让各个学校可以拥有毕业证发放申请
4) 对空白的毕业证盖上了教育局的公章,并可以交给已经申请的学校
5) 申请的学校拿到了盖有教育局的毕业证后,准备对其盖上自己的公章
6) 学校在教育局已经盖上教育局公章的毕业证上又盖上了自己学校的公章
7) 准备把毕业证发给学校申请毕业的学生们
8) 申请毕业的学生拿取自己的学生证和身份证准备领取毕业证
9) 来到学校教务处,填写单据申请学校发放毕业证
10) 教育局已经转交学校来发放毕业证,此时学校把毕业证发放给申请学生
11) 学生认为盖有教育局的公章和学校的公章的毕业证是有效的
//构建ca子目录(证书创建时,用到下述目录,最终在certs目录中获得证书文件)
echo构建已发型证书存放目录certs
mkdircerts
echo构建新证书存放目录newcerts
mkdirnewcerts
echo构建私钥存放目录private
mkdirprivate
echo构建证书吊销列表存放目录crl
mkdircr1
//构建相关文件,完成后可以进行证书的构建和签发工作
echo构建索引文件index.txt
echo0>index.txt
echo构建序列号文件serial
echo01>serial
//构建根证书
echo构建随机数private/.rand
opensslrand-outprivate/.rand1000
//构建根证书私钥
echo构建根证书私钥private/ca.key.pem
opensslgenrsa-aes256-outprivate/ca.key.pem2048
//完成密钥构建操作后,需要生成根证书签发申请文件ca.csr
//生成根证书签发申请
echo生成根证书签发申请private/ca.csr
opensslreq-new-keyprivate/ca.key.pem-outprivate/ca.csr-subj"/C=CN/ST=HUBEI/L=WUHAN/O=YALE/OU=YALE/CN=*.qiujinyong.org"
//执行完后此处又要输入根证书密码
//得到根证书签发申请文件后,可以将其发送给CA机构签发,也可以自行签发根证书
echo签发根证书private/ca.cer
opensslx509-req-days1000-sha1-extensionsv3_ca-signkeyprivate/ca.key.pem-inprivate/ca.csr-outcerts/ca.cer
//执行完后此处又要输入根证书密码
echo根证书转换private/ca.p12
opensslpkcs12-export-cacerts-inkeyprivate/ca.key.pem-incerts/ca.cer-outcerts/ca.p12
//执行完后此处又要输入根证书密码
//构建服务器证书
echo构建服务器私钥private/server.key.pem
opensslgenrsa-aes256-outprivate/server.key.pem2048
//服务器证书签发申请
echo生成服务器证书签发申请private/server.csr
opensslreq-new-keyprivate/server.key.pem-outprivate/server.csr-subj"/C=CN/ST=HUBEI/L=WUHAN/O=YALE/OU=YALE/CN="
//执行完后此处又要输入根证书密码
//根证书签发服务器证书
echo签发服务器证书private/server.cer
opensslx509-req-days3650-sha1-extensionsv3_req-CAcerts/ca.cer-CAkeyprivate/ca.key.pem-CAserialca.srl-CAcreateserial-inprivate/server.csr-outcerts/server.cer
//执行完后此处又要输入根证书密码
//将OpenSSL产生的数字证书转换为PKCS#12编码格式
echo服务器证书转换private/server.p12
opensslpkcs12-export-clcerts-inkeyprivate/server.key.pem-incerts/server.cer-outcerts/server.p12
//执行完后此处又要输入根证书密码
//构建客户证书
echo产生客户私钥private/client.key.pem
opensslgenrsa-aes256-outprivate/client.key.pem2048
//执行完后此处又要输入根证书密码
//产生客户证书签发申请
echo生成客户证书签发申请client.csr
opensslreq-new-keyprivate/client.key.pem-outprivate/client.csr-subj"/C=CN/ST=HUBEI/L=WUHAN/O=YALE/OU=YALE/CN=qiujinyong"
//执行完后此处又要输入根证书密码
//根证书签发客户证书
echo签发客户证书certs/client.cer
opensslx509-req-days3650-sha1-extensionsv3_req-CAcerts/ca.cer-CAkeyprivate/ca.key.pem-CAserialca.srl-CAcreateserial-inprivate/client.csr-outcerts/client.cer
//执行完后此处又要输入根证书密码
//将获得客户证书转换JAVA语言可以识别的PKCS#12编码格式
echo客户证书转换certs/client.p12
opensslpkcs12-export-inkeyprivate/client.key.pem-incerts/client.cer-outcerts/client.p12
//完成了双向认证的所需的全部证书
echo根密钥库转换ca.keystore
keytool-importkeystore-v-srckeystorecerts/ca.p12-srcstorepass123456-destkeystorecerts/ca.keystore-srcstoretypepkcs12-deststorepass123456
keytool-list-keystorecerts/ca.keystore-v-storepass123456
echo服务器密钥库转换server.keystore
keytool-importkeystore-v-srckeystorecerts/server.p12-srcstorepass123456-destkeystorecerts/server.keystore-srcstoretypepkcs12-deststorepass123456
keytool-list-keystorecerts/server.keystore-v-storepass123456
echo客户密钥库转换client.keystore
keytool-importkeystore-v-srckeystorecerts/client.p12-srcstorepass123456-destkeystorecerts/client.keystore-srcstoretypepkcs12-deststorepass123456
keytool-list-keystorecerts/client.keystore-v-storepass123456
pause
echoon
2.3.文件生成
通过上述语句我们生成了以下几个“一级”文件以及文件夹:
Certs文件夹下又生成了:
Private文件夹下又生成了
2.4.证书导入
我们使用ca.p12、server.p12、client.p12个人信息交换文件构建双向认证。
在验证操作之前,我们先导入ca.p12、client.p12文件,ca.p12文件是ca根证书的个人信息交换文件:
双击”ca.p12”或者点击在浏览器"工具"->"internet选项"->"内容"中的"证书"->"导入"
点击“下一步”后,“浏览”按钮时,指定个人信息交换文件格式(*.p12;*.pfx),选择“ca.p12的所在位置”:
输入私钥的密码
选择“将所有的证书放入下列存储”:
点击“浏览”,选择“受信任的根证书颁发机构”:
点击“下一步”,然后点击“完成”
导入”client.p12”文件:
导入clinet.p12文件的方式和ca.p12文件方式基本相似,只是在证书存储时,选择“个人”:
2.5.服务器配置
将”ca.p12”、”server.p12”文件复制到tomcat的conf目录下:
我们在tomcat的server.xml文件中配置双向认证:
protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="true" sslProtocol="TLS" keystoreFile="conf/server.p12" keystorePass="123456" keystoreType="PKCS12" truststoreFile="conf/ca.p12" truststorePass="123456" truststoreType="PKCS12"/> 这里的密钥库文件参数keystoreFile指向server.p12文件,密钥库密码参数keystorePass值为”123456”,密钥库类型参数keystoreType值为”PKCS12”,因为双向认证服务区分信任库文件和密钥库文件,此时,server.p12文件将作为密钥库文件,而ca.p12文件则作为信任库文件,因此,信任库文件参数truststoreFile指向ca.p12文件,信任库密码参数truststorePass值为”123456”,信任库类型参数truststoreType值为“pkcs12”,clientAuth的值为”true”,这是打开双向认证的关键一步,port默认为8443,现在修改为443,这样就省去我们在地址栏中输入端口号。 2.6.效果展现 双向认证成功的标志是浏览器出现地址栏出现 图标 2.7.服务器端获得客户端证书 index.jsp页面
request属性信息
<%
for(Enumerationen=request.getAttributeNames();en.hasMoreElements();){
Stringname=(String)en.nextElement();
out.println(name);
out.println("="+request.getAttribute(name));
out.println();
}
%>
数字证书信息
<%
X509Certificate[]certs=(X509Certificate[])request.getAttribute("javax.servlet.request.X509Certificate");
for(X509Certificatecert:
certs){
out.println("版本:
\t\t"+cert.getVersion());
out.println("序列号:
\t\t"+cert.getSerialNumber());
out.println("颁布者:
\t\t"+cert.getIssuerDN());
out.println("使用者:
\t\t"+cert.getSubjectDN());
out.println("签名算法:
\t\t"+cert.getSigAlgName());
out.println("证书类型:
\t\t"+cert.getType());
out.println("有限期从:
\t\t"+cert.getNotBefore());
out.println("至:
\t\t"+cert.getNotAfter());
}
%>
浏览器访问路径:
https:
//www.zlex.org:
8444/CA/
3.代码整理
3.1.获得KeyStore
/**
*获得KeyStore
*
*@paramkeyStorePath
*密钥库路径
*@parampassword
*密码
*@returnKeyStore密钥库
*@throwsException
*/
privatestaticKeyStoregetKeyStore(StringkeyStorePath,Stringpassword)
throwsException{
//实例化密钥库
KeyStoreks=KeyStore.getInstance("PKCS12");
//获得密钥库文件流
FileInputStreamin=newFileInputStream(keyStorePath);
//加载密钥库
ks.load(in,password.toCharArray());
//关闭密钥库文件流
in.close();
returnks;
}
3.2.由KeyStore获得私钥
/**
*由KeyStore获得私钥
*
*@paramkeyStorePath
*密钥库路径
*@paramalias
*别名
*@parampassword
*密码
*@returnPrivateKey私钥
*@throwsException
*/
publicstaticPrivateKeygetPrivateKeyByKeyStore(StringkeyStorePath,
Stringalias,Stringpassword)throwsException{
//获得密钥库
KeyStoreks=getKeyStore(keyStorePath,password);
//获得私钥
return(PrivateKey)ks.getKey(alias,password.toCharArray());
}
3.3.获得Certificate
/**
*获得Certificate
*
*@paramcertificatePath
*证书路径
*@returnCertificate证书
*@throwsException
*/
privatestaticX509CertificategetCertificate(StringcertificatePath)
throwsException{
//实例化证书工厂
CertificateFactorycertificateFactory=CertificateFactory
.getInstance("X.509");
//取得证书文件流
FileInputStreamin=newFileInputStream(certificatePath);
//生成证书
Certificatecertificate=certificateFactory.generateCertificate(in)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字证书 双向 认证