用户证书篇:用中间证书给用户颁发签名证书,也可以直接用根证书颁发证书,也可以自签发证书.

 

自签发证书.

 

自签发证书也就是自己就是根证书.它没有父级证书.

这不是本篇的主题,这里只是大致提下.我主要想了解和复现整个代码签发体系.

 

它和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篇已经列举,此处不再重复.