CSR 手动申请 SSL 证书与 DNS 配置
CSR 手动申请 SSL 证书与 DNS 配置 折腾的新方式,好好的免费自动化更新的 acme.sh 不用,白得个一年有效期 ssl 证书的就硬是要去申请,又成功地虚度了一天 hu~ 什么是 CSR ? Certificate Signing Request, CSR 是用来为本地生成的 ssl 证书签名的一种方式,本质上它是一段纯文本,里面包含了 ssl 证书的公钥与签名所需的附加信息,把它提交给 Certificate Authority 证书签名机构后即可生成公共可用的证书。 一般来说,浏览器会内置一个受信任的证书签名机构列表,通过这些机构的签名才会被认为是有效的,否则会提示证书无效,例如本地生成的证书无效。大致上 CA 机构应该会使用自己的公私钥给 CSR 提交的内容签名,这样加密后的文本就成了我们的 ssl 公共证书,浏览器使用信任列表机构的公钥进行验证,如果验证通过则表明该证书有效。 CSR 请求里通常会包含一些必需的信息,比如域名、位置和组织等等。 CN Common name 指证书的主要域名,泛域名为星号前缀,如 *.exp.orgC Country 国家代码,如中国 CN。参考 countrycodeST Test State or Province 州或省,如浙江 Zhejiang 或 ZJL Test Locality 具体位置,不因该缩写,如杭州 HangzhouO Organization Name 组织名称,也可以是公司名称OU Organizational Unit Name 组织单位名,比如技术部 ITemailAddress 邮件地址,可选 多域名支持需要用到证书扩展 Subject Alternative Name, SAN。 subjectAltName 指定多域名,如 subjectAltName=DNS:exp.org,DNS:*.exp.org 还有个比较通用的扩展 certificatePolicies 懒得仔细研究了。 通过 openssl 生成 CSR 请求 OpenSSL v1.1.1+ 版本才支持扩展 -addext $ # 这里生成的 *.key 文件就是服务器要配置的私钥 $ openssl req -new -nodes -newkey ec:<(openssl ecparam -name secp384r1) \ -keyout exp_org.key -out exp_org.csr \ -subj "/CN=exp.org/C=CN/ST=Zhejiang/L=Hangzhou/O=Tao, Ltd/OU=Tec" \ -addext "subjectAltName=DNS:www.exp.org,DNS:*.exp.org" $ $ # x509 新版本支持日期 $ openssl req -new -x509 -days 365 -addext "certificatePolicies=1.2.3.4" $ openssl req -in exp_org.csr -text -noout Certificate Request: Data: Version: 1 (0x0) Subject: CN = lk96.me, C = CN, ST = Zhejiang, L = Hangzhou, O = "Tao, Ltd", OU = Tec ... Attributes: Requested Extensions: X509v3 Subject Alternative Name: DNS:DNS:www.exp.org,DNS:*.exp.org Signature Algorithm: ecdsa-with-SHA256 ... $ # CSR 内容 $ cat exp_org.csr -----BEGIN CERTIFICATE REQUEST----- ... -----END CERTIFICATE REQUEST----- DNS 设置 除了提交 CSR 之后,还需要进行域名验证,有很多方式,一般支持自动续期话的只要配置个 CNAME 解析到 CA 机构的某个域名地址即可。 DNSSEC 配置 DNSSEC 可以有效防止 DNS 劫持。需要到域名注册商配置,如果修改了 NS 记录到其它解析服务商,开启 DNSSEC 后要把 DS 记录配置到注册商那里。 Key Tag 密钥标记,如 2173Digest Type 摘要类型,如 2 # DS 记录 exp.org. 3600 IN DS 2371 13 2 1966904E0692B0B3E339AE5BEFD5394C96E82232CD9E3E3CC3B364FA3CACD70A 下载 SSL 证书 签名机构验证域名通过后,就可以下载证书了,这时候我们可能会得到 2 个文件,一个是域名证书,另一个是证书机构的证书链,把两个合并后才是我们公共可用的证书。 $ cat exp_org.cer ca.cer > exp_org_full.cer 之前通过 openssl 生成的 exp_org.key 就是证书私钥。 # 服务器配置 server { listen 443 ssl h2; ssl_certificate /path/exp_org_full.cer; ssl_certificate_key /path/exp_org.key; } 最后在浏览器查看证书的时候,居然给我提示组织名不是证书的一部分,而且通配符域名也没了,王得发~辣鸡,花钱是不可能花钱的 参考链接 What is a Certificate Signing Request (CSR)?What is DNSSEC?
JavaScript全屏阅读