SSL/TLS 认证分为 单向认证 和 双向认证
单向认证: 只是客户端对服务端的身份验证, 访问https网站大部分都是单向认证
双向认证: 客户端和服务端互相进行身份验证, 使用私钥访问银行的https网站是双向认证
双向 TLS 认证,即客户端和服务器端都需要验证对方的身份信息。在两个组件进行双向认证时,会涉及到下面这些证书相关的文件
- 服务器端证书:服务器用于证明自身身份的数字证书,里面主要包含了服务器端的公钥以及服务器的身份信息。
- 服务器端私钥:服务器端证书中包含的公钥所对应的私钥。公钥和私钥是成对使用的,在进行 TLS 验证时,服务器使用该私钥来向客户端证明自己是服务器端证书的拥有者。
- 客户端证书:客户端用于证明自身身份的数字证书,里面主要包含了客户端的公钥以及客户端的身份信息。
- 客户端私钥:客户端证书中包含的公钥所对应的私钥,同理,客户端使用该私钥来向服务器端证明自己是客户端证书的拥有者。
- 服务器端 CA 根证书:签发服务器端证书的 CA 根证书,客户端使用该 CA 根证书来验证服务器端证书的合法性。
- 客户端端 CA 根证书:签发客户端证书的 CA 根证书,服务器端使用该 CA 根证书来验证客户端证书的合法性。
证书类型:
client certificate 用于通过服务器验证客户端
server certificate 由服务器使用,并由客户端验证服务器身份
peer certificate 由集群成员使用,如etcd集群的成员使用,供彼此之间的通讯使用
$ cat << EOF > ca-config.json { "signing": { "default": { "expiry": "43800h" }, "profiles": { "server": { "expiry": "43800h", "usages": [ "signing", "key encipherment", "server auth" ] }, "client": { "expiry": "43800h", "usages": [ "signing", "key encipherment", "client auth" ] }, "peer": { "expiry": "43800h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } $ cat << EOF > ca-csr.json { "CN": "My own CA", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "US", "L": "CA", "O": "My Company Name", "ST": "San Francisco", "OU": "Org Unit 1", "OU": "Org Unit 2" } ] } 生成 CA 证书: $ cfssl gencert -initca ca-csr.json | cfssljson -bare ca - 将会生成以下几个文件: ca-key.pem ca.csr ca.pem
一、自签证书
pem、key:私钥文件,对数据进行加密解密
csr:证书签名请求文件,将其提交给证书颁发机构(ca、CA)对证书签名
crt:由证书颁发机构(ca、CA)签名后的证书或者自签名证书,该证书包含证书持有人的信息、持有人的公钥以及签署者的签名等信息
生成自签名证书的基本步骤如下:
1> 生成私钥(Private Key) 文件
2> 生成证书(签名)请求文件CSR,需要使用私钥
3> 生成自签证书(Certificate)文件,需要使用证书请求文件和私钥文件
openssl自签证书
a> 生成RSA私钥(Private Key)
RSA私钥中也包含公钥。
openssl genrsa [<options>] <bit-length> options: [-des3 | -aes128 | ...] #指定用于保护私钥的对称加密算法 [-passout pass:<password> | -passout file:<path-name> | -passout env:<variable> | -passout fd:<file-descriptor> | -passout stdin] #指定输出私钥的加密密码来源 -out <private-key-file> #输出私钥到文件,不指定则输出到stdout
查看私钥命令
openssl rsa -noout -text -in ca.key
例如:
1 生成一个长度为2048位的RSA私钥(含公钥):
openssl genrsa -out ca.key 2048
2 生成一个长度位2048位,并使用des3加密算法的私钥,密码为:1234
openssl genrsa -des3 -passout pass:1234 -out ca.key
3生成对应私钥的公钥文件
b>使用私钥生成证书签名请求(Certificate Signing Request,CSR)
openssl req -new #生成新的证书签名请求 -key <private-key> #在步骤1中生成的私钥 [-passin pass:<password> | -passin file:<path-name> | -passin env:<variable> | -passin fd:<file-descriptor> | -passin stdin] #指定所用私钥的密码 -subj '/C=<country>/ST=<province>/L=<locality>/O=<organiation>/OU=<organiation-unit>/CN=<common-name>/emailAddress=<email>' -out <csr-file> #输出证书请求到文件,不指定则输出到stdout
查看证书请求
openssl req -noout -text -in cert.csr
例如:
选项-subj指定证书所有人主体信息,如果证书用于网站,则其中的CN域必须指定为网站域名,其他域不是必填项。以下为*.wp.info生成证书签名请求 openssl req -new -key ca.key -subj '/C=CN/ST=ZheJiang/L=HangZhou/O=CompanyName/OU=DepartmentName/CN=*.wp.info-out wp.info.csr
为*.wp.info生成证书签名请求,同时指定之前生成私钥时所使用密码:
openssl req -new -key ca.key -passin pass:1234 -subj '/C=CN/ST=ZheJiang/L=HangZhou/O=CompanyName/OU=DepartmentName/CN= *.wp.info' -out wp.info.csr
c>生成自签名证书
区别:
>>openssl req –x509 需要使用-key指定私钥
>>openssl x509 –req 需要使用-signkey指定私钥
1、openssl req –x509 为证书请求文件签名并生成证书
openssl req -x509 #生成自签名证书,而不是证书请求 -days <days> #指定证书有效期天数 -md2 | -md5 | -sha1 | -sha256 | -sha512 #签名所用哈希算法 -key <private-key-file> -in <csr-file> -out <certificate-file>
查看证书信息
openssl x509 -noout -text -in cacert.pem
例如:
openssl req -x509 -days 365 -sha256 -key ca.key -in wp.info.csr -out wp.info.crt
2、openssl x509 –req
openssl x509 -req #输入内容为证书请求,而不是证书 -days <days> #指定证书有效期天数 -md2 | -md5 | -sha1 | -sha256 | -sha512 #签名所用哈希算法 -signkey <private-key-file> -in <csr-file> -out <certificate-file> #输出证书到文件,不指定则输出到stdout
例如:
openssl x509 -req -days 365 -sha256 -signkey ca.key -in wp.info.csr -out wp.info.crt
d>验证自签证书
openssl verify -CAfile ca.crt server.crt
自签CA根证书
1.1、生成CA私钥(ca.key)
openssl genrsa -out ca.key 2048 #生成一个长度为2048位的RSA私钥
openssl genrsa –des3 –passout pass:1234 -out ca.key #生成长度为2048位,并且使用des3加密算法的私钥,密码为:1234
genrsa:使用RSA算法生成私钥
-out:输出文件路径
2048:私钥长度
[-des3 | -aes128 | ...] #指定用于保护私钥的对称加密算
输入完命令会让你输入两遍私钥文件的密码
1.2、ca签发根证书请求文件(自签发根证书请求文件)
openssl req -new -key ca.key -out ca.csr
-subj '/C=<country>/ST=<province>/L=<locality>/O=<organiation>/OU=<organiation-unit>/CN=<common-name>/emailAddress=<email>'
openssl req -new -key server.key -passin pass:1234 -subj '/C=CN/ST=Shanghai/L=Shanghai/O=CompanyName/OU=DepartmentName/CN=*.wp.info' -out server.csr #为*.wp.info域名生成证书签名请求,同时需要指定之前生成私钥时所使用的密码
req:执行证书签发命令
-new:新的证书签发请求
-key:指定私钥文件的路径
-out:csr文件的输出路径
输入完命令会让你输入ca根证书私钥的密码并填写一些信息,如下所示:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
Country Name (2 letter code) [AU]:cn 【国家代码两个字母可为空,ca、server、client要一致】
State or Province Name (full name) [Some-State]:【省份,ca、server、client要一致】
Locality Name (eg, city) []:【城市】
Organization Name (eg, company) [Internet Widgits Pty Ltd]:【公司名,ca、server、client要一致】
Organizational Unit Name (eg, section) []:【组织名】
Common Name (e.g. server FQDN or YOUR name) []:【不可为空,全限定域名或名字】
Email Address []:【邮箱】
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:【输入密码】
An optional company name []:【可选的公司名】
1.3、生成自签名CA证书(ca.crt)
openssl x509 -req -days 3650 -in ca.csr -signkey ca.key -out ca.crt
x509:用于自签名证书,生成x509格式的证书
-req:请求签名
-days:证书有效期
-signkey:证书签发的私钥
-in:证书请求文件,有效的文件路径
-out:ca签名后的证书输出路径
或者:
openssl req -new -x509 -key ca.key -out ca.crt -days 3650
根据自签CA根证书制作Server端证书
使用以上ca证书签发
2.1 生成server端私钥
openssl genrsa -out server.key 2048
2.2 根据server私钥生成server端证书请求文件
openssl req -new -key server.key -out server.csr
openssl req -new -key server.key -out server.csr -subj '/C=CN/ST=Shanghai/L=Shanghai/O=CompanyName/OU=DepartmentName/CN=www.wp.info'
填写和ca根证书请求文件一样的信息,两者要保持一样
2.3使用CA根证书为server端签发证书
openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650
-in:输入证书签名请求文件 -out:签名后的证书输出路径 -cert:ca根证书 -keyfile:ca根证书私钥文件 -config:配置文件
2.3验证自签server证书
openssl verify -CAfile ca.crt server.crt
2.4 使用server证书测试单向认证
>终端1
[root@master1 ssl]# openssl s_server -accept 10000 -key server.key -cert server.crt
Using default temp DH parameters
ACCEPT
>终端2
openssl s_client -connect localhost:10000
连接成功后在任意一个窗口输入字符串会传输到另外一个窗口回显。
根据自签CA根证书制作client端证书
3.1生成client端私钥
openssl genrsa -out client.key 2048
3.2使用client私钥生成lclient端证书请求文件
openssl req -new -key client.key -out client.csr
3.3使用client证书请求文件生成自签名证书
openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650
3.4验证自签client证书
openssl verify -CAfile ca.crt client.crt
4.4使用server证书和客户端证书做双向测试
>终端1
[root@master1 ssl]# openssl s_server -accept 10000 -key server.key -cert server.crt -Verify 5 verify depth is 5, must return a certificate Using default temp DH parameters ACCEPT
>终端2
openssl s_client -connect localhost:10000 -cert client.crt -key client.key
通过控制台可以双向发送消息回显
其他openssl操作
open 命令选项 -text 解析原始内容,可以理解的输出方式 -noout 不输出原始内容 -in 指定输入内容的来源 -out 指定输出到文件,不指定则输出到stdout
3.1 查看证书签名请求信息
openssl req -text -noout -in <证书请求文件> openssl req -text -noout -in server.csr
3.2 使用openssl x509命令查看证书信息
openssl x509 -text -noout -in <证书文件> openssl x509 -text -noout -in server.crt
3.3 使用openssl rsa命令查看私钥信息
openssl rsa -text -noout -in <私钥文件> openssl rsa -text -noout -in server.key
3.4 生成pem格式的公钥
openssl x509 -in server.crt -out server.pem -outform PEM
3.5 验证server证书
openssl verify -CAfile ca.crt server.crt