放假了,博主呆在家实在无聊,于是开始鼓捣一些“乱七八糟”的东西。

这两天突然想到,能不能用自己的泛域名证书给文件签名?!于是就有了这篇文章。

并不能,呵呵

数字签名的用途和原理?

数字签名可以保证信息传输的完整性、发送者的身份认证、防止交易中的抵赖发生。

数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用 HASH 函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。


为了给 *.dll*.exe 文件签名,博主先去搜了搜有没有什么提供签名的工具,果然,微软提供了一个叫做 SignTool 的工具给文件签名。

先提供有关于 SignTool 工具的信息:

SignTool 使用方法:MSDN

SignTool 工具:如果您装过微软的开发工具,可以尝试找到 Microsoft SDKs,具体位置为

64位系统:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe

32位系统:C:\Program Files\Microsoft SDKs\Windows\v7.1A\Bin\signtool.exe

如果没有找到以上路径,请自行下载安装 Microsoft Windows SDK for Windows 7 and .NET Framework 4,或从百度网盘下载。


对照着 MSDN 的示例,博主先进行测试。

PowerShell
# /t http://timestamp.verisign.com/scripts/timstamp.dll 表示签名时带上时间戳
# /a 表示自动找寻一个最佳的签名证书
# 给 dll 签名后,提示签名成功,但是查看签名的证书,证书不受信任,因为给 dll 签名的证书是计算机自带的自签名证书
signtool sign /a abc.dll
signtool sign /t http://timestamp.verisign.com/scripts/timstamp.dll /a abc.dll

于是博主想看看能不能用自己的泛域名证书来签名…(。・ω・。)博主会有这种想法还真是才疏学浅…


可是,博主的证书只有一个私钥文件,一个链证书文件和一个证书文件,但是用于签名的必须是“个人信息交换 (PFX) 格式”,所以先要把之前的文件转换为 .pfx 格式。

发现用 openssl 来转换非常方便快捷,所以使用 openssl 来转换文件格式。

PS:openssl 有 Windows 版本,但是要自己编译,比较麻烦。建议用 Linux 完成,没有 Linux 系统就没办法啦( ̄3 ̄)

Bash
# 先把私钥文件(ca.key)和证书文件(ca.crt)弄到 linux 里
cd /tmp/
# openssl 会要求你对 .pfx 文件设置密码,建议设置强密码,本文以 ttionya 为例
# 之后将 ca.pfx 文件取回本地计算机
openssl pkcs12 -export –in ca.crt -inkey ca.key -out ca.pfx

ca.pfx 取回本地后,把 ca.pfxabc.dllsigntool.exe 三个文件放在一个文件夹内(为了方便),打开 CMD,来到该目录下。

PowerShell
# /f 表示选取使用的 .pfx 文件
# /p 由于 .pfx 文件含有密码,所以要带上该文件的密码
signtool sign /f ca.pfx /p ttionya abc.dll
signtool sign /f ca.pfx /p ttionya /t http://timestamp.verisign.com/scripts/timstamp.dll abc.dll

执行完后,失败了,华丽丽地失败了_(:3」∠)_

报错内容:SignTool Error: No certificates were found that met all the given criteria.

为毛为毛(╯°口°)╯(┴—┴

然后仔细查看自己的证书,发现原来自己的证书只支持“服务器身份验证”和“客户端身份验证”两种目的….难怪会失败

证书目的
证书目的

再次测试,发现,只要证书没有“代码签名”目的就不能给文件签名

用于签名的证书目的
用于签名的证书目的

博主又因为自己的无知浪费了生命,不然去看动漫多好_(:3」∠)_


PS:接下来带上自签名一张证书的方法,依旧要用到 openssl

Bash
# 算法 RSA,长度 2048 位,输出为 ca.key
openssl genrsa -out ca.key 2048
# 新生成一张 x509 标准,365 天有效期的证书,私钥为 ca.key,输出为 ca.crt
openssl req -new -x509 -days 365 -key ca.key -out ca.crt
openssl pkcs12 -export –in ca.crt -inkey ca.key -out ca.pfx

原创文章,转载请以链接形式注明出处:https://blog.ttionya.com/article-942.html