数字生活畅想家 为了更安全的网络环境 自建 CA 并自签发 SSL 证书
创作立场声明:希望大家能重视网络安全,不给犯罪分子可趁之机,互相学习。
Image by skylarvision from Pixabay
封面图片来自 skylarvision 托管于 Pixabay
为全力普及 HTTPS 各个浏览器厂商可谓是费尽心思、想方设法地让内容提供商摆脱 HTTP。由最先不显示到传输混合内容时显示不安全提示,再进一步到输入信息时显示不安全网页提示,最后干脆将所有 HTTP 页面标记为不安全。但目前还是随处可见各种 HTTP 网站不愿意切换,至于原因可能涉及到站长不理解 HTTPS 或不知道如何申请 SSL 证书,也可能是该站点已无人维护。
有很多人会说这个简单,直接用 Let's Encrypt 不就好了,网上各种全自动脚本一大把。Let's Encrypt 非常好,但有一些情况导致无法使用。第一是对站点没有管理权的情况(例如只是购买了一个空间,实际不能修改任何配置选项),其次就是该域名并不属于你本人所有。对于一些不使用或无法使用 80 端口的域名,Let's Encrypt 提供 DNS 验证,但也仅限于公网 DNS 发布的内容,对于内网 DNS 服务器所添加的条目自然不能认可。
好了,既然免费的 SSL 证书不能给自己用,那我自己给自己签证书总行了吧。当然可以,我们现在先创建一个最简单的证书并添加到 HTTP 配置中。
嗯?怎么还是提示不安全呢,服务器和浏览器之间通信已经被加密了,这是为什么?哦,原来操作系统并不信任这张证书,毕竟谁都不承认也没办法。那怎么解决呢,反正已经加密通信了。好,继续访问吧。
这时候问题就来了,第一次,第两次没问题。但有一天,家里某台电脑中毒,被某些别用用心的人控制了。他没事儿再翻你的上网记录时发现了这些自签发证书的网址,心机一动,用同样的信息,同样的内容给你新建了一张证书。待你晚上回家乖乖上套。等你辛辛苦苦忙了一天回到家里访问站点时,与往常一样的不安全提示,此时你已经习惯性的点了继续访问,殊不知你和服务器之间的所有交流都已经被人监控。
当然以上情景都是危言耸听,而且实际操作也没那么简单,但自签发的 SSL 证书确实有这个问题,不被任何人信任,当你有一大堆域名(ESXi、Firewall、Switch、NVR 还有一些 Web 服务器)需要签发证书时,一个个设备添加信任一张张证书实在是浪费时间。原因也很简单,每一张证书都是完全独立,而没有人进行证书的统一管理。
既然没有,我们自己造一个出来就是了,这就是 Catificate Authority 要做的事情了。我们所有签发的证书都属于自建的 Catificate Authority 管理,而我们只需要信任自己的 Catificate Authority 所签发的根证书即可。
第一步:建立 Catificate Authority
Windows 版:
cd && md myCAsignedcerts && md myCAprivate && cd myCA
echo '01'>serial && type nul > index.txt
notepad .myCAcaconfig.cnf
Linux 版:
cd && mkdir -p myCA/signedcerts && mkdir myCA/private && cd myCA
echo '01'>serial && touch index.txt
vim ~/myCA/caconfig.cnf
第二步:写入 Catificate Authority 配置文件并命名为 caconfig.cnf(本例仅供参考,详见 openssl.cnf)
[ ca ]
# 默认 CA 配置名称,可随意修改
default_ca = best_ca
# 第一节 [ CA 配置名称 ]
[ best_ca ]
# 指定 CA 根目录相对路径,这里需绝对路径,此处以 Linux 为例,Windows 请注意下面所有路径格式
dir = /home/tianhao/myCA
# 指定证书存放路径
certificate = $dir/cacert.pem
# 指定证书数据库路径
database = $dir/index.txt
# 指定新建签名证书存放路径
new_certs_dir = $dir/signedcerts
# 指定私钥存放路径
private_key = $dir/private/cakey.pem
# 指定证书序列号路径
serial = $dir/serial
# 指定默认证书吊销列表更新时间(个人用户可选无需更新吊销时间)
default_crl_days = 90
# 指定默认证书签发有效时间(根证书建议 3650 天,其他证书 365 - 1095 天)
default_days = 3650
# 指定默认证书加密方式(请勿使用 SHA256 以下算法)
default_md = SHA512
# 指定套用规则
policy = base_ca_policy
# 指定 X509 扩展信息
x509_extensions = best_ca_extensions
# 拷贝扩展信息
copy_extensions = copy
# 第二节 [ 规则名称 ]
[ base_ca_policy ]
# supplied 表示必填即可
# match 表示必须完全匹配
# optional 表示可选填写
commonName = supplied
stateOrProvinceName = match
countryName = match
localityName = optional
emailAddress = match
organizationName = match
organizationalUnitName = match
# 第三节 [ X509 扩展信息 ]
[ best_ca_extensions ]
basicConstraints = CA:true
nsCertType = server
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
# 第四节 [ req ]
[ req ]
default_bits = 4096
# 请注意文件路径是否存在
default_keyfile = $dir/private/cakey.pem
default_md = SHA512
# 是否显示询问对话框
prompt = no
# 指定构成字段,无需多次填写
distinguished_name = root_ca_distinguished_name
# 第五节 [ 构成字段 ]
[ root_ca_distinguished_name ]
# 这里指定 CA 机构显示名称
commonName = MyBestHome Root Certificate Authority
stateOrProvinceName = Shanghai
countryName = CN
localityName = Shanghai
emailAddress = my@example.com
organizationName = MyName
organizationalUnitName = MyBestHome
第三步:根据上一步创建的配置文件签发 CA 根证书(十年有效期)
Windows 版:
set OPENSSL_CONF=.myCAcaconfig.cnf
openssl req -x509 -newkey rsa:4096 -out cacert.pem -outform PEM -days 3650
Linux 版:
export OPENSSL_CONF=~/myCA/caconfig.cnf
openssl req -x509 -newkey rsa:4096 -out cacert.pem -outform PEM -days 3650
上述代码输入完成后将生成 cacert.pem 文件用户认证 CA 签发证书,只需将这个文件导入设备证书信任列表即可。
第四步:为其他域名签发 SSL 证书(新建配置文件为某域名签发证书,单独建立目录并保存文件为 域名.cnf)
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
# 是否显示询问对话框
prompt = no
[req_distinguished_name]
# 请务必注意必须满足 CA 规则要求(一致、必填、可选)
0.commonName = <替换为签发域名>
stateOrProvinceName = Shanghai
countryName = CN
localityName = Shanghai
emailAddress = my@example.com
organizationName = MyName
organizationalUnitName = MyBestHome
[v3_req]
basicConstraints = CA:FALSE
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
第五步:依据上述各个域名的配置签发证书
Linux 版:
export OPENSSL_CONF=~/myCA/domain/<域名>.cnf
openssl req -out wap_csr.pem -newkey rsa:2048 -nodes -keyout wap_key.pem
-reqexts SAN -extensions SAN
-config <(cat ~/myCA/domain/<域名>.cnf
<(printf '[SAN]nsubjectAltName=DNS:<域名>,DNS:localhost'))
-sha512
第六步:批准
Windows 版:
set OPENSSL_CONF=.myCAcaconfig.cnf
openssl ca -in <域名>_csr.pem -out <域名>_crt.pem
Linux 版:
export OPENSSL_CONF=~/myCA/caconfig.cnf
openssl ca -in <域名>_csr.pem -out <域名>_crt.pem
!!!证书签发到此为止已经完成!!!
第七步:吊销证书(请必须保留签发后的证书文件,比直接通过序号吊销来得简单)
openssl ca -revoke wap_crt.pem
第八步:生成吊销证书列表(一般情况无需理会,需提供 HTTP 访问该文件并在配置文件中加入该地址)
openssl ca -gencrl -out crl.pem openssl crl -in crl.pem
吊销证书列表用于防止因 CA 密钥或证书失密导致的无效证书可被继续使用的问题,但需要一个长期可供访问的 HTTP 站点比较麻烦,本章没有配置 CRL。
裕哥裕哥
校验提示文案
黑发挥发灰
校验提示文案
wlhwlh
校验提示文案
园绮羽露
校验提示文案
wlhwlh
校验提示文案
园绮羽露
校验提示文案
黑发挥发灰
校验提示文案
裕哥裕哥
校验提示文案