前面提到的不对称加密时,将公钥传送给对方时,存在中间人攻击的隐患,如果接收方没有进行安全检测,贸然认可,那后续传输就谈不上安全了。
为保证用户之间在网上传递信息的安全性、真实性、可靠性、完整性和不可抵赖性,不仅需要对用户的身份真实性进行验证,也需要有一个具有权威性、公正性、唯一性的机构
CA证书的作用
证书获取
安全协议
如下图所示,TLS工作在传输层与应用层之间,也就是用户只能看到传输层以下的数据
示例:
HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。HTTP over SSL”或“HTTP over TLS”,对http协议的文本数据进行加密处理后,成为二进制形式传输
命名
功能
安全协议实现
分为握手阶段和应用阶段
证书的申请,需要用到开源项目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
算法
3des, aes, blowfish, twofish
帮助
man enc
格式
选项
示例
示例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
算法
md5sum, sha1sum, sha224sum,sha256sum…
帮助
man dgst
格式
openssl dgst -md5 [-hex默认] /PATH/SOMEFILE
选项
示例
示例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
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/ <==生成相同的结果
示例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 -d fire
还原成原来的文本,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=
帮助
man genrsa
生成私钥
生成一个rsa算法的密钥
命令:openssl genrsa
openssl genrsa -out
提取公钥
从私钥中提取出公钥
格式:
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 表示提取公钥
获取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
手工创建所需要的文件
touch /etc/pki/CA/index.txt
echo 01 > /etc/pki/CA/serial
CA自签证书
cd /etc/pki/CA/
(umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
生成自签名证书
[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
在需要使用证书的主机生成证书请求
例如:给web服务器使用,生成私钥放在其下配置文件夹中/etc/http/conf.dm,将来申请的证书也放在一起
[root@hai6 ~]$(umask 066; openssl genrsa -out /data/app.key 1024)
切换至生成的私钥目录,借助私钥生成申请文件
[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 []: <=="密码跳过"
[root@hai6 /data]$scp app.csr 172.20.50.201:/etc/pki/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 '证书编号备份'
[root@hai7 /etc/pki/CA]$cat index.txt
V |181226065218Z| 02 |unknown |/C=CN/ST=beijing/O=moli/OU=fuwu/CN=www.shanwuyu.com
表示有效| 有效期 |颁发证书编号|
查看全部
[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的证书文件
[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
openssl ca -gencrl -out /etc/pki/CA/crl.pem
思考题
安装yum -y install mod_ssl,查看rpm -q --scripts mod_ssl ,参考格式,可以写自动化脚本
将客户端证书路径写为变量