您的位置:首页 > 其它

【Windows】数字签名手概念与命令手册

2016-12-02 17:36 211 查看

加密服务提供程序概念(CSP)

加密服务提供程序

应用到: Windows 7, Windows Server 2008 R2

加密服务提供程序 (CSP) 是执行身份验证、编码和加密服务的程序,基于 Windows 的应用程序通过 Microsoft 加密应用程序编程接口 (CryptoAPI) 访问该程序。每个 CSP 提供不同的 CryptoAPI 实现。某些提供更强大的加密算法,而另外一些则使用硬件组件(如智能卡)。

生成新证书的申请时,该申请中的信息先从申请程序发送到 CryptoAPI。CryptoAPI 向安装在计算机上或计算机可以访问的设备上的 CSP 提供正确的数据。如果 CSP 是基于软件的,则它在计算机上生成一个公钥和一个私钥,这两个密钥通常称为密钥对。如果 CSP 是基于硬件(如智能卡 CSP)的,则它指导一个硬件生成密钥对。

密钥生成后,基于软件的 CSP 将对私钥进行加密,从而保护私钥的安全。智能卡 CSP 将私钥存储在智能卡上。然后智能卡控制对密钥的访问。

公钥连同证书申请者信息一起发送到证书颁发机构 (CA)。CA 根据其策略验证证书申请后,将使用自己的私钥在证书中创建数字签名,然后将证书颁发给申请人。CA 将证书交给证书申请人,同时可以选择将该证书安装在计算机或硬件设备上适当的证书存储中。

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

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)。

Makecert.exe ---证书创建工具

概述

证书创建工具生成仅用于测试目的的 X.509证书。它创建用于数字签名的公钥

和私钥对,并将其存储在证书文件中。此工具还将密钥对与指定发行者的名称相

关联,并创建一个 X.509证书(该证书将用户指定的名称绑定到密钥对的公共

部分)。

使用说明

² Makecert.exe包含基本选项和扩展选项。基本选项是最常用于创建证书的选

项。扩展选项提供更多的灵活性。

² 绝不要将此工具生成的证书私钥存储在 .snk 文件中。如果需要存储私钥,

则应使用密钥容器。

警告:应使用证书存储来安全地存储证书。此工具使用的 .snk 文件以不受

保护的方式存储私钥。创建或导入 .snk文件时,在使用期间应注意保证其

安全,并在使用后将其移除。

² 此工具会自动随 Visual Studio 一起安装。若要运行此工具,请使用开发人

员命令提示(或 Visual Studio 命令提示)。

使用方法

命令语法(在命令提示符中输入):
makecert[options] outputCertificateFile

参数

说明

outputCertificateFile

测试 X.509 证书要写入的 .cer 文件的名称。

基本选项:
选项

说明

-n

name

指定主题的证书名称。此名称必须符合 X.500 标准。最简单的方

法是在双引号中指定此名称,并加上前缀 CN=;例如, -n

"CN=myName"。

指定主题的名字,这个是有固定的格式的, CN=主题名字 ,CN应该是Certificate Name的缩写。我这里的主题的名字就是我们的IIS所在机器的IP。这里可以指定一些主题的其它附加信息,例如 O= *** 表示组织信息等等。

-pe

将所生成的私钥标记为可导出。这样可将私钥包括在证书中。

注意,服务器发送证书给客户端的时候,客户端只能从证书里面获取公钥,私钥是无法获取的。如果我们指定了这个参数,证书在安装在机器上后,我们还可以从证书中导出私钥,默认情况下是不能导出私钥的。正规的途径发布的证书,是不可能让你导出私钥的。

-sk

keyname

指定主题的密钥容器位置,该位置包含私钥。如果密钥容器不存 在,系统将创建一个。

-sr

location

指定主题的证书存储位置。 location 可以为 currentuser(默认)

或 localmachine。

证书的存储位置,只有currentuser(默认值)或 localmachine两个值。

-ss

store

指定主题的证书存储名称(可存储输出证书)。

证书的存储名称,就是windows证书存储区的目录名,如果不存在在的话就创建一个。

-#

number

指定一个介于 1 和 2,147,483,647 之间的序列号。默认值是由

Makecert.exe 生成的唯一值。

-$

authority

指定证书的签名授权机构,必须将其设置为 commercial(用于

商业软件发行者使用的证书)或 individual(用于个人软件发行

者使用的证书)。

-?

显示此工具的命令语法和基本选项列表。

-!

显示此工具的命令语法和扩展选项列表。

扩展选项:
选项

说明

-a

algorithm

