编程技术记录

世界你好!

签发类型

根据签发机构类型,TLS证书签发可以划分为两种:

  • 公信CA(Certificate Authority)签发的证书(如DigiCert、Let’s Encrypt、Sectigo等)
  • 企业内部私有CA签发的证书

公信CA签发与企业内部私有CA签发,两者的区别是公信力不同。一般情况下,互联网环境不应信任企业内部私有CA签发的证书。

下面主要详细说明最常见的公信CA签发域名验证(DV)、组织验证(OV)、扩展验证(EV)证书的过程,以及全网最流行的免费证书Let’s Encrypt为例的自动化流程。

公信CA签发证书的通用流程(DV/OV/EV)

  1. 生成CSR(Certificate Signing Request,证书签名请求)

    • 在你的服务器上首先生成一对密钥:私钥(private key)和公钥(public key)。
    • 使用私钥生成CSR文件,CSR里包含了:
      • 域名(Common Name 或 SAN 列表)
      • 组织信息(OV/EV证书需要)
      • 公钥
      • 国家、省份、城市、公司名称等(OV/EV需要)
    • 常用命令(OpenSSL):
      openssl req -new -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr
  2. 选择CA并提交申请

    • 登录CA官网(或通过ACME协议自动化),选择证书类型(DV/OV/EV)、有效期。
    • 上传CSR(或者有些CA让你直接在网页填写信息后帮你生成)。
  3. 域名控制权验证(DCV,Domain Control Validation)
    这是所有公信证书都必须完成的步骤,证明你确实控制这个域名。常见三种方式:

    • HTTP验证(最常见):CA给你一段随机token,你需要在域名下 .well-known/acme-challenge/ 路径放一个特定文件
      示例:http://yourdomain.com/.well-known/acme-challenge/xxxxxx
    • DNS验证:CA给你一段TXT记录,你需要在域名DNS管理面板添加 _acme-challenge.yourdomain.com TXT "xxxxxx"
    • Email验证(较少用):给域名whois邮箱或管理员邮箱(如admin@、webmaster@)发邮件,点链接确认

    DV证书只做这一步;OV/EV还要额外验证组织合法性。

  4. (OV/EV专属)组织信息验证

    • 核实公司工商注册信息(通过第三方数据库如Dun & Bradstreet)
    • 核实营业执照、法人身份
    • 电话回访确认申请人身份和授权
    • 验证域名管理权归属公司(whois + 额外证明文件)
  5. CA签发证书

    • CA用自己的中间证书或根证书的私钥,对你的公钥+域名+有效期等信息进行签名,生成证书文件(.crt 或 .pem)
    • 同时会下发CA链证书(中间证书 bundle,参考下面附录)
  6. 下载并安装证书

    • 你把证书、公钥、私钥安装到Web服务器(Nginx/Apache/IIS等)
    • 重启服务,以使证书生效

最常见的自动化签发:Let’s Encrypt(ACME协议)

Let’s Encrypt是目前全球使用量最大的免费CA,90天有效期,完全自动化。

常用客户端:Certbot、acme.sh、win-acme、lego 等。以acme.sh为例的全自动流程:

# 1. 安装acme.sh
curl https://get.acme.sh | sh

# 2. 切换到Let’s Encrypt(默认就是)
acme.sh --set-default-ca --server letsencrypt

# 3. 签发证书(两种主流验证方式任选其一)

# 方法A:HTTP验证(需要80端口开放)
acme.sh --issue -d example.com -d www.example.com --webroot /var/www/html

# 方法B:DNS验证(推荐,停机也可续期)
acme.sh --issue -d example.com --dns dns_cf   # 以Cloudflare为例,会自动调用API添加TXT记录

# 4. 安装证书到Nginx/Apache
acme.sh --install-cert -d example.com \
--key-file /etc/nginx/ssl/example.key \
--fullchain-file /etc/nginx/ssl/example.cer \
--reloadcmd "nginx -s reload"

整个过程几秒到几十秒完成,无需人工干预,每60天自动续期。

证书签发后链路示意

用户浏览器 ←HTTPS→ 你的服务器(证书+私钥)
           ↑
        验证链:
你的证书 → CA中间证书 → 根证书(已预装在操作系统/浏览器中)

总结对比表

类型 验证内容 签发时间 有效期 价格 典型用途
DV证书 仅域名控制权 几秒~几分钟 90天~1年 免费~几百元 普通网站、博客
OV证书 域名+组织合法性 1~5个工作日 1~2年 几百~几千元 企业官网、电商
EV证书 域名+严格组织验证 5~10个工作日 1~2年 千元以上 银行、金融、大型电商
Let’s Encrypt 域名控制权(DV) 几秒~1分钟 90天 完全免费 绝大多数互联网网站

附录:CA链证书

简单来说:CA链证书就是“中间证书”,它是连接你的网站证书和浏览器信任的根证书之间的“桥梁”。如果没有正确安装链证书,用户访问你的HTTPS网站时就会报错(最常见的是“NET::ERR_CERT_AUTHORITY_INVALID”或“证书不受信任”)。

为什么需要链证书?(信任链原理)

