当前位置: 首页 > 虚拟化 > [企业CA系列一]搭建企业根CA和中间CA

[企业CA系列一]搭建企业根CA和中间CA

虚拟化 0条评论 2020-5-25 2,816 views

在开始搭建之前,我们先了解一些基础知识,这对后续的企业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证书组成证书信任链。

证书信任概述

  1. 操作系统中默认会存储受信任的根证书颁发机构(RapidSSL、Symantec SSL、GlobalSign ……),浏览器访问站点,会通过系统已存在的根证书验证,并判断所访问网站的证书是否有效;
  2. 如果自行搭建企业CA,就可以将企业CA添加到本地计算机的“受信任根证书颁发机构”中,这样企业CA颁发的证书也会被浏览器所信任;
  3. VMware产品(eg:vCenter、vSphere、NSX-T、……)本身也有受信任证书的存储,如果我们把企业CA根证书添加到其受信任存储中,那么VMware产品也会信任所有企业CA签发的证书;
  4. 使用企业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,大至流程如下:

  1. 搭建企业CA;
  2. 搭建中间CA;
  3. 将企业CA根证书添加到终端系统(Windows、Linux、MacOS)受信任存储中;
  4. 后续文章介绍如何替换VMware相关产品证书。
工具用途下载地址
CFSSL企业CA和证书管理工具(CLI)CFSSL download
Linux证书操作客户端(CLI)N/A
Vault(可选)企业CA管理工具(Web和CLI)Vault download
PostmanNSX-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.pemroot-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添加:

  1. 运行mmc命令
  2. 文件->添加/删除管理单元
  3. 在左侧可用管理单元创建中找到证书
  4. 添加->计算机账户->本地计算机,点击确定
  5. 证书->个人->受信任的证书颁发机构->证书
  6. 导入 /root/ca/root-ca.pem/root/intermediate/corp/corp-ca.pem两个证书

使用命令行添加:

certutil -addstore -f "ROOT" root-ca.pem

(Horizon 桌面——组策略)添加根证书到Windows的“受信任根证书颁发机构”

  1. 进入到域控制器的组策略管理器
  2. 编辑Horizon桌面的计算机组策略(我的计算机策略和用户策略是分开管理的)
  3. 计算机配置->策略->Windows 设置->安全设置->公钥策略->受信任的根证书颁发机构
  4. 导入 /root/ca/root-ca.pem/root/intermediate/corp/corp-ca.pem两个证书
  5. 管理组策略编辑器
  6. 运行gpupdate /force更新组策略
  7. 客户端电脑等待组策略更新,或者运行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签发证书为其他系统提供服务。


发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注