ssl证书生成指南
*名词解析
- SSL:Secure Socket Layer,安全套接字层,它位于TCP层与Application层之间。提供对Application数据的加密保护(密文),完整性保护(不被篡改)等安全服务。
- TLS:Transport Layer Secure,提供安全的传输服务,十分灵活,可以使用在TCP上,也可以使用在UDP上,也可以使用在数据链路层上。
- 公钥:大家公用的,可以被其他人下载,用来加密和验章。
- 私钥:自己私有,须小心保存,用来解密和签章。
- 数字签名:将报文按双方约定的HASH算法计算得到一个固定位数的报文摘要。在数学上保证:只要改动报文中任何一位,重新计算出的报文摘要值就会与原先的值不相符。这样就保证了报文的不可更改性。将该报文摘要值用发送者的私人密钥加密,然后连同原报文一起发送给接收者,而产生的报文即称数字签名。
- 数字证书:数字证书就是互联网通讯中标志通讯各方身份信息的一系列数据,提供了一种在Internet上验证您身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构-----CA机构,又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份。数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。
- CA:Certificate Authority,证书授权中心。是一个单位,来管理发放数字证书的。由它发放的证书就叫 CA 证书,以区别于个人使用工具随意生成的数字证书,查看 CA 证书,里面有两项重要内容,一个是颂发给谁,另一个是由谁颂发的。
*常见证书格式类型
SSL证书主要的文件类型和协议有: PEM、DER、PFX、JKS、KDB、CER、KEY、CSR、CRT、CRL、OCSP、SCEP等。
DER
该格式是二进制文件内容,Java 和 Windows 服务器偏向于使用这种编码格式。
OpenSSL 查看:
openssl x509 -in certificate.der -inform der -text -noout
转换为 PEM:
openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
PEM
Privacy Enhanced Mail,一般为文本格式,以 -----BEGIN...
开头,以 -----END...
结尾。中间的内容是 BASE64 编码。这种格式可以保存证书和私钥,有时我们也把PEM 格式的私钥的后缀改为 .key 以区别证书与私钥。具体你可以看文件的内容。
这种格式常用于 Apache 和 Nginx 服务器。
OpenSSL 查看:
openssl x509 -in certificate.pem -text -noout
转换为 DER:
openssl x509 -in cert.crt -outform der -out cert.der
CRT
Certificate 的简称,有可能是 PEM 编码格式,也有可能是 DER 编码格式。如何查看请参考前两种格式。
PFX
Predecessor of PKCS#12,这种格式是二进制格式,且证书和私钥存在一个 PFX 文件中。一般用于 Windows 上的 IIS 服务器。改格式的文件一般会有一个密码用于保证私钥的安全。
OpenSSL 查看:
openssl pkcs12 -in for-iis.pfx
转换为 PEM:
openssl pkcs12 -in for-iis.pfx -out for-iis.pem -nodes
JKS
Java Key Storage,很容易知道这是 JAVA 的专属格式,利用 JAVA 的一个叫 keytool
的工具可以进行格式转换。一般用于 Tomcat 服务器。
*证书管理工具
openssl
OpenSSL 是一个开源项目,其组成主要包括一下三个组件:
- openssl:多用途的命令行工具
- libcrypto:加密算法库
- libssl:加密模块应用库,实现了ssl及tls
openssl可以实现:秘钥证书管理、对称加密和非对称加密 。
openssl安装:
# ubuntu
sudo apt install openssl -y
# centos
sudo yum install openssl -y
cfssl
CFSSL是CloudFlare开源的一款PKI/TLS工具。 CFSSL 包含一个命令行工具 和一个用于 签名,验证并且捆绑TLS证书的 HTTP API 服务。 使用Go语言编写。
cfssl安装:
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
mv cfssl_linux-amd64 /usr/local/bin/cfssl
mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
certbot
Let’s Encrypt提供了免费的证书申请服务,而官方客户端就是certbot。
certbot安装:
# ubuntu
sudo apt install certbot -y
# centos
sudo yum install epel-release -y
sudo yum makecache fast
sudo yum install certbot -y
*证书类型
client certificate
用于服务端认证客户端,例如etcdctl、etcd proxy、fleetctl、docker客户端
server certificate
服务端使用,客户端以此验证服务端身份,例如docker服务端、kube-apiserver
peer certificate
*证书文件约定
后缀
文件名
*证书生成
通过openssl生成证书
- 创建CA根证书
# 创建ca私钥
openssl genrsa -out ca.key 2048
# 创建csr(证书请求文件),其中-subj参数含义
# 参数 意义
# C 国家
# ST 省
# L 市
# O 组织名称
# OU 组织单元名称
# CN 命令名称(如果是服务器证书则写为域名)
openssl req -new -key ca.key -out ca.csr -subj "/C=CN/ST=BeiJing/L=BeiJing/O=jiaotong/OU=gaotie/CN=ROOTCA"
# 通过ca.csr签署ca根证书
openssl x509 -req -in ca.csr -out ca.pem -signkey ca.key -days 3650
- 创建服务器证书
# 创建服务器私钥文件
openssl genrsa -out server.key 2048
# 创建证书请求文件
# 其中输入的信息中最重要的为CN,这里输入的域名即为我们要使用https访问的域名。
# 同时也可以使用泛域名如*.gisuni.com来生成所有二级域名可用的网站证书
openssl req -new -out server.csr -key server.key -subj "/C=CN/ST=BeiJing/L=BeiJing/O=jiaotao/OU=gaotie/CN=www.gaotie.test"
# 创建服务器证书
openssl x509 -req -in server.csr -out server.pem -signkey server.key -CA ca.pem -CAkey ca.key -CAcreateserial -days 3650
- 校验证书
# 校验证书信息
openssl verify -CAfile ca.pem server.pem
- 查看证书
# 打印证书内容
openssl x509 -in server.pem -noout -text
# 打印出证书的系列号
openssl x509 -in server.pem -noout -serial
# 打印csr文件内容
openssl req -in server.csr -noout -text
- 创建客户端证书
# 创建客户端私钥文件
openssl genrsa -out client.key 2048
# 创建证书请求文件
openssl req -new -out client.csr -key client.key -subj "/C=CN/ST=BeiJing/L=BeiJing/O=jiaotong/OU=gaotie/CN=Client"
# 创建客户端证书
openssl x509 -req -in client.csr -out client.pem -signkey client.key -CA ca.pem -CAkey ca.key -CAcreateserial -days 3650
- 证书格式转换
# 把PEM格式(文本)的证书转化成DER格式(二进制)
openssl x509 -in server.pem -inform PEM -out server.der -outform DER
# 把证书转化成CSR文件
openssl x509 -x509toreq -in server.pem -out server-req.csr -signkey server.key
# 把PEM格式的证书转化为PFX格式证书
openssl pkcs12 -export -inkey server.key -in server.pem -out server.pfx
# 把PFX格式证书转化为PEM格式证书
openssl pkcs12 -in server.pfx -nodes -out server-pfx.cert
openssl rsa -in server-pfx.cert -out server-pfx.key
openssl x509 -in server-pfx.csr -out server-pfx.pem
通过cfssl生成pem证书
- 创建CA证书
# 生成ca配置文件、证书请求文件
cfssl print-defaults config >ca-config.json
cfssl print-defaults csr >ca-csr.json
# 修改ca-config.json后内容:
# 字段说明: profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个profile;
# signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
# server auth:表示client可以用该 CA 对server提供的证书进行验证;
# client auth:表示server可以用该CA对client提供的证书进行验证;
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"server": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"client auth"
]
}
}
}
}
# 修改ca-csr.json后
{
"CN": "GiStack CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
# 创建CA私钥和证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
# 生成三个文件
ca.csr(证书请求) ca-key.pem(私钥) ca.pem(证书)
- 创建服务器证书
# 创建服务器请求文件
cfssl print-defaults csr >server-csr.json
# 修改server-csr.json文件
# hosts 支持多个,可以为ip,单域名,泛域名
{
"CN": "gaotie",
"hosts": [
"www.gaotie.org",
"*.gaotie.com",
"172.17.10.100"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
# 创建服务器私钥和证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server
# 生成文件
server.csr server-key.pem server.pem
- 创建客户端证书
# 创建客户端请求文件
cfssl print-defaults csr >client-csr.json
# 修改client-csr.json文件
{
"CN": "client",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing"
}
]
}
# 创建客户端私钥证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client-csr.json | cfssljson -bare client
# 生成三个文件
client.csr client-key.pem client.pem
- 查看证书内容
# 查看服务器证书
cfssl-certinfo -cert server.pem
# 通过openssl查看证书内容
openssl x509 -in server.pem -noout -text
# 通过openssl校验证书
openssl verify -CAfile ca.pem server.pem
通过certbot申请letsencrypt签发的证书
前置条件
安装
# ubuntu
sudo apt install certbot -y
# centos
sudo yum install certbot -y
通过DNS申请证书
# 参数说明 更多详细介绍:https://certbot.eff.org/
## certonly 仅仅申请证书,不按照
## -d 申请域名,支持单域名和通配域名
## --manual 使用交互式或脚本钩子的方式获取证书
## --preferred-challenges 指定域名校验方式,支持dns,http,tls-sni-01
## --server 证书申请API地址
certbot certonly -d *.gaotie.dev --manual --preferred-challenges dns \
--server https://acme-v02.api.letsencrypt.org/directory
设置完成DNS TXT记录后,等待1分钟左右,按回车进行域名校验并签发证书。
证书管理
证书文件存储目录/etc/letsencrypt/live/域名