openssl 自建ca,颁发客户端证书

openssl 自建ca,颁发客户端证书

概念理解

数字证书:
数字证书就是互联网通讯中标志通讯各方身份信息的一串数字,提供了一种在Internet上验证通信实体身份的方式,数字证书不是数字身份证,而是身份认证机构盖在数字身份证上的一个章或印(或者说加在数字身份证上的一个签名)。它是由权威机构——CA机构,又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份。
非对称加密:
对称加密算法在加密和解密时使用的是同一个秘钥;而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
数字签名:
数字签名(又称公钥数字签名、电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。
数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。
数字签名是非对称密钥加密技术与数字摘要技术的应用。
作用:
保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。
数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。
数字签名是个加密的过程,数字签名验证是个解密的过程。
经典非对称RSA加密算法:
RSA是目前最有影响力和最常用的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。
RSA的安全性依赖于大数分解,但是否等同于大数分解一直未能得到理论上的证明,因为没有证明破解RSA就一定需要作大数分解。假设存在一种无须分解大数的算法,那它肯定可以修改成为大数分解算法。 RSA 的一些变种算法已被证明等价于大数分解。不管怎样,分解n是最显然的攻击方法。人们已能分解多个十进制位的大素数。因此,模数n必须选大一些,因具体适用情况而定。
SET(Secure Electronic Transaction)协议中要求CA采用2048bits长的密钥,其他实体使用1024比特的密钥。RSA密钥长度随着保密级别提高,增加很快。下表列出了对同一安全级别所对应的密钥长度。
这里写图片描述

总的来说 rsa算法安全性,目前市场上流行https 即ssl 证书 也大多是基于rsa算法的 ,rsa 不仅能用于加密,而且还能用于数字签名。虽然最终基于ecc的ssl证书将会成为主流,但是目前由于各种软件的支持性较低,所以还未普及 ,但是ecc在安全性和速度上的优势较rsa还是有很高的优势的。
但是本篇并不探讨ecc,其实原理我也不懂了。

数字证书格式简介:
参:http://www.cnblogs.com/cuimiemie/p/6442685.html
数字证书常见标准
符合PKI ITU-T X509标准,传统标准(.DER .PEM .CER .CRT)
符合PKCS#7 加密消息语法标准(.P7B .P7C .SPC .P7R)
符合PKCS#10 证书请求标准(.p10)
符合PKCS#12 个人信息交换标准(.pfx *.p12)
X509是数字证书的基本规范,而P7和P12则是两个实现规范,P7用于数字信封,P12则是带有私钥的证书实现规范。
x509
基本的证书格式,只包含公钥。
x509证书由用户公共密钥和用户标识符组成。此外还包括版本号、证书序列号、CA标识符、签名算法标识、签发者名称、证书有效期等信息。

PKCS#7
Public Key Cryptography Standards #7。
PKCS#7一般把证书分成两个文件,一个公钥、一个私钥,有PEM和DER两种编码方式。PEM比较多见,是纯文本的,一般用于分发公钥,看到的是一串可见的字符串,通常以.crt,.cer,.key为文件后缀。DER是二进制编码。
PKCS#7一般主要用来做数字信封。

PKCS#10
证书请求语法。

PKCS#12
Public Key Cryptography Standards #12。
一种文件打包格式,为存储和发布用户和服务器私钥、公钥和证书指定了一个可移植的格式,是一种二进制格式,通常以.pfx或.p12为文件后缀名。
使用OpenSSL的pkcs12命令可以创建、解析和读取这些文件。
P12是把证书压成一个文件,xxx.pfx 。主要是考虑分发证书,私钥是要绝对保密的,不能随便以文本方式散播。所以P7格式不适合分发。.pfx中可以加密码保护,所以相对安全些。

PKCS系列标准
实际上PKCS#7、PKCS#10、PKCS#12都是PKCS系列标准的一部分。相互之间并不是替代的关系,而是对不同使用场景的定义。

证书编码格式
PEM和DER两种编码格式。

PEM
Privacy Enhanced Mail
查看内容,以”—–BEGIN…”开头,以”—–END…”结尾。
查看PEM格式证书的信息:openssl x509 -in certificate.pem -text -noout
Apache和*NIX服务器偏向于使用这种编码格式。

DER
Distinguished Encoding Rules
打开看是二进制格式,不可读。
查看DER格式证书的信息:openssl x509 -in certificate.der -inform der -text -noout
Java和Windows服务器偏向于使用这种编码格式。

各种后缀含义
文件的内容和后缀没有必然的关系,但是一般使用这些后缀来表示这是什么文件。

JKS
Java Key Store(JKS)。

CSR
证书请求文件(Certificate Signing Request)。
这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的个人信息)。
查看的办法:openssl req -noout -text -in my.csr,DER格式的话加上-inform der。

