本文章所有代码都打包了,下载地址: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.1 = localhost
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\[证书指纹]
|