使用自签名证书用于ssl通信

本文章所有代码都打包了,下载地址:selfsigning.rar

签发根证书

创建配置文件root.cnf,内容如下

1
2
3
4
5
[ req ]
x509_extensions = root_ca

[ root_ca ]
basicConstraints = critical, CA:true

签发根证书

1
openssl req -x509 -newkey rsa:2048 -out root.cer -outform PEM -keyout root.pvk -days 10000 -verbose -config root.cnf -nodes -sha256 -subj "/CN=OpenTrust Root"

OpenTrust是我们虚构的一个公司,这样比较正式一点吧(笑

生成的root.cer是公钥,root.pvk是私钥,然后把root.cer导入到用户的受信任的根证书颁发机构

签发ssl证书

创建配置文件serverAuth.ext,内容如下

域名或IP地址根据需要修改

1
2
3
4
5
6
7
8
9
subjectAltName = @server
extendedKeyUsage = serverAuth

[server]
# 域名(多个域名就DNS.2、DNS.3类推,IP下同)
DNS.1 = localhost
# IP地址(v4或v6)
IP.1 = 192.168.117.122
IP.2 = fe80::9fec:b699:19fb:850e

然后创建签名请求文件serverAuth.req并签名

1
2
3
4
5
#创建签名请求
openssl req -newkey rsa:2048 -keyout serverAuth.pvk -out serverAuth.req -subj /CN="OpenTrust ServerAuth" -sha256 -nodes

#签名
openssl x509 -req -CA root.cer -CAkey root.pvk -in serverAuth.req -out serverAuth.cer -days 10000 -extfile serverAuth.ext -sha256

serverAuth.cer是公钥,serverAuth.pvk是私钥,签名请求文件serverAuth.req就可以删掉了

写个服务器测试一下

1
2
3
4
5
6
7
8
9
10
11
const https = require('https');
const fs = require('fs');

const options = {
key: fs.readFileSync('serverAuth.pvk'),
cert: fs.readFileSync('serverAuth.cer')
};

https.createServer(options, (req, res) => {
res.end('hello world');
}).listen(443);

赏心悦目的绿色,不错不错

签发应用签名证书

应用签名的签发步骤和ssl是一样的,只不过配置文件需要改一下

创建配置文件codeSigning.ext

1
extendedKeyUsage = codeSigning

是的,就一行,非常简洁

1
2
3
4
5
6
7
8
#创建签名请求
openssl req -newkey rsa:2048 -keyout codeSigning.pvk -out codeSigning.req -subj /CN="OpenTrust CodeSigning" -sha256 -nodes

#签名
openssl x509 -req -CA root/root.cer -CAkey root/root.pvk -in codeSigning.req -out codeSigning.cer -days 10000 -extfile config/codeSigning.ext -sha256

#pvk转pfx,因为Windows SDK自带的签名软件signtool.exe只支持pfx
openssl pkcs12 -export -out codeSigning.pfx -inkey codeSigning.pvk -in codeSigning.cer -certfile root/root.cer -passout pass:

然后删掉codeSigning.req codeSigning.cer codeSigning.pvk,我们只需要codeSigning.pfx

签名example.exe,这里上sha1 + sha256双签名,看着就高端

1
2
signtool.exe sign /v /f codeSigning.pfx /fd sha1 example.exe
signtool.exe sign /as /v /f codeSigning.pfx /fd sha256 example.exe

Windows内核签名

1
extendedKeyUsage = 1.3.6.1.4.1.311.10.3.5, 1.3.6.1.4.1.311.10.3.5.1, codeSigning

这个好像实现不了,无论怎么搞都会报错无法加载。微软对内核的管理越来越严格,想必是使用了什么申必手段来检查自签名,,,

注册表导入根证书

正常手段导入windows会显示警告,用注册表导入就悄无声息(笑

用户根证书路径

1
HKEY_CURRENT_USER\Software\Microsoft\SystemCertificates\Root\Certificates\[证书指纹]

计算机根证书路径

1
2
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\SystemCertificates\ROOT\Certificates\[证书指纹]
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\ROOT\Certificates\[证书指纹]

使用自签名证书用于ssl通信
https://crackme.net/articles/selfsigning/
作者
Brassinolide
发布于
2025年1月4日
许可协议