数字签名(代码签名)流程

摘要:
codesign:字面的翻译为代码签名,但是通常的我们称为数字签名,以下的文中均称为数字签名。一数字认证码如果你是软件开发人员,你可能已经知道windows系统和一些浏览器使用一种称为数字认证代码的技术来标识软件的发行商,来检查软件没有被病毒影响。

数字签名(代码签名)流程
Authenticode : 这里翻译为数字认证代码。
code sign : 字面的翻译为代码签名,但是通常的我们称为数字签名,以下的文中均称为数字签名。
一 数字认证码
如果你是软件开发人员,你可能已经知道windows系统和一些浏览器(例如IE,Firefox)使用一种称为数字认证代码的技术来标识软件的发行商,来检查软件没有被病毒影响。如果你的软件没有用数字认证代码签名,用户将会收到一个警告“此软件发行商不能被成功的验证,你是否要继续运行此软件“,很多的用户为了安全起见将放弃对此软件的使用。
如果你的软件是提供给专业的人员使用,结果肯能会更糟。许多公司的IT安全策略禁止没有用数字认证码签名的软件的运行。
同时微软Windows也使用数字签名证书来判断潜在的恶意软件。如果你的setup.exe没有进行数字认证证书的签名,你的软件的名誉将遭受损害。
在Vista系统增加UAC之后,情况变的更糟,如果你的软件没有使用数字认证证书签名,且在运行时需要管理员的权限,则会出现警告对话框”不可识别的程序想访问你的计算机“,这个时候很多的用户可能认为是病毒,会禁止使用你的软件。
二 数字认证码的原理

数字签名代码是一种技术,它使用数字证书来识别软件的发布商和使用hash算法来确保软件的完整性。数字签名使用公共密匙签名书法被创建,它使用两种不同的密匙:公共密匙和私有密匙,我们称其为密匙对。私有密匙一般为拥有者所有,公有密匙对所有的人都可见。

数字签名的过程本质上为:

签名软件对要签名的软件创建hash;

使用发布者的私有密匙来加密软件的hash;

被加密的hash和发布者的数字证书被插入到要签名的软件;

数字签名的验证过程本质上为:

用户对要验证的软件创建hash;

使用发布者的公共密匙来解密被加密的hash;

比较解密的hash和新获得的hash,如果匹配说明签名是正确的,软件没有被修改过;

三 数字签名
数字签名是对软件进行标识的一个流程,它通过对软件增加了发布商的信息来检查软件在发布后是否被修改或受病毒影响。在软件出售前进行签名已经成为了行业范围的专业实践。随着用户的安全意识的提高,现在越来越多的用户限制下载未签名的软件,因此作为专业的软件公司,在软件出售前进行签名已经成为必不可少的一步。
要进行数字签名,需要以下准备:
1)数字证书和密码;
2)数字签名工具;
3)时间戳服务器的URL地址;

四 数字签名工具
数字签名工具, 微软提供了两套数字签名工具,

1)signcode.exe, 从1998年开始使用,随.NET Framework SDK发布。

signcode.exe 数字签名工具

makecert.exe 创建数字证书

cert2spc.exe 将数字证书转化为软件发布者证书格式

2)signtool.exe,随visualstudio 2005及其以后的版本发布。

signtool.exe 数字签名工具

makecert.exe 创建数字证书

cert2spc.exe 将数字证书转化为软件发布者证书格式

pvk2pfx.exe(pvkimprt.exe) 将私有的密匙和软件发布者证书合并为pfx文件,此文件将被signtool.exe使用

上面2中工具的不同是signcode.exe需要输入私有密匙和软件发布者证书(pvk和spc文件),signtool.exe只需要输入由pvk和spc合并产生的一个个人信息交互文件(pfx)。

五 获得数字证书

数字证书,你可以创建自己的数字证书来测试数字签名的流程,但是正式的软件发布,你需要向可信赖的证书颁发机构购买数字证书和密码,例如你可以向以下的证书机构购买Comodo, Globalsign, Thawte and Verisign。

创建自己的数字证书(用来测试)

使用如下命令来创建自己的数字证书:
makecert.exe -sv mykey.pvk -n "CN=Acme Software Inc." mycert.cer你可以将Acme Software Inc.替换为你自己公司的名字。如果mykey.pvk不存在的话,你会要求输入私有密匙的密码,密码可以为空。安全起见最好设置密码,否则别人拿到你的私有密匙后就可以签名了。在上面的命令后,产生了2个文件mykey.pvk和mycert.cer。接下来需要将数字证书(cer)转化为软件发布商证书(spc),命令如下:cert2spc.exe mycert.cer mycert.spc此过程中需要输入私有密匙的密码,创建完成后应该会生成mycert.spc文件,当数字签名时mycert.cer文件是不需要的。