为什么公信CA(包括Let’s Encrypt、DigiCert、GlobalSign等)坚决不直接用根证书私钥(Root Private Key)去签发终端用户证书?原因非常明确,一共就这几条,但每一条都是致命的:

理由 如果直接用根私钥签发终端证书,后果会怎样? 真实案例(已经发生过)
1. 根私钥一旦泄露,整个生态瞬间崩塌 攻击者可以随意给自己或任何人签发看起来100%合法的证书,伪造全球任意网站(银行、Google、苹果等),MITM攻击无法被发现。全球数亿网站同时不安全。 2011年 DigiNotar(荷兰CA)根私钥被伊朗黑客盗取 → 伪造了Google、Yahoo、WordPress等500+证书 → 整个CA直接破产,被所有浏览器永久拉黑。
2015年 Symantec不当签发测试证书 → 根信任被Chrome逐步移除。
2. 根私钥必须永久离线,日常无法使用 根私钥通常保存在物理保险柜 + HSM硬件安全模块 + 多方仪式中,启动一次需要多位高管同时到场、插多把实体钥匙。根本不可能每天拿来签发几十万张证书。 Let’s Encrypt的根ISRG Root X1从2015年生成后,私钥就再也没有在联网设备上出现过。
3. 根证书撤销几乎不可能 如果根被污染,唯一办法是让所有浏览器和操作系统永久移除这个根,代价极其高昂(用户需要升级系统/浏览器)。而中间证书被污染,只需要撤销那一个中间证书就行,影响面小1000倍。 2024年有人发现某个小CA的中间证书被滥用,浏览器只撤销了那张中间证书,用户几乎无感知。
4. 可以灵活撤销和轮换 中间证书可以1~5年更换一次(Let’s Encrypt中间证书就换过好几次),根证书却要用20~30年。出了问题只换中间就行,不影响根的长期信任。 DigiCert、GlobalSign每年都会轮换若干中间证书,就是为了降低风险。
5. 符合国际标准和浏览器强制要求 Baseline Requirements(CA/Browser Forum规定)和所有主流浏览器(Chrome、Firefox、Safari、Edge)明确禁止根私钥直接签发终端实体证书,违反者直接除根。 任何被发现直接用根签终端证书的CA,会在几天内被所有浏览器除根(等于商业死亡)。

所以现代公信CA为了安全,绝不直接用根证书私钥去签发终端用户证书,而是采用分层结构:

根证书(Root CA)
    └── 中间证书1(Intermediate CA)   ← CA用根私钥签发
            └── 中间证书2(Intermediate CA)   ← 用中间1签发
                    └── 你的网站证书(Leaf Certificate) ← 用中间2签发
  • 根证书:预装在操作系统和浏览器里(DigiCert、GlobalSign、Let’s Encrypt的根叫ISRG Root X1等),数量很少,私钥离线保存在保险柜里,几乎永不使用。
  • 中间证书:CA用根私钥签发的证书,中间证书的私钥才真正用来签发你的网站证书。
  • 你的网站证书(叶子证书):只包含你的域名和公钥。

浏览器验证证书时会沿着这条链一层层往上验证,直到找到自己信任的根证书为止。

实际拿到的证书文件通常有这几种

  1. 你的网站证书(也叫leaf证书、end-entity证书)
    文件名通常是:yourdomain.crtyourdomain.pemcertificate.crt

  2. 链证书 / 中间证书(最重要的就是这个)
    可能有1~3个中间证书串在一起,常见文件名:

    • chain.crtca-bundle.crtintermediate.crtfullchain.pem
  3. 根证书(一般不需要你提供)
    浏览器自己有,不需要放在服务器上。

如何撤销中间证书

中间证书(Intermediate CA)一旦被发现有安全问题、被滥用、私钥泄露、CA违规等,必须立即撤销。

谁有权力、谁来执行撤销?

角色 职责
发行该中间证书的根CA 决定是否撤销、生成CRL或OCSP
浏览器/操作系统厂商 Chrome、Firefox、Microsoft、Apple、Mozilla 决定是否接受并强制执行
CA/Browser Forum 制定最晚撤销期限(通常5~7天)

实际撤销的技术方式(都必须同时做)

  1. CRL(Certificate Revocation List,证书吊销列表)

    • 根CA或上一级中间CA用自己的私钥签名一个列表,里面列出被撤销的证书序列号
    • 文件通常放在 http://crl.exampleca.com/xxx.crl
    • 缺点:体积大,浏览器很少真正下载检查(基本被淘汰)
  2. OCSP(Online Certificate Status Protocol,在线证书状态协议)

    • 实时查询:浏览器问 OCSP Responder:“序列号为12345的证书还好吗?”
    • 回应:Good / Revoked / Unknown
    • 现在是主流,所有正规CA都必须提供OCSP服务
  3. OCSP Must-Staple(强制 stapling)

    • 证书签发时就加上一个扩展,要求服务器必须在TLS握手中附带OCSP响应
    • Let’s Encrypt、DigiCert 等主流CA默认都开启
    • 一旦中间证书被撤销,所有使用该中间证书签发的网站都会立刻变红锁(几小时内)

发表回复