1. 为什么我们需要自签名证书?
在Windows环境下生成自签名证书是许多开发者和系统管理员经常遇到的需求。你可能正在搭建本地开发环境、测试HTTPS服务,或者需要为内部系统创建安全连接。自签名证书就像是你自己颁发的"身份证",虽然不像CA机构颁发的证书那样被所有浏览器默认信任,但在可控环境中非常实用。
我最近为一个企业内部系统配置HTTPS时就遇到了这个问题。第三方证书太贵,而Let's Encrypt的证书在纯内网环境下又不方便自动续期。这时候,用OpenSSL生成自签名证书就成了最佳选择。整个过程在Windows上大概只需要10分钟,但其中有不少细节需要注意,否则可能会遇到各种奇怪的问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 准备工作:安装OpenSSL
2.1 选择合适的OpenSSL版本
在Windows上使用OpenSSL,你有几个选择:
- 直接从OpenSSL官网下载预编译的二进制文件
- 通过包管理器如Chocolatey安装
- 使用WSL中的Linux版OpenSSL
我推荐第一种方式,因为最直接可控。访问OpenSSL官网下载页面,选择"Win64 OpenSSL Light"版本就足够了,除非你需要特定的算法支持。
注意:下载时务必核对文件哈希值,确保下载的安装包未被篡改。
2.2 安装过程中的关键选项
运行安装程序时,有几个重要选项需要注意:
- 安装路径:建议保持默认的
C:\Program Files\OpenSSL,避免后续环境变量配置问题 - 将OpenSSL DLL复制到:选择"The OpenSSL binaries (/bin) directory"
- 创建环境变量:勾选"Add OpenSSL to the system PATH"
安装完成后,打开新的命令提示符窗口,运行:
code复制openssl version
如果正确显示版本号,说明安装成功。如果看到"'openssl' 不是内部或外部命令"的错误,说明环境变量配置有问题,需要手动将OpenSSL的bin目录(如C:\Program Files\OpenSSL\bin)添加到系统PATH中。
3. 生成自签名证书的完整流程
3.1 创建私钥
首先,我们需要生成一个RSA私钥。打开命令提示符,导航到你希望保存证书文件的目录,然后执行:
code复制openssl genrsa -out server.key 2048
这个命令会生成一个2048位的RSA私钥文件server.key。在实际生产环境中,你可能需要考虑使用更强的4096位密钥,但2048位对于大多数测试和开发场景已经足够。
安全提示:私钥文件必须严格保密,任何获取到这个文件的人都可以冒充你的服务器。
3.2 创建证书签名请求(CSR)
接下来,我们需要创建一个证书签名请求(CSR):
code复制openssl req -new -key server.key -out server.csr
执行这个命令后,OpenSSL会交互式地询问你一些信息:
- Country Name (2 letter code):国家代码,如CN
- State or Province Name:省份
- Locality Name:城市
- Organization Name:组织名称
- Organizational Unit Name:部门名称
- Common Name:这是最重要的字段,必须填写你要使用证书的域名或IP地址
- Email Address:管理员邮箱
- A challenge password:可以直接回车留空
这些信息会嵌入到你的证书中。对于自签名证书,这些信息主要用于标识,不像CA签发的证书那样需要严格验证。
3.3 生成自签名证书
有了CSR文件后,现在可以生成自签名证书了:
code复制openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
这个命令会生成一个有效期为365天的自签名证书server.crt。你可以根据需要调整-days参数的值。
4. 在Windows系统中使用自签名证书
4.1 将证书安装到受信任的根证书颁发机构
为了让Windows系统信任你的自签名证书,你需要将它安装到"受信任的根证书颁发机构"存储区中:
- 双击server.crt文件
- 点击"安装证书"
- 选择"本地计算机"
- 选择"将所有证书放入下列存储",点击"浏览"选择"受信任的根证书颁发机构"
- 完成向导
4.2 在IIS中使用自签名证书
如果你需要在IIS中使用这个证书:
- 打开IIS管理器
- 在服务器节点下选择"服务器证书"
- 点击"导入"
- 选择你的.pfx文件(需要先转换为pfx格式,见下文)
- 输入密码
- 在网站绑定中选择HTTPS和你的证书
4.3 将证书转换为PFX格式
某些应用程序(如IIS)需要使用PFX格式的证书。你可以用以下命令转换:
code复制openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt
系统会提示你设置一个导出密码,这个密码在导入证书时需要提供。
5. 常见问题与解决方案
5.1 证书不受信任的警告
即使你将证书安装到了受信任的根证书存储区,某些浏览器(特别是Chrome)可能仍然会显示警告。这是因为:
- 证书的主题备用名称(SAN)不匹配
- 证书链不完整
- 浏览器有自己的证书信任存储
解决方法是在生成证书时添加SAN扩展。创建一个san.ext文件,内容如下:
code复制authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = yourdomain.com
DNS.2 = *.yourdomain.com
IP.1 = 192.168.1.1
然后使用这个命令生成证书:
code复制openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt -extfile san.ext
5.2 证书过期问题
自签名证书不像Let's Encrypt证书那样可以自动续期。我建议:
- 设置日历提醒,在证书到期前续期
- 创建批处理脚本自动化续期过程
- 对于重要系统,考虑使用内部CA而不是单个自签名证书
5.3 性能问题
使用2048位以上的RSA密钥可能会对性能产生影响,特别是在低功耗设备上。解决方案:
- 考虑使用ECC证书(更短的密钥提供相同的安全性)
- 启用TLS会话恢复
- 使用更现代的加密套件
生成ECC密钥的命令:
code复制openssl ecparam -genkey -name prime256v1 -out ecc.key
openssl req -new -key ecc.key -out ecc.csr
openssl x509 -req -days 365 -in ecc.csr -signkey ecc.key -out ecc.crt
6. 高级应用场景
6.1 创建自己的CA
如果你需要为多个服务签发证书,可以创建自己的CA:
-
生成CA私钥:
code复制openssl genrsa -out ca.key 4096 -
生成CA根证书:
code复制openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -
用CA签发服务器证书:
code复制openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
这样,你只需要将ca.crt安装为受信任的根证书,所有由它签发的证书都会被自动信任。
6.2 证书吊销列表(CRL)
对于更严格的安全要求,你可以实现证书吊销:
-
创建CRL:
code复制openssl ca -gencrl -keyfile ca.key -cert ca.crt -out crl.pem -
吊销证书:
code复制openssl ca -revoke server.crt -keyfile ca.key -cert ca.crt -
生成新的CRL:
code复制openssl ca -gencrl -keyfile ca.key -cert ca.crt -out crl.pem
6.3 在Nginx中使用自签名证书
配置Nginx使用你的证书:
nginx复制server {
listen 443 ssl;
server_name yourdomain.com;
ssl_certificate /path/to/server.crt;
ssl_certificate_key /path/to/server.key;
# 其他配置...
}
记得重启Nginx使配置生效。
7. 安全最佳实践
- 密钥保护:私钥文件应该设置严格的访问权限,只有必要的用户和服务账户能够读取
- 定期轮换:即使没有泄露,也应该定期更换密钥和证书
- 密钥强度:使用至少2048位的RSA密钥或等效的ECC密钥
- 算法选择:优先使用SHA-256而不是SHA-1
- 证书透明度:虽然自签名证书无法参与证书透明度计划,但你可以记录自己签发的证书
我通常会在项目的文档中维护一个证书清单,记录每个证书的用途、有效期和关联的服务,这样在需要更新或排查问题时可以快速定位。