六 对软件数字签名
时间戳服务器,你可以选择下列之一,
- http://timestamp.verisign.com/scripts/timstamp.dll
- http://timestamp.globalsign.com/scripts/timstamp.dll
- http://timestamp.comodoca.com/authenticode

1)使用signcode.exe,如下:
signcode.exe -t <timestamp URL> -spc mycert.spc -v mykey.pvk "<file to be signed>"进行数字签名的文件可以是.exe, .dll, .ocx 或者是其他的可执行文件。

2)使用signtool.exe,如下:

如果你没有pfx文件,需要使用以下的命令来将pvk和spc文件合并为pfx,如果没有设置密码的话必须使用pvkimprt.exe来合并。pvk2pfx.exe -pvk mykey.pvk -pi <password> -spc mycert.spc -pfx mycert.pfx -po <password>pvkimprt.exe -pfx mycert.spc mycert.pvksigntool.exe sign /f mycert.pfx /p <password> /t <timestamp URL> /v "<file to be signed>"
以下是使用signtool.exe签名的一个实例:
signtool.exe sign /f mycert.pfx /p <password> /t <timestamp URL> /v "<file to be signed>"
Here is the Sample Output:
The following certificate was selected:
Issued to: SID Software Inc.
Issued by: Thawte Code Signing CA
Expires: 10/16/2011 2:17:15 AM
SHA1 hash: 4374SD894388B9H456E206124G06D9AV1535G12E
Done Adding Additional Store
Attempting to sign: jservice.exe
Successfully signed and timestamped: jservice.exe
Number of files successfully Signed: 1
Number of warnings: 0
Number of errors: 0

参考:
http://www.tech-pro.net/code-signing-for-developers.html
http://siddesh-bg.blogspot.com/2008/12/code-signing-process.html

感谢,Thanks!
作者:iTech
出处:http://itech.cnblogs.com/
本文版权归作者iTech所有,转载请包含作者签名和出处,不得用于商业用途,非则追究法律责任!

免责声明:文章转载自《数字签名(代码签名)流程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇client intended to send too large bodyOpenCV-Python学习笔记4:图像阀值下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

DNN系统模块简介

系统模块简介 公告模块(Announcements):可用于发布站点的新闻、通知,支持搜索、Rss、导入、导出,支持模板功能. 广告模块(Banner):用来给商家做广告服务的模块. 博客模块(Blog):用来做博客服务的程序,每一个注册用户都可以创建自己的博客. 通讯录模块(Contacts):此模块的主要用途是制作联系方式表格,可添加姓名、电邮...

关于向日葵Linux端、win10版本交互“连接已断开”问题的解决

近日安装向日葵win10客户端与Ubuntu18客户端,安装过程简单,此处不描述。安装后注册账号,在win、U客户端正常登录,也可以手机安装手机App,过程此处不描述。有问题可以留言。在进行远程协助时遇到了通过Win10客户端控制Ubuntu客户端,以及手机App控制Ubuntu客户端时出现了“连接断开”和“正在进入远程桌面”的提示。经过一番痛苦的搜索,终...

Jquery计算时间戳之间的差值,可返回年,月,日,小时等

/** * 计算时间戳之间的差值 * @param startTime 开始时间戳 * @param endTime 结束时间戳 * @param type 返回指定类型差值(year, month, day, hour, minute, second) */ function DateDiff(startTime, endTime,...

小程序分包加载

开发者需要将小程序划分成不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载。 在构建小程序分包项目时,构建会输出一个或多个分包。每个使用分包小程序必须包含 一个主包,所谓的主包,即放置默认启动页/TabBar 页面,以及一些所有分包需要用到 整个小程序所有分包大小不超过 8M单个分包/主包大小不能超2M 对小程序进行分包,可以优化小程序首次启动...

Gentoo 包管理器: Emerge使用方法

安装与卸载 安装软件 emerge --ask --verbose package_name 只下载源码 emerge -f package_name 软件包卸载 emerge --unmerge package_name 清除所有失去依赖关系的软件包(清理系统) emerge --depclean 更新与同步 更新系统中的...

如何通过Html网页调用本地安卓app?

如何使用html网页和本地app进行传递数据呢?经过研究,发现还是有方法的,总结了一下,大致有一下几种方式 一、通过html页面打开Android本地的app 1、首先在编写一个简单的html页面 <html> <head> <meta http-equiv="Content-Type" c...