指定签名算法。algorithm 必须是 md5、sha1 (默认值)、sha256、sha384 或 sha512。

-b

mm/dd/yyyy

指定有效期的开始时间。当前日期的默认值。

-crl

生成证书重定位列表 (CRL) 而不是证书。

-cy

certType

指定证书类型。有效值是 end (对于最终实体)和 authority(对于证书颁发机构)。

-e

mm/dd/yyyy

指定有效期的结束时间。默认值为 12/31/2039 11:59:59 GMT。

-eku

oid[,oid…]

将用逗号分隔的增强型密钥用法对象标识符 (OID) 列表插入到证书中。

-h

number

指定此证书下面的树的最大高度。

-ic

file

指定颁发者的证书文件。

-ik

keyName

指定颁发者的密钥容器名称。

-iky

keytype

指定发布者的密钥类型,必须是下列项之一: signature(其中指出密钥用于数字签名)、 exchange(其中指出密钥用于密钥加密和密钥交换)或一个整数(表示提供程序类型)。默认情况下,可传递 1 来表示交换密钥,或传递 2 来表示签名密钥。

-in

name

指定颁发者的证书公用名称。

指定证书发布机构的名称

-ip

provider

指定颁发者的 CryptoAPI 提供程序名称。有关 CryptoAPI 提供程序名称的信息,请参见 -sp。

-ir

location

指定颁发者的证书存储的位置。 location 可以是 currentuser (默认值)或 localmachine。

-is

store

指定颁发者的证书存储名称。

-iv

pvkFile

指定颁发者的 .pvk 私钥文件。

-iy

type

指定颁发者的 CryptoAPI 提供程序类型。有关 CryptoAPI 提供程序类型的信息,请参见 -sy 选项。

-l

link

指向策略信息(如 URL)的链接。

-len

number

指定生成的密钥长度(以位为单位)。

这个参数在中文的帮助文档中好像没有提到,但是这个其实很重要,用于指定公钥的位数,越大越安全,默认值是1024,推荐2048。我试了下,这个不为1024的倍数也是可以的。

-m

number

指定证书有效期的持续时间(以月为单位)。

-nscp

包括 Netscape 客户端授权扩展。

-r

创建自我签名证书。

创建自签署证书,意思就是说在生成证书时,将证书的发布机构设置为自己。

-sc

file

指定主题的证书文件。

-sky

keytype

指定主题的密钥类型,必须是下列项之一: signature(其中指出密钥用于数字签名)、 exchange(其中指出密钥用于密钥加密和密钥交换)或一个整数(表示提供程序类型)。默认情况下,可传递 1 来表示交换密钥,或传递 2 来表示签名密钥。

-sp

provider

指定主题的 CryptoAPI 提供程序名称,该名称必须在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider 的注册表子项中定义。如果 -sp 和 -sy 都出现,则 CryptoAPI 提供程序的类型必须对应于提供程序的子项的Type 值。

-sv

pvkFile

指定主题的 .pvk 私钥文件。如果该文件不存在,系统将创建一个。

指定保存私钥的文件,文件里面除了包含私钥外,其实也包含了证书。这个文件是需要保密的,这个文件在服务端配置时是需要用到的。

这个CN=10.30.146.206要与自己的服务器相对应,要不然在配置HTTPS的时候会出现错误

-sy

type

指定主题的 CryptoAPI 提供程序类型,该类型必须在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Cryptography\Defaults\Provider 的注册表子项中定义。如果 -sy 和 -sp 都出现,则 CryptoAPI 提供程序的类型必须对应于提供程序的子项的Name 值。

-tbs

指定要签名的证书或 CRL 文件。

示例
1.下面的命令创建一个由默认测试根颁发的测试证书并将其写入 testCert.cer。

makecerttestCert.cer

2.下面的命令创建一个由默认测试根颁发的证书并将其保存到证书存储中。

makecert -sstestCertStore

3.下面的命令创建一个由默认测试根颁发的证书并将其保存到证书存储中。它将证书显式放入 currentuser 存储中。

makecert -sstestCertStore -sr currentuser

4.下面的命令使用主题的密钥容器和证书主题的 X.500名称创建一个测试证书,并将其写入 textXYZ.cer。

makecert -skXYZ -n "CN=XYZ Company" testXYZ.cer

5.下面的命令创建一个由默认测试根颁发的证书和一个 .pvk文件,并将此证书同时输出到存储和该文件。

makecert -svtestCert.pvk -ss testCertStore testCert.cer

6.下面的命令创建一个由默认测试根颁发的证书和一个密钥容器,并将此证书同时输出到存储和该文件。

