如何生成和使用自签名证书
如何生成和使用自签名证书
1 | 作者:李晓辉 |
环境介绍
操作系统 | IP地址 | 主机名 | NGINX版本 | 角色 |
---|---|---|---|---|
Rocky9.4 | 192.168.8.3 | loadbalance.xiaohui.cn | 1.26.2 | 负载均衡 |
引言
在互联网安全性日益重要的今天,使用 SSL/TLS 证书来加密数据传输已经成为保护用户隐私和数据完整性的标准做法。自签名证书是一种简便的方法,用于开发、测试和内部应用中,提供加密通信,而不依赖于第三方认证机构(CA)。尽管自签名证书在生产环境中的使用受限,但它们在许多场景中依然具有重要价值。
我这个文章主要演示如何生成和使用自签名证书,帮助你在实际项目中更好地理解和应用这一技术。通过详细的步骤和示例,我将带你一步步完成从生成私钥到配置 Web 服务器使用自签名证书的整个过程。
什么是自签名证书?
自签名证书是一种由用户自己创建并签署的 SSL/TLS 证书。与由认证机构(CA)签发的证书不同,自签名证书不依赖于第三方的验证和信任链,完全用自己的资源实现。
优势
成本低:生成自签名证书是免费的,不需要支付认证机构的费用。
立即可用:不需要等待第三方审核和签发,可以立即生成和使用。
适用于开发和测试:在开发和测试环境中,自签名证书提供了便捷的加密解决方案。
劣势
信任问题:由于自签名证书没有经过第三方认证机构的验证,浏览器会警告用户该证书不被信任,可能会影响用户体验,需要在用户端导入根证书才可以解决警告问题。
受限于内部使用:适用于开发、测试和内部应用,不建议在生产环境中使用。
通过理解自签名证书的概念和工作原理,我们可以更好地在合适的场景中应用它们。在接下来的部分中,我们将详细介绍如何生成和使用自签名证书。
生成根证书颁发机构(CA)
有的人直接就生成服务器证书,这是不对的,我们需要先生成根证书颁发机构,然后用这个CA去签名证书,以后我们可以让客户端信任这个CA,所有用这个CA生产的证书都会自动信任。
这条命令生成一个 4096 位的 RSA 私钥,并将其存储在 /etc/pki/tls/private/selfsignroot.key
文件中。私钥是用于签署证书的核心部分。
1 | openssl genrsa -out /etc/pki/tls/private/selfsignroot.key 4096 |
1 | openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Shanghai/L=Shanghai/O=Company/OU=SH/CN=Root" \ |
上面这条命令生成一个自签名证书,并将其存储在 /etc/pki/ca-trust/source/anchors/selfsignroot.crt
文件中。以下是各参数的解释:
-x509
:生成一个自签名证书,而不是证书请求(CSR)。-new
:生成一个新的证书。-nodes
:不加密私钥文件。-sha512
:使用 SHA-512 哈希算法。-days 3650
:证书有效期为 3650 天(约 10 年)。-subj "/C=CN/ST=Shanghai/L=Shanghai/O=Company/OU=SH/CN=Root"
:指定证书的主题信息,包括国家(C)、州/省(ST)、城市(L)、组织(O)、组织单位(OU)和通用名称(CN)。-key /etc/pki/tls/private/selfsignroot.key
:使用之前生成的私钥。-out /etc/pki/ca-trust/source/anchors/selfsignroot.crt
:指定输出的证书文件路径。
用openssl命令查询证书文件,当然,你可以复制到Windows上,直接双击也可以看
1 | [root@loadbalance ~]# openssl x509 -in /etc/pki/ca-trust/source/anchors/selfsignroot.crt -text -noout |
运行以下命令来更新 CA 信任存储库,使系统信任新的根证书:
1 | update-ca-trust extract |
签发服务器证书
生成服务器私钥文件
1 | openssl genrsa -out /etc/pki/tls/private/nginx.key 4096 |
生成证书请求文件
我们来尝试给loadbalance.xiaohui.cn
域名申请一个证书
1 | openssl req -sha512 -new \ |
openssl req -sha512 -new
:使用 SHA-512 哈希算法生成一个新的 CSR。-subj "/C=CN/ST=Shanghai/L=Shanghai/O=Company/OU=SH/CN=loadbalance.xiaohui.cn"
:指定 CSR 的主题信息,包括:/C=CN
:国家代码,CN 表示中国。/ST=Shanghai
:州/省,Shanghai 表示上海。/L=Shanghai
:城市,Shanghai 表示上海。/O=Company
:组织名称,Company 表示公司。/OU=SH
:组织单位,SH 表示上海分部。/CN=loadbalance.xiaohui.cn
:通用名称,表示证书的域名。
-key /etc/pki/tls/private/nginx.key
:使用之前生成的私钥,存储在/etc/pki/tls/private/nginx.key
文件中。-out nginx.csr
:指定输出的 CSR 文件路径为nginx.csr
。
除了这种简单的申请之外,还可以生成扩展文件,以支持更多的证书属性,最常用的是给多个域名或IP同时验证合法身份,也就是给证书添加备用名称
DNS.1 = web1.xiaohui.cn
:指定第一个 DNS 名称为web1.xiaohui.cn
。DNS.2 = web2.xiaohui.cn
:指定第二个 DNS 名称为web2.xiaohui.cn
。IP.1 = 192.168.8.3
:指定第一个 IP 地址为192.168.8.3
。IP.2 = 192.168.8.4
:指定第二个 IP 地址为192.168.8.4
。
1 | cat > certs.cnf << EOF |
最终签发证书
命令解释
openssl x509 -req -in nginx.csr
:使用 CSR(
nginx.csr
)生成证书。-req
:表明输入是一个证书签名请求。
-CA /etc/pki/ca-trust/source/anchors/selfsignroot.crt
:- 使用自签名根证书(
selfsignroot.crt
)作为 CA 来签署 CSR。
- 使用自签名根证书(
-CAkey /etc/pki/tls/private/selfsignroot.key
:- 使用自签名根证书对应的私钥(
selfsignroot.key
)进行签署。
- 使用自签名根证书对应的私钥(
-CAcreateserial
:- 自动创建序列号文件。如果没有指定
-CAserial
文件,这个选项将创建一个新的序列号文件。
- 自动创建序列号文件。如果没有指定
-out /etc/pki/tls/certs/nginx.crt
:- 指定生成的服务器证书输出路径为
nginx.crt
。
- 指定生成的服务器证书输出路径为
-days 3650
:- 指定证书的有效期为 3650 天(约 10 年)。
-extensions v3_req -extfile certs.cnf
:- 使用
certs.cnf
文件中定义的v3_req
扩展来生成证书。这确保了证书包含你在certs.cnf
文件中指定的扩展,例如subjectAltName
。
- 使用
1 | openssl x509 -req -in nginx.csr \ |
输出
1 | Certificate request self-signature ok |
我们来检查一下,证书是否包括多个域名和IP
没有问题,这个证书同时给多个域名和IP验证
1 | [root@loadbalance ~]# openssl x509 -in /etc/pki/tls/certs/nginx.crt -text -noout |