openssl生成代码签名证书(用户证书篇)
文章目录
用户证书篇:用中间证书给用户颁发签名证书,也可以直接用根证书颁发证书,也可以自签发证书.
自签发证书.
自签发证书也就是自己就是根证书.它没有父级证书.
这不是本篇的主题,这里只是大致提下.我主要想了解和复现整个代码签发体系.
它和RootCA证书生成一模一样.只要指定证书扩展功能extendedKeyUsage字段带有codeSigning就能给代码签名.
然后也像CA证书一样,将证书安装到"受信任的根证书颁发机构" .
使用vs开发驱动.SYS程序会生成测试证书,就是生成一个WDK开头的自签名证书,自动安装.
代码签名分类
代码签名主要分sha1和sha256两种.
可以给代码签名,可以单签发一种,也可以同时签发两种.
sha256是不支持win7以下系统的.
如果要兼容可以两种都签,也可以单签sha1.
本篇主要说sha256证书, sha1类似,稍微改动下即可
拷贝配置文件
将openssl的cnf文件拷贝client_sha256.cnf
编辑配置文件新增v3_client_sha256
[ v3_client_sha256 ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = CA:FALSE
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
extendedKeyUsage = critical,serverAuth,clientAuth,codeSigning,timeStamping,emailProtection,OCSPSigning,ipsecIKE,msCodeInd,msCodeCom,msCTLSign,msEFS
#如果需要复现整个证书体系,还需要指定上级证书的OCSP服务器还有上级证书的吊销列表.
#authorityInfoAccess = OCSP;URI:http://ocsp-inter.getce.cn
#crlDistributionPoints=URI:https://crl.getce.cn/static/ca_x509/inter.crl
basicConstraints
这个指定 CA:FALSE 表示这是最终证书,它没有颁发下级证书的权力.
extendedKeyUsage
这个在中间证书篇中详细说明.
如果要代码签名只需要指定codeSigning即可.
生成CSR和KEY
key是加密的,这里指定了密码123456.
openssl req -passout 'pass:123456' -newkey rsa:2046 -keyout ./client_sha256/client_sha256.key -out ./client_sha256/client_sha256.csr -config ./client_sha256.cnf -extensions v3_client_sha256
[可选]删除key密码
openssl rsa -in ./client_sha256/client_sha256.key -out ./client_sha256/client_sha256.key
会让你输入key密码,前面指定123456
使用CA证书签发
这个CA证书可以是RootCA (根证书),也可以是EVRootCA (中间证书)签发.
这里只介绍使用中间商颁发的情况.
如果想了解使用RootCA根证书直接颁发的可以参考中间商证书生成篇.
faketime '2000-01-01 00:00:02' openssl x509 -req -sha256 -days 36522 -CAcreateserial -CA ./inter/inter.crt -CAkey ./inter/inter.key -in ./client_sha256/client_sha256.csr -out ./client_sha256/client_sha256.crt -extfile ./client_sha256.cnf -extensions v3_client_sha256
伪造时间,并指定中间证书和KEY,颁发100年证书.
这里指定了-sha256方式.
验证证书有效
直接测试
openssl verify -CAfile ./ca/ca.crt -untrusted ./inter/inter.crt ./client_sha256/client_sha256.crt
-CAfile 是根证书.
-untrusted是中间证书,可以指定多个.
返回OK就是好的.
OCSP服务器测试
后面单独开一篇博文说明
生成代码签名证书
如果给windows程序,驱动,DLL之类的签名.
这个要转换成有密码的证书文件.pfx或者.P12文件.微软叫做"个人信息交换"证书.
转换命令
openssl pkcs12 -export -out ./client_sha256/client_sha256.pfx -inkey ./client_sha256/client_sha256.key -in ./client_sha256/client_sha256.crt -CAfile ./ca/ca.crt
会让你输入两次密码,这个密码是生成pfx这个文件的指定密码.
会生成一个client_sha256.pfx文件,这个就是签名工具用的格式.
签名
给代码签名部分不讲,随便一个签名工具就可以.也可以参考之前我博文伪造时间戳用过期证书签名.
参考
研究openssl过程中参考了大量的博文,资料,wiki.
在RootCA篇已经列举,此处不再重复.