CA搭建与证书申请
概述
- 需要掌握证书申请
- 了解证书吊销
- 用到的命令openssl
引言
前面提到的不对称加密时,将公钥传送给对方时,存在中间人攻击的隐患,如果接收方没有进行安全检测,贸然认可,那后续传输就谈不上安全了。
为保证用户之间在网上传递信息的安全性、真实性、可靠性、完整性和不可抵赖性,不仅需要对用户的身份真实性进行验证,也需要有一个具有权威性、公正性、唯一性的机构
1. CA和证书
- 需要知道的名称
- PKI
Public Key Infrastructure公钥基础设施 - 发证机构(CA)
- 注册机构(RA)
- 证书吊销列表(CRL)
- 证书存取库
- X.509:定义了证书的结构以及认证协议标准
包括:版本号、序列号、签名算法、颁发者、有效期限、主体名称、主体公钥、CRL分发点、扩展信息、发行者签名
-
CA证书的作用
- 为实现双方安全通信提供了电子认证。
- 使用数字证书实现身份识别和电子信息加密。
- 数字证书中含有密钥对(公钥和私钥)所有者的识别信息,通过验证识别信息的真伪实现对证书持有者身份的认证。
-
证书获取
- 向证书授权机构申请
- 生成签名请求(csr),发送给RA,RA审核后发送给CA
- CA 判明申请者的身份后,便为他分配一个公钥,并且 CA 将该公钥与申请者的身份信息绑在一起,并为之签字后,便形成证书发给申请者
- 自签名的证书
自已签发自己的公钥,如建立根CA
-
安全协议
如下图所示,TLS工作在传输层与应用层之间,也就是用户只能看到传输层以下的数据
- Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换
- ChangeCipherSpec 协议:一条消息表明握手协议已经完成
- Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告
- Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等
-
示例:
HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。HTTP over SSL”或“HTTP over TLS”,对http协议的文本数据进行加密处理后,成为二进制形式传输
- 客户申请访问https网站
- 服务器接收到请求,服务器具备CA认证的密钥
- 将CA证书发给客户
- 客户用CA的公钥验证服务器证书,确认后,生成对称密钥key,用服务器的公钥加密key
- 将加密的key发送给服务器
- 服务器端用自己的私钥解密,得到key
- 服务器传输key加密信息
- 客户端接收加密信息,解密获取
-
命名
- SSL: 安全套接层(Secure Socket Layer)
早期名称,由Netscape公司开发的 - TLS: 传输层安全(Transport Layer Security)
由IETF(Internet工程任务组) 将SSL命名的国际标准名称,目前主流的为1.2版本
- SSL: 安全套接层(Secure Socket Layer)
-
功能
- 实现数据的加密
- 认证
- 完整性
- 重放保护 认证
- 基于重放攻击的保护手段,通过记录时间,只负责这一次的验证
- 所谓重放就是不解密数据,将为解密数据再去匹配
例如:登录时的账号与密码,不去破解,而是将其拿出来发给服务器,如果服务器校验成功,就会登录
-
安全协议实现
分为握手阶段和应用阶段- 握手阶段(协商阶段)
客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使用的所有密钥都是通过主密钥生成。 - 应用阶段:
在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信
- 握手阶段(协商阶段)
2. OpenSSL工具
证书的申请,需要用到开源项目OpenSSL
2.1 概述
- 主要组件
- openssl: 多用途的命令行工具,包openssl
- libcrypto: 加密算法库,包openssl-libs
- libssl:加密模块应用库,实现了ssl及tls,包nss
- 主要文件目录
/etc/pki/CA - 涉及名称:satl值
- 原理:
为用户密码添加Salt值,使得加密的得到的密文更加冷僻,不宜查询。即使黑客有密文查询到的值,也是加了salt值的密码,而非用户设置的密码。salt值是随机生成的一组字符串,可以包括随机的大小写字母、数字、字符,位数可以根据要求而不一样。 - 用途
当用户首次提供密码时(通常是注册时),由系统自动添加随机生成的salt值,然后再散列。而当用户登录时,系统为用户提供的代码撒上同样的加盐值,然后散列,再比较散列值,已确定密码是否正确。
- 原理:
- openssl命令:
直接输入openssl回车进入交互模式,输入带命令选项的openssl进入批处理模式(非交互式 )-
程序版本号
openssl version[root@hai7 ~/.gnupg]$openssl version OpenSSL 1.0.2k-fips 26 Jan 2017
-
获取帮助
openssl ?[root@hai7 ~/.gnupg]$openssl ? 标准命令 Standard commands asn1parse ca ciphers cms ...... 消息摘要命令(哈希运算) Message Digest commands (see the `dgst' command for more details) md2 md4 md5 rmd160 sha sha1 加密命令(各种加密算法) Cipher commands (see the `enc' command for more details) aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb
-
2.2 对称加密
- 工具
- openssl enc
- gpg
-
算法
3des, aes, blowfish, twofish -
帮助
man enc -
格式
- 加密
openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher - 解密:
openssl enc -d -des3 -a -salt –in testfile.cipher -out testfile
- 加密
-
选项
- -e:加密输入数据,默认值
- -d:解密输入数据
- -des3:加密类型,表示用des3加密
- -a:base64处理数据。这意味着,如果进行加密,数据将在加密后进行base64编码;
如果解密被设置,那么输入数据在被解密之前就被解码了 - -salt: 加盐,随机生成,或者提供-S选项
- -S : 指定salt值
- -in: 跟要加密的文件
- -out: 跟输出的文件
-
示例
示例1:为文件f1以des3算法加密,输出为f1.des3
1. 为文件f1以des3算法加密,输出为f1.des3
[root@localhost /data]$openssl enc -e -des3 -a -salt -in f1 -out f1.des3
enter des-ede3-cbc encryption password: <==输入2次密码
Verifying - enter des-ede3-cbc encryption password:
2. 查看生成文件,已转换成base64
[root@localhost /data]$cat f1.des3
U2FsdGVkX19KJwR5kcHwfvMkXiumg9uX/MnR9J5KnNPXa2H1OsMabw==
示例2:批处理模式解密示例1中生成的f1.des3
[root@localhost /data]$openssl enc -d -des3 -a -salt -in f1.des3 -out f2.des3 -pass pass:magedu
2.3 信息摘要算法
-
算法
md5sum, sha1sum, sha224sum,sha256sum… -
帮助
man dgst -
格式
openssl dgst -md5 [-hex默认] /PATH/SOMEFILE -
选项
- -sign filename
用“文件名”中的私钥(DSA算法)对摘要进行数字签名
- -sign filename
-
示例
示例1:以md5算法计算文件f1哈希值,
[root@localhost /data]$openssl dgst -md5 f1
MD5(f1)= fda4e701258ba56f465e3636e60d36ec
[root@localhost /data]$md5sum f1
fda4e701258ba56f465e3636e60d36ec f1
示例2:用md5算法为文件f1签名,输出文件为mo.txt
注:签名私钥为rsa算法
$openssl md5 -sign moli.key -out mo.txt f1
示例3:用md5算法验证签名的文件mo.txt
[root@localhost /data]$openssl sha1 -verify moli.key.pub -signature mo.txt f1
Verified OK
2.4 生成用户密码:
- 格式
openssl passwd -1 -salt SALT(最多8位)
openssl passwd -1 –salt centos - 选项
- -1:使用MD5哈希算法生成的结果
- -crypt:默认选项,使用crypt加密
- -salt:指定salt值
- 示例
1:[root@hai7 ~]$openssl passwd -1
Password: <==输入2次口令
Verifying - Password:
$1$08EjVAC6$dfgN2Kn16zkFs12lMYoZd/ <==生成的加密口令,08EjVAC6为salt值
2:[root@hai7 ~]$openssl passwd -1
Password: <==输入与上例相同的口令
Verifying - Password:
$1$d7dionAs$O7BniOV/YF7yNtPPOO3Sk. <==即使口令相同,系统的salt值不同生成的加密口令也不同
3:[root@hai7 ~]$openssl passwd -1 -salt 08EjVAC6 <==指定1中的salt值
Password:
$1$08EjVAC6$dfgN2Kn16zkFs12lMYoZd/ <==生成相同的结果
2.5 生成随机数
- 帮助
man sslrand - 格式
openssl rand -base64|-hex NUM - 选项
- -base64:使用base64编码生成随机数
- -hex:生成16进制数
- NUM:表示字节数;-hex时,每个字符为十六进制,相当于4位二进制,2个加起来才是1个字节,出现的字符数为NUM*2
- 示例
示例1:各选项示例
[root@hai7 ~]$openssl rand -base64 1 1字节表示8位 3字节表示24位,如果可以被6整除就不会出现=
+g==
[root@hai7 ~]$openssl rand -base64 3
vzof
[root@hai7 ~/.gnupg]$openssl rand -hex 3
6ac247 <==输出结果为num的2倍长度
示例2:生成12位指定随机口令,不要出现特殊符号
[root@hai7 ~]$openssl rand -base64 24|tr -d "/+"|head -c12
- base64简介
- base64不是加密 机制,只是将文本转换成特殊的字符格式
- 可以通过命令
base64 -d fire
还原成原来的文本, - 它是通过64个字符来表示(也就是2^6)系统中的二进制,分别为z-aA-Z0-9+/
base64 | 二进制转换为十进制 |
---|---|
A-Z | 0-25 |
z-a | 26-51 |
+ | 62 |
/ | 63 |
示例:ab转换为base64
[root@hai7 ~]$echo -n "ab"|base64
YWI=
[root@hai7 ~]$man ascii
查看ascii得知a的对应10进制为97,转换成二进制为01100001
b为98二进制为01100010
base64只占6位,所以ab表示如下
011000 01 0110 0010 分割后最后一段不够6位要补齐得到如下结果
|011000|01 0110| 001000 |
|24 | 22 | 8 用=表示凑出来的2个0
|Y | W | I=
2.6 密钥生成
-
帮助
man genrsa -
生成私钥
生成一个rsa算法的密钥
命令:openssl genrsa- 格式:
openssl genrsa -out </PATH/TO/PRIVATEKEY.FILE> <NUM_BITS>
- 选项:
-out:输出文件
-des|des3:指定为私钥加密的类型
NUM_BITS:指定私钥位数
</PATH/TO/PRIVATEKEY.FILE>:指定生成的路径
- 格式:
-
提取公钥
从私钥中提取出公钥
格式:
openssl rsa -in PRIVATEKEYFILE –pubout –out PUBLICKEYFILE
-
示例
示例1:在当前路径生成1024位的私钥,命名为shan.key
[root@localhost /data]$openssl genrsa -out shan.key 1024
示例2:指定路径生成上例要求私钥
[root@localhost /data]$openssl genrsa -out /root/shan.key 1024
示例3:生成的私钥为base64编码的转换为原始格式
[root@localhost /data]$vim shanwuyu.key
-----BEGIN RSA PRIVATE KEY----- <==删除批注
......省略
LcE0MaZixVGjNMnhVD++qCMiBKyhMTpzQH5jXzGLv8U=
-----END RSA PRIVATE KEY----- <==删除
转换为原始二进制格式
[root@localhost /data]$base64 -d shanwuyu.key
示例4:生成加密的私钥
[root@localhost /data]$openssl genrsa -out moli.key -des3 1024
[root@localhost /data]$cat moli.key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED <==加密提示,未加密文件没有
DEK-Info: DES-EDE3-CBC,27A75F1F94F56962 <==加密提示
示例5:将加密私钥解密
[root@localhost /data]$openssl rsa -in moli.key -out moli
-in:加密过的私钥
-out:命名解除密码后的私钥
示例6:为了安全通常要给文件加上权限在括号中执行,临时开启一个子shell,使umask只是在这次命令中生效,不影响全局
[root@localhost /data]$(umask 077; openssl genrsa –out test.key –des 2048)
示例7:从私钥中提取公钥
[root@localhost /data]$openssl -in moli.key -pubout -out moli.key.pub
-in 指定私钥
-out 输出公钥名
-pubout 表示提取公钥
- 随机数生成器:伪随机数字
/dev/random:仅从熵池返回随机数;随机数用尽,阻塞,如果随机数用尽,会等待键盘和鼠标,块设备生成,会慢于urandom
/dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞
3 OpenSSL生成证书的整个过程
获取CA证书的途径
- 付费使用商业CA
- 建立私有CA
3.1 证书申请及签署步骤:
- 生成申请请求,后缀一般为csr,发送给证书请求部门
- RA核验
- CA签署
- 获取证书
3.2 创建私有CA
openssl的配置文件:/etc/pki/tls/openssl.cnf
......前面省略,可能需要设置的从如下行开始
####################################################################
[ ca ]
default_ca = CA_default # The default ca section
"默认ca"
####################################################################
[ CA_default ]
"定义默认ca"
dir = /etc/pki/CA # Where everything is kept
"ca的工作目录"
certs = $dir/certs # Where the issued certs are kept
"已被发放的证书"
crl_dir = $dir/crl # Where the issued crl are kept
'证书吊销列表保存目录'
database = $dir/index.txt # database index file.
'证书索引数据库,已经颁发证书状态的数据库文件,需要手工创建,创建后系统会自动添加'
#unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir = $dir/newcerts # default place for new certs.
'新签发证书的存放目录'
certificate = $dir/cacert.pem # The CA certificate
'ca本身根证书文件'
serial = $dir/serial # The current serial number
'下一个要颁发证书的编号'
crlnumber = $dir/crlnumber # the current crl number
'下一个被吊销的证书编号'
# must be commented out to leave a V1 CRL
crl = $dir/crl.pem # The current CRL
'当前被吊销证书文件'
private_key = $dir/private/cakey.pem # The private key
'ca自身私钥的文件'
......省略不需要修改文件
# crl_extensions = crl_ext
default_days = 365 # how long to certify for
'默认有效期365天'
default_crl_days= 30 # how long before next CRL
'每30发布一次被吊销证书讯息'
......省略不需要修改文件
# A few difference way of specifying how similar the request should look
# For type CA, the listed attributes must be the same, and the optional
# and supplied fields are just that :-)
policy = policy_match
'默认策略'
# For the CA policy
[ policy_match ]
'私有化ca策略'
countryName = match <==匹配,要求申请信息与CA必须一致
'国家'
stateOrProvinceName = match
'省'
organizationName = match
'组织,也就是公司'
organizationalUnitName = optional <==可选,可有可无
'部门,可选择,自定义'
commonName = supplied <==支持,申请必须填写的项目
'颁发目标的通用名,如网站要提供域名'
emailAddress = optional
'邮箱,可选项'
# For the 'anything' policy
# At this point in time, you must list all acceptable 'object'
# types.
[ policy_anything ]
'非私有化CA策略'
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
- 创建服务器私有CA
-
手工创建所需要的文件
- 生成证书索引数据库文件
touch /etc/pki/CA/index.txt
- 指定第一个颁发证书的序列号,数字为16进制
echo 01 > /etc/pki/CA/serial
- 生成证书索引数据库文件
-
CA自签证书
- 进入到工作目录,
cd /etc/pki/CA/
- 生成私钥,文件名一定为cakey.pem,这里做实验,不使用加密
-
(umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
- 进入到工作目录,
-
生成自签名证书
- 命令格式
openssl req -new -x509 –key 私钥路径 -days 3650 -out 生成路径 - 选项
-new: 生成新证书签署请求
-x509: 专用于CA生成自签证书
-key: 生成请求时用到的私钥文件
-days n:证书的有效期限
-out /PATH/TO/SOMECERTFILE: 证书的保存路径
- 命令格式
-
- 示例
[root@hai7 /etc/pki/CA]$openssl req -new -x509 –key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem
Country Name (2 letter code) [XX]:CN <=='输入国家'
State or Province Name (full name) []:beijing <=='省'
Locality Name (eg, city) [Default City]:beijing <=='市'
Organization Name (eg, company) [Default Company Ltd]:moli <=='公司'
Organizational Unit Name (eg, section) []:fuwu <=='部门'
Common Name (eg, your name or your server's hostname) []:v9 <=='标识'
Email Address []: <=='邮箱'
- 查看生成的自签名证书
'进到文件所在目录'
[root@hai7 /etc/pki/CA]$openssl x509 -in cacert.pem -noout -text
'导入Windows中查看比较直观,后缀增加.crt'
[root@hai7 /etc/pki/CA]$sz cacert.pem
- 将CA的根证书导入windows系统受信任根证书颁发机构
控制面板→Internet属性→内容→证书→受信任的根证书颁发机构→导入
3.3 客户端申请证书
在需要使用证书的主机生成证书请求
- 生成私钥
存放目录,根据为那个应用程序使用选择,不同的服务都有自己的工作目录例如:给web服务器使用,生成私钥放在其下配置文件夹中/etc/http/conf.dm,将来申请的证书也放在一起
[root@hai6 ~]$(umask 066; openssl genrsa -out /data/app.key 1024)
- 生成证书申请文件,证书申请文件后缀为.csr
注意:默认国家,省,公司名称三项必须和CA一致,如果想要随意指定需要更改配置文件中的策略,比如将默认策略改为’policy_anything’
切换至生成的私钥目录,借助私钥生成申请文件
[root@hai6 /data]$openssl req -new -key app.key -out app.csr
Country Name (2 letter code) [XX]:CN <=='国家必须与CA相同'
State or Province Name (full name) []:beijing <=='省必须与CA相同'
Locality Name (eg, city) [Default City]:beijing <=='市为可选'
Organization Name (eg, company) [Default Company Ltd]:moli<=='公司必须相同'
Organizational Unit Name (eg, section) []:fuwu <=='部门可选'
Common Name (eg, your name or your server's hostname) []:www.shanwuyu.com
"将来可能要使用的域名"
Email Address []: <=="邮箱跳过"
A challenge password []: <=="密码跳过"
- 将证书请求文件传输给CA
[root@hai6 /data]$scp app.csr 172.20.50.201:/etc/pki/CA
- CA签署证书
[root@hai7 /etc/pki/CA]$openssl ca -in app.csr -out certs/app.crt -days 100
Using configuration from /etc/pki/tls/openssl.cnf
'系统将申请信息打印至屏幕供CA颁发确认'
Check that the request matches the signature
'省略......'
Certificate is to be certified until Dec 26 06:52:18 2018 GMT (100 days)
Sign the certificate? [y/n]:y
'以上为证书申请提供的信息,是否确定'
1 out of 1 certificate requests certified, commit? [y/n]y
'得到认证是否提交'
Write out database with 1 new entries
Data Base Updated
- 查看生成的文件
[root@hai7 /etc/pki/CA]$tree
.
├── certs
│ └── app.crt '与01.pem是同一个文件'
...
'申请策略,默认为唯一的,unique_subject=yes,修改为no,可使用相同资料重复申请'
├── newcerts
│ └── 01.pem
...
├── serial '新证书编号'
└── serial.old '证书编号备份'
- 查看自建文件index.txt内容
[root@hai7 /etc/pki/CA]$cat index.txt
V |181226065218Z| 02 |unknown |/C=CN/ST=beijing/O=moli/OU=fuwu/CN=www.shanwuyu.com
表示有效| 有效期 |颁发证书编号|
- 查看证书中的信息:
openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|issuer|subject|serial|dates
查看全部
[root@hai7 /etc/pki/CA]$openssl x509 -in certs/app.crt -noout -text
查看申请人信息
[root@hai7 /etc/pki/CA]$openssl x509 -in certs/app.crt -noout -subject
查看时间
[root@hai7 /etc/pki/CA]$openssl x509 -in certs/app.crt -noout -dates
查看指定编号的证书状态
openssl ca -status SERIAL
- 查看证书有效性
[root@hai7 /etc/pki/CA]$openssl verify -CAfile cacert.pem certs/app.crt
| CA证书 |需要验证的证书|
certs/app.crt: OK
-CAfile :后面跟CA的证书文件
3. 4 吊销证书
- 在客户端获取要吊销的证书的serial
openssl x509 -in /PATH/FROM/CERT_FILE -noout -serial -subject - 在CA上,根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致,吊销证书:
[root@hai7 /etc/pki/CA]$openssl ca -revoke newcerts/01.pem
[root@hai7 /etc/pki/CA]$cat index.txt
| R |181226065218Z |180917080308Z| 01 |unknown /C=CN/ST=beijing/O=moli/OU=fuwu/CN=www.shanwuyu.com
|表示吊销| 有效期 | 吊销时间 |吊销编号|吊销机构|
R表示吊销 第一个时间表示到期时间 第二个时间表示吊销时间
- 指定第一个吊销证书的编号,注意:第一次更新证书吊销列表前,才需要执行
echo 01 > /etc/pki/CA/crlnumber
- 更新证书吊销列表,文件名要求为crl.pem
openssl ca -gencrl -out /etc/pki/CA/crl.pem
- 查看crl文件:
openssl crl -in /etc/pki/CA/crl.pem -noout -text
拿到Windows查看要改后缀名为.crl
思考题
安装yum -y install mod_ssl,查看rpm -q --scripts mod_ssl ,参考格式,可以写自动化脚本
将客户端证书路径写为变量