使用 OpenSSL 构建自签名证书步骤详解

前言
在开发测试、内部服务通信或搭建私有 CA(Certificate Authority)过程中,我们常常需要用到自签名证书(Self-Signed Certificate)。它不依赖第三方权威机构颁发,能快速构建 HTTPS 服务或 TLS 加密通道,特别适用于本地测试、局域网内部通信、IoT 设备认证等场景。
本篇文章将手把手教你如何使用 OpenSSL 构建自签名证书,涵盖从私钥生成到证书配置的完整流程。
一、环境准备
安装 OpenSSL
Windows: 可以使用 slproweb 提供的 OpenSSL 安装包。 安装后确保 openssl.exe 已加入系统环境变量,或使用完整路径。 找到安装目录“D:\Program Files\OpenSSL-Win64\bin”将其加入环境变量中。
Linux / macOS:
# Debian / Ubuntu
sudo apt install openssl
# macOS(使用 Homebrew)
brew install openssl
二、生成私钥(Private Key)
选择一个文件夹执行下面的命令
openssl genrsa -out mysite.key 2048
mysite.key:生成的私钥文件2048:表示生成 2048 位的 RSA 密钥(建议使用 2048 或以上) 如果需要更高安全性(如 ECC):
openssl ecparam -genkey -name prime256v1 -out mysite.key
三、生成证书签名请求(CSR)
CSR(Certificate Signing Request)是包含公钥及主体信息的证书请求文件。即便是自签名证书,也推荐通过 CSR 来规范生成证书的过程。
openssl req -new -key mysite.key -out mysite.csr
过程中会提示输入如下信息:
C:\Users\Lenovo\Desktop\cer>openssl req -new -key mysite.key -out mysite.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Guangdong
Locality Name (eg, city) []:Shenzhen
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany
Organizational Unit Name (eg, section) []:Dev
Common Name (e.g. server FQDN or YOUR name) []:mysite.local
Email Address []:admin@mysite.local
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:MyCompany
C:\Users\Lenovo\Desktop\cer>
其中 Common Name(CN) 非常重要,必须与访问域名一致,如 localhost 或 mysite.local。
四、生成自签名证书(Self-Signed Certificate)
openssl x509 -req -in mysite.csr -signkey mysite.key -out mysite.crt -days 365
-req:从 CSR 文件生成证书-signkey:使用自己的私钥签名-days:证书有效期,单位为天
这样,我们就得到了:
mysite.key:私钥mysite.crt:自签名证书mysite.csr:签名请求文件(可选保留)
五、可选:生成包含扩展信息的证书(SAN 支持)
现代浏览器要求证书中必须包含 Subject Alternative Name (SAN),否则将视为不安全。
创建一个配置文件 mysite.cnf:
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = req_ext
[dn]
C = CN
ST = Guangdong
L = Shenzhen
O = MyCompany
OU = Dev
CN = mysite.local
[req_ext]
subjectAltName = @alt_names
[alt_names]
DNS.1 = mysite.local
DNS.2 = localhost
然后执行以下命令:
# 生成带扩展的 CSR
openssl req -new -key mysite.key -out mysite.csr -config mysite.cnf
# 自签名证书,包含扩展字段
openssl x509 -req -in mysite.csr -signkey mysite.key -out mysite.crt -days 365 -extensions req_ext -extfile mysite.cnf
六、验证证书信息
可以使用以下命令查看证书详情:
openssl x509 -in mysite.crt -noout -text
输出内容中会包含:
证书有效期(Validity)主体信息(Subject)颁发者(Issuer)扩展信息(如 SAN)
七、常见用途示例
在本地 HTTPS 服务中使用(以 Node.js 为例):
编写一个server.js文件
const https = require('https');
const fs = require('fs');
const path = require('path');
// 读取证书和密钥文件
const options = {
key: fs.readFileSync(path.join(__dirname, 'mysite.key')),
cert: fs.readFileSync(path.join(__dirname, 'mysite.crt'))
};
// 创建HTTPS服务器
const server = https.createServer(options, (req, res) => {
res.writeHead(200);
res.end("Hello Secure World!");
});
// 监听4433端口
server.listen(4433, () => {
console.log('HTTPS server running on https://localhost:4433/');
});
执行启动命令
node server.js
访问 https://localhost:4433/ 即可。 由于使用的是自签名证书,浏览器会显示安全警告,你需要手动信任该证书(在Chrome中点击"高级"->“继续前往”)
查看证书详情:
导入证书
双击 mysite.crt 文件
选择"安装证书"
选择"本地计算机"(可能需要管理员权限)
选择"将所有证书放入下列存储",点击"浏览"
选择"受信任的根证书颁发机构",点击"确定"
完成向导
关闭浏览器,刷新页面即可。
八、总结
通过 OpenSSL,我们可以快速生成自签名证书并用于测试、内部服务通信等非生产环境。虽然这些证书不会被浏览器信任,但配合本地 CA 或自定义信任策略(如企业根证书),也可以实现较高的安全性。
如果你正处于开发 HTTPS 或 TLS 服务的阶段,不妨亲手实践本文操作。掌握 OpenSSL 是理解加密通信机制的第一步。