CER
一般指使用DER格式的证书。

CRT
证书文件。可以是PEM格式。

KEY
通常用来存放一个公钥或者私钥。
查看KEY的办法:openssl rsa -in mykey.key -text -noout
如果是DER格式的话,同理应该这样了:openssl rsa -in mykey.key -text -noout -inform der
这是使用RSA算法生成的key这么查看,DSA算法生成的使用dsa参数。

CRL
证书吊销列表 (Certification Revocation List),是一种包含撤销的证书列表的签名数据结构。

openssl 自建ca 颁发客户端证书

理解了以上概念之后,我们来自建一个ca 颁发证书

最终我们客户端和服务端程序使用的证书是p12格式即
一种文件打包格式,为存储和发布用户和服务器私钥、公钥和证书指定了一个可移植的格式,是一种二进制格式,通常以.pfx或.p12为文件后缀名。
一般程序都是采用这种打包方式保存公钥私钥的,这样方便程序操作

1.下载openssl

开源库地址
https://github.com/openssl/openssl
windows下载
http://slproweb.com/products/Win32OpenSSL.html
官网下载:
https://www.openssl.org/source/
本篇直接使用centos 系统自带的openssl
安装教程自己搜索

2.创建 ca目录结构

这里写图片描述

创建ca目录
cp -r /opt/pki/tls/* /opt/myca
echo 01 > serial
当然这些目录也可以自行创建
mkdir newcerts private crl
touch index.txt
touch serial
echo 01 >serial

请忽略 test,testcer目录
newcerts目录用于存放CA签署(颁发)过的数字证书(证书备份目录)。
private目录用于存放CA的私钥。
文件serial和index.txt分别用于存放下一个证书的序列号和证书信息数据库。
文件serial填写第一个证书序列号(如10000001),之后每前一张证书,序列号自动加1。
cacert.pem 为根证书
本例中 ca目录为 /opt/myca/

3.修改centos 自带openssl 指定默认ca目录

vim /etc/pki/tls/openssl.cnf
这里写图片描述

修改签发客户端证书和根证书属性匹配规则
这里写图片描述

报错时,可以将policy_match 修改为optional即可
match 表示属性必须一致

4.签发ca 证书

签发ca证书和签发客户端证书过程大致类似,但是ca证书是自签名的
客户端证书是使用ca证书签名的

cd /opt/myca/
1.生成 ca私钥
openssl genrsa -out private/cakey.pem 2048
2. 生成ca 请求证书,会输入一些参数
openssl req -new -days 3650 -key private/cakey.pem -out careq.pem
3. 对ca 证书进行自签名 根证书自签名
openssl ca -selfsign -in careq.pem -out cacert.pem

cd /opt/myca/
1.生成 ca私钥
openssl genrsa -out private/cakey.pem 2048
2. 生成ca 请求证书,会输入一些参数
openssl req -new -days 3650 -key private/cakey.pem -out careq.pem
req 表示客户端证书向ca 发出申请的命令
-new 表示新请求
-days 从生成之时算起,证书时效为 365 天。
-key
指定 private/cakey.pem 为证书所使用的密钥对文件。
-out careq.pem
令生成的证书请求保存到文件 careq.pem 。
这里写图片描述
3. 对ca 证书进行自签名
openssl ca -selfsign -in careq.pem -out cacert.pem
这里写图片描述

5.签发客户端证书

cd /opt/myca
mkdir -p clientDir/test
cd clientDir/test

1.生成私钥
openssl genrsa  -out client_private.pem 2048

2. 生成公钥 
openssl rsa -in client_private.pem -pubout -out client_public_key.pem


3. 生成用户证书请求文件
openssl req -new -days 3650 -key client_private.pem -out client_req.pem

4.ca对用户证书签名

openssl ca -in client_req.pem -out client_public_key.pem -days 3650


5. 生成p12

openssl pkcs12 -export -in client_public_key.pem -inkey client_private.pem -out client.p12 -certfile /opt/myca/cacert.pem

最后会生成
这里写图片描述
client_req.pem 用户证书请求文件
client_pub.pem 客户端公钥 base64 的cer证书 不用转换 ,改个后缀就是cer格式
client_private.pem 客户端私钥

client.p12 用户私人证书 最终成品

将 client.p12 安装到chrome浏览器中后,查看该证书信息,看到
这里写图片描述

也可以查看证书的一些信息
这里写图片描述

颁发者和 持有者不一致 ,自签发的,两者一样

6. 证书的一些常用命令

1.生成私钥
openssl genrsa -out cakey.pem 2048  
2.p12 导出个人证书(cer,公钥)
openssl pkcs12 -in client.p12 -nokeys -clcerts -out client_pub.pem  
3.p12导出私钥(-nodes 表示导出明文私钥,不加会要求输入des密码)
openssl pkcs12 -in client.p12 -nocerts -nodes -out alicekey.pem  
4. openssl 生成自签名的p12 格式证书(首先得生成私钥和公钥)
openssl pkcs12 -export -clcerts -in client-cert.cer -inkey client-key.key -out client.p12
5. keytool(jdk生成p12)
keytool -storepass 123456 -storetype PKCS12 -keystore file.p12 -genkey -alias client -keyalg RSA

6. keytool 根据p12 生成 jks
keytool -importkeystore -deststorepass yourJKSpass -destkeypass yourKeyPass -destkeystore MyDSKeyStore.jks -srckeystore fullchain_and_key.p12 -srcstoretype PKCS12 -srcstorepass yourPKCS12pass -alias client

7.pem 转 der格式证书
openssl x509 -outform der -in client_pub.pem -out client_pub.der

7 自己生成ssl 证书,并配置tomcat

cmd
H:
cd test

1、为服务器生成自签名证书
keytool -genkey -v -alias ecr -keyalg RSA -keystore server.keystore -dname "CN=localhost,OU=testserver,O=testserver,L=BJ,ST=BJ,C=CN" -validity 3650 -storepass test12 -keypass test12  

2.为客户端生成自签名证书,p12
keytool -genkey -v -alias testclient -keyalg RSA -storetype PKCS12 -keystore client.p12 -dname "CN=client,OU=testclient,O=testclient,L=BJ,ST=BJ,C=CN" -validity 3650 -storepass test12 -keypass test12

3、让服务器信任客户端证书
由于是双向SSL认证,服务器必须要信任客户端证书,因此,必须把客户端证书添加为服务器的信任认证。由于不能直接将PKCS12格式的证书库导入,我们必须先把客户端证书导出为一个单独的CER文件,使用如下命令:

keytool -export -v -file client.cer -alias testclient -keystore client.p12  -storetype PKCS12 -storepass test12



4.让服务器信任证书(client.cer 是服务发布后交给客户端的证书,以后客户端必须使用client.cer 才能和服务端通信)
keytool -import -v -file client.cer -keystore server.keystore -storepass test12

5.查询服务器证书信任的证书
通过list命令查看服务器的证书库,我们可以看到两个输入,一个是服务器证书,一个是受信任的客户端证书:

keytool -list -keystore server.keystore -storepass test12

tomcat 7.0,8.0配置,8.0 支持更新的配置,server.xml 修改配置
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"  

        maxThreads="150" scheme="https" secure="true"  

        clientAuth="true" sslProtocol="TLS"  

        keystoreFile="H:/test/server.keystore" keystorePass="test12"  

        truststoreFile="H:/test/server.keystore" truststorePass="test12"/>  

参考:
http://blog.csdn.net/hacode/article/details/43851065
http://www.cnblogs.com/bluestorm/archive/2013/06/26/3155945.html

http://blog.csdn.net/xiaxiaorui2003/article/details/41312381
http://www.cnblogs.com/f-ck-need-u/p/7115871.html

http://blog.csdn.net/scuyxi/article/details/54898870

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值