makecert -skmyTestKey -ss testCertStore testCert.cer

7.下面的命令创建一个自我签名证书,指定使用者名称为“ CN=XYZ Company”,指定有效期的起始和结束时间,将密钥放入 my 存储,指定交换密钥,并使

私钥可导出。

makecert -r-pe -n "CN=XYZ Company" -b 01/01/2005 -e 01/01/2010 -sky exchange -ssmy

8.下面的命令创建自我签名证书,该证书可用于在其 URL为www.example.com 的 Web 服务器上测试使用安全套接字层 (SSL) 的Web应用程序。由-eku 选项定义的 OID 将该证书标识为 SSL 服务器证

书。该证书存储在 my存储中,并在计算机(而非用户)级别可用。证书的私钥是可导出的,并且证书有效期为 2010 年 5 月 10 日至 2011 年 12月 22 日。

Makecert -r-pe -n CN="www.example.com" -b 05/10/2010 –e 12/22/2011-eku 1.3.6.1.5.5.7.3.1 -ss my -sr localmachine –sky exchange-sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12

9.下面的命令创建证书并将它们保存到存储中。第一个命令使用默认测试根创建一个证书并将其保存到存储中。第二个命令使用新创建的证书创建另一个证书,并将第二个证书保存到另一个存储中。

makecert -skmyTestKey -ss testCertStore

makecert -istestCertStore -ss anotherTestStore

10.下面的命令创建证书并将它们保存到存储中。第一个命令将证书保存到 my存储。第二个命令使用新创建的证书创建另一个证书。由于 my 存储中有多个证书,因此第二个命令使用其通用名称来标识第一个证书。

makecert -skmyTestKey -n "CN=XXZZYY" -ss my

makecert -ismy -in "XXZZYY" -ss anotherTestStore

11.下面的命令创建证书并将它们保存到文件和存储。第一个命令使用默认测试根创建一个证书并将其保存到my 存储和文件中。第二个命令使用新创建的testCert.cer 证书创建另一个证书。由于my 存储中有多个证书,因此第二个命令使用证书文件名来唯一标识第一个证书。

makecert -skmyTestKey -n "CN=XXZZYY" -ss my testCert.cer

makecert -ismy -ic testCert.cer -ss anotherTestStore

建立自己的根证书:

makecert -skmyPK -ss myName -n "CN=LUO31工作室" -rc:\luo31.cer

sk-表示主题的密钥容器位置,ss-主题的证书存储名称, n-证书颁发对象,r-证书存储位置;

如果你需要导出私钥文件,请不要使用sk,而换作s,

eg:

makecert -ssmyName -n "CN=LUO31工作室" -sv c:\luo31.pvk -rc:\luo31.cer

建立自根跟证书授权的子证书:

makecert -sk"myPK" -is myName -n "CN=luo31" -$ commercial -icc:\luo31.cer c:\31.cer

sk-表示主题的密钥容器位置,is-颁发者的证书存储名称, n-证书颁发对象,ic-颁发者的证书存储位置,-$-授权范围(用于代码签名);

Cert2Spc.exe ---发行者证书测试工具

使用Cert2Spc生成spc发行者证书(可选):

cert2spcc:\31.cer c:\31.spc

Signcode.exe ---文件签名工具

使用signcode为你的程序,库或cab包签名:

双 击signcode,或在控制台键入signcode,不带参数会启动签名向导。在第三步选择“自定义选项”,第四步选择“从文件选择”选择31.spc 或31.cer,第五步选择“CSP中的私钥”,在密钥容器中选择我们定义的myPK,其他步骤默认即可,如果想添加时间戳,请在时间戳服务器地址上键入:(免费时间戳认证)

http://timestamp.verisign.com/scripts/timstamp.dll

完成后,观察你所签名的文件属性,应该已经添加数字签名项。

五 获得数字证书

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

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

使用如下命令来创建自己的数字证书:

makecert.exe -sv mykey.pvk -n "CN=Acme SoftwareInc." mycert.cer你可以将Acme Software Inc.替换为你自己公司的名字。如果mykey.pvk不存在的话,你会要求输入私有密匙的密码,密码可以为空。安全起见最好设置密码,否则别人拿到你的私有密匙后就可以签名了。在上面的命令后,产生了2个文件mykey.pvk和mycert.cer。接下来需要将数字证书(cer)转化为软件发布商证书(spc),命令如下:cert2spc.exe mycert.cer
mycert.spc此过程中需要输入私有密匙的密码,创建完成后应该会生成mycert.spc文件,当数字签名时mycert.cer文件是不需要的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: