在开始搭建之前,我们先了解一些基础知识,这对后续的企业CA搭建、签名证书、证书链的理解非常重要。
HTTP、HTTPS、SSL、TLS概述
HTTP是一个网络协议,是专门用来传输Web内容,大部分网站都是通过HTTP协议来传输Web页面、以及Web页面上包含的各种资源(图片、CSS 样式、JS 脚本)。
SSL是“Secure Sockets Layer”的缩写,中文叫做“安全套接层”。它是在上世纪90年代中期,由网景公司设计的。为什么要发明 SSL 这个协议捏?因为原先互联网上使用的HTTP协议是明文的,存在很多缺点——比如传输内容会被偷窥(嗅探)和篡改。发明SSL协议,就是为了解决这些问题。
TLS是SSL的标准化,SSL标准化之后的名称改为TLS(是“Transport Layer Security”的缩写),中文叫做“传输层安全协议”。
HTTPS协议,就是“HTTP 协议”和“SSL/TLS 协议”的组合。你可以把 HTTPS 大致理解为“HTTP over SSL”或“HTTP over TLS”。
什么是CA
CA或证书颁发机构是允许生成带有签名的证书,以便在TLS通信器件使用,如果您访问HTTPS网站,就会使用TLS。TLS允许使用安全密钥和证书对通信进行加密和解密。对于网络安全而言,这非常重要。
为什么要建立企业CA
企业CA并不是必须的,目前企业软件部署是都会自动使用自签名证书,也是安全加密的访问方式。但如下的场景下企业CA就显得很重要:
- 全球推行HTTPS的背景下,浏览器逐步开始实施HTTP不安全警告(如果是HTTPS自签名证书,一样会警告),这将严重影响使用者的体验。为保证数据安全,目前全球的大网站几乎全部采用HTTPS;
- 企业内部系统很难使用外部签发的证书,一方面成本高,另一方面签发时间短,频繁更换证书对运维和应用来说是噩梦;
- 自签名证书很难进行集中管理;
- 类似Kubernetes平台都需要证书支持,在DevOps背景下,证书的自动化需求越来越多,自签名显然无法满足未来的发展;
当然,什么事情都是两面性的,一旦通过企业CA签发证书,企业CA自身的安全就非常重要,一定要保证企业根(Root)CA的安全性,应该多次加密后,再拆分保存。
根CA和中间CA之间的区别
根CA是最重要的,它允许生成中间CA、直接签署证书,因此作为最佳实践,我们应该通过根CA创建中间CA,然后将根CA安全的保存起来,平时使用中间CA签发证书。根CA证书与中间CA证书组成证书信任链。
证书信任概述
- 操作系统中默认会存储受信任的根证书颁发机构(RapidSSL、Symantec SSL、GlobalSign ……),浏览器访问站点,会通过系统已存在的根证书验证,并判断所访问网站的证书是否有效;
- 如果自行搭建企业CA,就可以将企业CA添加到本地计算机的“受信任根证书颁发机构”中,这样企业CA颁发的证书也会被浏览器所信任;
- VMware产品(eg:vCenter、vSphere、NSX-T、……)本身也有受信任证书的存储,如果我们把企业CA根证书添加到其受信任存储中,那么VMware产品也会信任所有企业CA签发的证书;
- 使用企业CA签发的证书替换掉VMware产品的自签名证书,以使浏览器信任企业CA签名证书;
证书编码格式和证书签名请求(CSR)
目前证书主要有两种编码格式,PEM和DER:
PEM(Privacy Enhanced Mail),通常用于数字证书认证机构(Certificate Authorities,CA),扩展名为.pem, .crt, .cer, 和 .key。内容为Base64编码的ASCII码文件,有类似"-----BEGIN CERTIFICATE-----" 和 "-----END CERTIFICATE-----"的头尾标记。服务器认证证书,中级认证证书和私钥都可以储存为PEM格式(认证证书其实就是公钥)。Apache和nginx等类似的服务器使用PEM格式证书。
DER(Distinguished Encoding Rules),与PEM不同之处在于其使用二进制而不是Base64编码的ASCII。扩展名为.der,但也经常使用.cer用作扩展名,所有类型的认证证书和私钥都可以存储为DER格式。Java使其典型使用平台。
CSR(Certificate Signing Request),他是向CA机构申请数字证书时使用的请求文件。在生成请求文件前,我们需要准备一对对称密钥。私钥信息自己保存,请求中会附上公钥信息以及国家,城市,域名,Email等信息,CSR中还会附上签名信息。当我们准备好CSR文件后就可以提交给CA机构,等待他们给我们签名,签好名后我们会收到pem/crt文件,即证书。
相关软件和工具
通过上面的概念介绍后,下面需要准备相关的工具和软件,用于搭建企业CA,大至流程如下:
- 搭建企业CA;
- 搭建中间CA;
- 将企业CA根证书添加到终端系统(Windows、Linux、MacOS)受信任存储中;
- 后续文章介绍如何替换VMware相关产品证书。
工具 | 用途 | 下载地址 |
---|---|---|
CFSSL | 企业CA和证书管理工具(CLI) | CFSSL download |
Linux | 证书操作客户端(CLI) | N/A |
Vault(可选) | 企业CA管理工具(Web和CLI) | Vault download |
Postman | NSX-T 3.0 证书安全配置工具 |
提示:正如前面介绍,私钥的安全管理非常重要,这里面推荐通过Vault软件进行日常证书的签发和私钥管理,由于文章篇幅原因,会在本系列的后期,介绍Vault的部署和使用。
下载并安装 CFSSL 工具
CFSSL是CloudFlare开源的一款PKI/TLS工具,CFSSL包含一个命令行工具和一个用于签名、验证并且捆绑TLS证书的HTTP API服务,程序使用Go语言编写,部署和升级都非常简单。 CFSSL Github 地址
yum install -y wget curl
wget https://github.com/cloudflare/cfssl/releases/download/v1.4.1/cfssl_1.4.1_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.4.1/cfssljson_1.4.1_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.4.1/cfssl-certinfo_1.4.1_linux_amd64
chmod +x cfssl_1.4.1_linux_amd64
chmod +x cfssljson_1.4.1_linux_amd64
chmod +x cfssl-certinfo_1.4.1_linux_amd64
mv cfssl_1.4.1_linux_amd64 /usr/local/bin/cfssl
mv cfssljson_1.4.1_linux_amd64 /usr/local/bin/cfssljson
mv cfssl-certinfo_1.4.1_linux_amd64 /usr/local/bin/cfssl-certinfo
CFSSL 工具子命令介绍
- bundle: 创建包含客户端证书的证书包
- genkey: 生成一个key(私钥)和CSR(证书签名请求)
- scan: 扫描主机问题
- revoke: 吊销证书
- certinfo: 输出给定证书的证书信息, 跟cfssl-certinfo 工具作用一样
- gencrl: 生成新的证书吊销列表
- selfsign: 生成一个新的自签名密钥和 签名证书
- print-defaults: 打印默认配置,这个默认配置可以用作模板
- serve: 启动一个HTTP API服务
- gencert: 生成新的key(密钥)和签名证书 -ca:指明ca的证书 -ca-key:指明ca的私钥文件 -config:指明请求证书的json文件 -profile:与-config中的profile对应,是指根据config中的profile段来生成证书的相关信息
- info: 获取有关远程签名者的信息
- sign: 签名一个客户端证书,通过给定的CA和CA密钥,和主机名
准备证书存储目录
为清晰区分根CA、中间CA和证书,推荐创建以下目录结构,其中 /root/ca 目录用于存储根CA(Root CA), /root/intermediate 用于存储中间CA(intermediate CA), /root/intermediate/corp 用于存储corp域的中间CA证书, /root/certs 用于存储签发的证书, /root/certs/corp 用于存储corp域签发的证书。
Root CA非常重要,不推荐直接使用Root CA签发证书,也不推荐明文保存Root CA,建议在签发中间CA后,加密保存Root CA。 intermediate CA用于签发证书,可以基于不同的域进行规划,并配置不同的证书有效期。 有了中间CA后,会引出证书链的问题,在导入证书时,需包含完整证书链(根证书在最下)。
/root
/ca
/intermediate
/corp
/vmware
/certs
/corp
创建企业根(Root)CA和企业中间(Intermediate)CA
创建Root CA证书请求
CFSSL通过json文件声明CSR,您可以自定义信息、加密算法和过期时间。
- "CN": 通用名,一般出现在证书的颁发机构中,需要清晰描述,且不能与根CA证书相同;
- "key": 加密算法,VMware产品使用RSA 2048;
- "names": 指定证书相关属性信息;
- "C": 两位国家代码
- "L": 城市
- "O": 组织
- "OU": 组织单元
- "ST": 省
- "expiry": 证书有效期
cat <<EOF > /root/ca/root-ca-csr.json
{
"CN": "Corp Root CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Changchun",
"O": "VMware",
"OU": "DevOps",
"ST": "Jilin"
}
],
"ca": {
"expiry": "262800h"
}
}
EOF
生成根(Root) CA证书
使用 cfssl gencert 命令生成根(Root)CA证书
cd /root/ca
cfssl gencert -initca root-ca-csr.json | cfssljson -bare root-ca
ls
会自动生成三个文件:
- root-ca.csr (证书申请文件,暂时无用)
- root-ca.pem (证书)
- root-ca-key.pem (证书密钥)
其中, root-ca.pem 是公开的,用于操作系统或应用系统添加根证书信任, root-ca-key.pem是Root CA的私钥,需要保证其安全,不要与其他人共享或者存储到公共的空间中,因为如果有人拿到root-ca.pem和root-ca-key.pem就可以自己签发证书了。
生成Corp Intermediate Root CA证书
正如文章前面提高的,直接使用Root CA签发证书是非常危险的,因为你有可能把私钥泄漏出去(签发证书时需要使用私钥),所以强烈推荐创建中间CA,并通过中间CA签发证书。
/root/intermediate/corp/config.json相关配置
- "usages": 描述此证书具备哪些能力;
- "expiry": 描述证书有效期;
- "ca_constraint": 声明此证书是一个CA证书,能够签发证书。
/root/intermediate/corp/vmware-ca-csr.json相关配置
- "CN": 通用名,一般出现在证书的颁发机构中,需要清晰描述,且不能与根CA证书相同;
- "key": 加密算法,VMware产品使用RSA 2048;
- "names": 指定证书相关属性信息;
- "C": 两位国家代码
- "L": 城市
- "O": 组织
- "OU": 组织单元
- "ST": 省
cd /root/intermediate/corp
cat <<EOF > /root/intermediate/corp/config.json
{
"signing": {
"default": {
"usages": ["digital signature","key encipherment","cert sign","crl sign","signing","server auth","client auth"],
"expiry": "175200h",
"ca_constraint": {"is_ca": true, "max_path_len": 0, "max_path_len_zero": true}
}
}
}
EOF
cat <<EOF > /root/intermediate/corp/corp-ca-csr.json
{
"CN": "Corp Intermediate CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Changchun",
"O": "VMware",
"OU": "DevOps",
"ST": "Jilin"
}
],
"ca": {
"expiry": "175200h"
}
}
EOF
cfssl genkey -initca corp-ca-csr.json | cfssljson -bare corp-intermediate-ca
cfssl sign -ca ../../ca/root-ca.pem -ca-key ../../ca/root-ca-key.pem --config config.json corp-intermediate-ca.csr | cfssljson -bare corp-intermediate-ca
cat corp-intermediate-ca.pem ../../ca/root-ca.pem >> corp-intermediate-ca-bundle.pem
现在 /root/intermediate/corp/ 目录下应该已经存在了中间 CA的证书和私钥:
- corp-intermediate-ca.pem
- corp-intermediate-ca-key.pem
- corp-intermediate-ca-bundle.pem (证书链,后续使用)
当然,您可以根据企业自身的需求,创建不同的中间CA,以实施不同的证书管理策略。
现在,当我们有了中间CA的证书和私钥时,根证书(Root CA)的私钥就可以进行多次加密。或者,打印出来,把纸张分成8份,存储到不同的保险柜中^_^
添加根证书到Windows的“受信任根证书颁发机构”
使用图形UI添加:
- 运行mmc命令
- 文件->添加/删除管理单元
- 在左侧可用管理单元创建中找到证书
- 添加->计算机账户->本地计算机,点击确定
- 证书->个人->受信任的证书颁发机构->证书
- 导入 /root/ca/root-ca.pem 和 /root/intermediate/corp/corp-ca.pem两个证书
使用命令行添加:
certutil -addstore -f "ROOT" root-ca.pem
(Horizon 桌面——组策略)添加根证书到Windows的“受信任根证书颁发机构”
- 进入到域控制器的组策略管理器
- 编辑Horizon桌面的计算机组策略(我的计算机策略和用户策略是分开管理的)
- 计算机配置->策略->Windows 设置->安全设置->公钥策略->受信任的根证书颁发机构
- 导入 /root/ca/root-ca.pem 和 /root/intermediate/corp/corp-ca.pem两个证书
- 管理组策略编辑器
- 运行gpupdate /force更新组策略
- 客户端电脑等待组策略更新,或者运行gpupdate /force强制更新
添加根证书到MacOS的"受信任根证书颁发机构"
sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ~/root-ca.pem
添加根证书到Linux的"受信人根证书颁发机构"
Ubuntu 18.04(测试通过)
sudo cp /root/ca/root-ca.pem /usr/local/share/ca-certificates/root-ca.crt
sudo update-ca-certificates
CentOS 7(测试通过)
cp /root/ca/root-ca.pem /etc/pki/ca-trust/source/anchors/
update-ca-trust
Photon OS 3.0(测试通过)
cat root-ca.pem /etc/pki/tls/certs/ca-bundle.crt
/usr/bin/rehash_ca_certificates.sh
附录1:证书格式转换
如果您需要der/.crt格式的证书,可以使用OpenSSL工具转换证书格式,下面是转换命令示例。
openssl x509 -outform der -in certificate.pem -out certificate.crt
完成
至此,我们已经完成企业根CA和中间CA的搭建,后续将对VMware产品实施证书替换。当然,您可以使用企业中间CA签发证书为其他系统提供服务。