对控件签名的证书一般来说有两种方式,一种用makecert.exe命令生成证书,另一种在线申请,。下面对两种证书进行说明。
1.用makecert.exe命令生成证书
在MSDN上由makecert.exe详细使用说明和下载。
http://msdn.microsoft.com/en-us/library/bfsktky3(VS.80).aspx
makecert.exe利用默认的Root Agency根证书来生成进行签名所用的证书。但因为Root Agency根证书并不是存放在“受信任的根证书颁发机构”中所以,其生成的签名证书只能用于测试。如果要发布到网络上让他人下载控件进行使用是不可行的。
这里对证书的存放进行以下说明。能够查看到证书存放位置的有两种方式,一种是:
IE->属性->内容->证书
这样的方式仅能看到当前用户的证书。我们可以采用另一种进行查看。我们需要能较方便的操作证书,因为后面需要经常删除,安装证书来进行测试。
另一种方式:
在“开始”->“运行”中输入mmc,出现控制台,点击“文件”下的“添加/删除管理单元”。出现下面窗口。
点击“添加…”找到证书一项如图:
点击“证书”然后点击“添加”。有三项“我的用户帐户”,“服务帐户”和“计算机帐户”,选择“我的用户帐户”和“计算机帐户”添加进入。最后效果
如下:
这样就能看到你电脑上的所有证书了。
虽然makecert.exe生成的证书只能做测试使用,下面还是说明一下如何通过命令生成证书。
makecert /sv "storapp.pvk" /n "CN=www.storapp.com.cn " storapp.cer
创建过程中会提示输入密钥,生成公私密钥对。生成的证书私钥文件为.pvk文件,证书公钥文件为.spc文件,但这里生成的是.cer文件。你可以选择转换成.spc文件也可以不用转换,在签名的时候都可以使用。通过上面命令你就拥有了进行前面的公私文件了。
2.在线申请证书
中国数字认证网提供免费,测试,企业三种根证书。并提供免费证书申请。登陆www.ca365.com后会提示要安装根证书,选择接受安装即可,不然无法进行后续证书的申请。接受完其根证书安装后,可以在前面提高的证书管理中的“受信任的根证书颁发机构中”看到如下三项:
CA365 Enterprise Root Certificate
CA365 Free Root Certificate
CA365 Test Root Certificate
对我们有用的是Free Root Certificate其他两项可以在直接删除。
在免费证书一栏点击“用表格申请证书”填写相关信息,证书用途选择“代码签名证书”,加密服务提供选择“Microsoft Strong Cryptographic Provider”
下面选择“创建新密钥对”,钩选“启用严格密钥保护”和“标记密钥为可导出”。
提交申请。
提交完申请,选择“下载和安装证书”。点击完后需要一段时间,下载下来的证书会先出现在证书控制台的“证书注册申请”一栏中,当页面提示证书安装完成后会出现在“个人”一栏中。这样,证书就申请成功了。
申请成功的证书是.der格式的,这并不是我们要使用的.cer和.pvk文件。如何生成这两个文件是一个稍微麻烦一点的问题。下面对这个问题进行说明。
3.从.der文件导出,并生成.cer和.pvk文件
从.der文件到.cer和.pvk文件要经过两个步骤。
3.1 从.der文件导出形成.pfx文件
从证书控制台的“个人”一栏中找到刚申请成功的证书,右键将其导出。这里要选择,“导出私钥”这一步很重要,不然后面无法生成私钥。刚在在申请私钥的时候并没有填写密码,这是在后面将证书导出后,在本机再生成。重命名后将生成一个.pfx文件。
3.2 从.pfx文件生成.pvk文件
将.pfx文件转化为.pvk文件可以参见:
http://thawte.wosign.com/support/PVK_SPC2PFX.htm该页面,有详细的讲解。在生成密钥文件的时候一定要记住密码,这个在后面的签名中需要使用。
四、控件签名
经过认证文件格式转化和密钥生成后我们现在手中有如下文件:
Storapp.cab Storapp.der Storapp.pvk三个文件,现在是如何使用Storapp.der文件和Storapp.pvk文件对Storapp.cab文件进行签名了。这里可以发现我们使用的公钥是.der文件既不是.cer文件也不是.spc文件。这个经过测试是没有问题的。也就没有必要进行特别的转换了。
对控件进行签名采用的是signcode.exe工具。详细流程可以参见:
http://www.cnblogs.com/babyt/archive/2005/03/14/118264.html
该作者对控件的签名过程进行了截图说明,步骤十分详细,这里就不再累述了。
最后一步要选择时间戳服务器,这里有个免费的:http://timestamp.verisign.com/scripts/timstamp.dll写上去就完了,这样就完成了签名
五、控件发布
进行完上面的工作了,很值得庆幸我们的工作没有多少了。但后面的工作还很关键,不然用户是无法使用控件的。现在我来说明一下控件打开方式的不同。
1. 控件注册和不注册的区别
简而言之控件如果不注册就不能使用。手动通过Regsvr32命令进行注册和编写DllRegisterServer实现自动注册有什么却别?很遗憾这个问题我也没有研究过,个人DllRegisterServer猜测认为,DllRegisterServer是给控件的嵌入容器进行调用的。如果控件的嵌入页面在本机,就是说你在本机开发,进行调试时,IE可能没有调用DllRegisterServer这样为了能使用进行调试,必须手动注册该控件才能使用。
2. 控件嵌入页面在本机,从本机直接打开
如上面所说的本机现在含有了.ocx文件,以及.ocx的嵌入页面文件,这样我们手动注册后就可以使用控件了。这里强调要手工注册是因为,从本地打开嵌入页面IE不会调用DllRegisterServer进行注册,至于为什么不调用,我也没有研究过,只是经过测试,IE确实没有调用而已。
3. 访问WEB站点,打开控件嵌入页面
本机不含有.ocx文件,并且也将进行测试时在注册表中的注册信息删除了,通过访问WEB站点的嵌入页面进行控件使用。这种方式就是最终用户的使用方式。用户通过IE访问嵌有.ocx文件的页面,首先会更怒object对象中指定的CLSID检索注册表,看是否已经安装了该控件,如果安装则对比两个版本。如果本机没有安装,或则版本较低则会访问.cab包,将该包下载下来,进行解压,然后将包中的DLL拷贝到指定的目录(destdir指定了目录),然后再调用DllRegisterServer注册安装.ocx文件。这样控件就可以使用了。
为什么要检查控件对DLL库的依赖性,因为控件运行需要这些DLL库,而并不是所有的用户电脑上都有这些DLL库。我们电脑上有因为我们安装了VS2005,安装了JDK所有DLL库很完善。对于一般的客户而言并没有这些东西,所以需要将所依赖的DLL打包进入.cab文件中。