分享
 
 
 

VB与ActiveX控件签名谈

王朝vb·作者佚名  2006-02-23
窄屏简体版  字體: |||超大  

在VS安装后发现路径**VC7\Common7\Tools\Bin\下有许多小工具,我对带有Cert的文件比较感兴趣。经过研究,发现是有关证书和签名的,当然,该证书未被证书认证机构认可。下面列出这些工具和我的使用心得。

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

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

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

面对其众多参数,我只好一一尝试。经过不断的创建,我已经能够做好证书的自我创建,子证书的创建,文件签名。嘿嘿,这下ActiveX控件的自动下载问题也算解决了一大半,有事没事就给自己编的小软件签个名又何妨?

建立自己的根证书:

makecert -sk myPK -ss myName -n "CN=LUO31工作室" -r c:\luo31.cer

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

如果你需要导出私钥文件,请不要使用sk,而换作s,eg:makecert -ss myName -n "CN=LUO31工作室" -sv c:\luo31.pvk -r c:\luo31.cer

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

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

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

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

cert2spc c:\31.cer c:\31.spc

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

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

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

1. 下载数字签名工具

在m$的网站上下载:codesigningx86.exe 文件。解压缩

2. 使用VB的打包向导将主要使用的dll,ocx 文件等打包为 .cab 文件。

3. 使用说明

首先去MS的网站上下载CODESIGN.EXEP这个文件,这是个自解压文件,然后按以下示例做。

这四个工具在C:\Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin也有

工具包包括以下几个软件:

makecert.exe 制作cer格式的证书,即X.509证书,同时可以创建私钥

cert2spc.exe 将cer格式证书转换成spc格式证书,即PKCS #7证书

signcode.exe 将证书签署到ocx上去

chktrust.exe 检查签署证书后的ocx是否正确

还有一个certmgr.exe,是管理证书用的。可以从这里面导出root.cer来,

网上很多文章写到这个证书,但是在VC的安装盘中却找不到。其实,没

有也没关系的。这几个软件可以从VC的安装盘中找到。

下面是具体的步骤:

1、创建一个自己的证书文件:

makecert /sv "Record.PVK" /n "CN=北京美髯公科技发展有限公司" dream.cer

这里,Record.PVK表示新创建的私人密钥保存文件名

DreamCaptial是你想显示的公司名

dream.cer是你创建最后的证书文件名

这些根据你自己的要求填写,最后得到Record.PVK和dream.cer两个文件。

其中,运行过程中需要输入私人密钥的保护密码,一定要输入一致,不要出错。

2、转换cer格式为spc格式(可以省略)

cert2spc dream.cer dream.spc

得到dream.spc文件。

3、给ocx进行签名

运行signcode,命令行的我没有试验通过,我是通过界面实现的。

signcode运行后会出现数字签名向导,首先选择你要签名的ocx,

下一步后会出现签名选项,一种是典型,一种是自定义。选择自定义,

这样才能从文件选择证书,选择前面制作的dream.spc,再下一步是

选择私钥文件,选择Record.PVK,输入私人密钥的保护密码,选择散

列算法,一般用md5就可以了,下一步是选择其他证书,直接下一步,

填写一下这个控件的声明,用户用ie浏览的时候,会弹出证书说明,

再下一步是加盖时间戳,我不会,直接下一步就完成了。

4、用chktrust检查是否正确

chktrust -v RecordProj.ocx

用下列批命令做证书

makecert -sv "denghan.pvk" -n "CN=KinSoft" test.cer

cert2spc test.cer test.spc

---------------------------------------------

用下列命令给CAB文件签名

signcode -spc test.spc -v denghan.pvk -n "这个是CAB数字签名" -t

'添加时间戳

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

rx80.CAB文件用rx80.inf的内容

[version]

signature="$CHICAGO$"

AdvancedINF=2.0

[Add.Code]

test.dll=test.dll

rx80.inf=rx80.inf

[test.dll]

file=rx80.cab

RegisterServer=yes

clsid={7E0CDEE7-DC80-4F37-9410-790BB5E9270E}

DestDir=10

FileVersion=1,0,0,1

[rx80.inf]

file=rx80.cab

把这个CAB文件放到你的服务器上,用下列代码说明你的codebase,就会自动下载了。

<object classid="clsid:7E0CDEE7-DC80-4F37-9410-790BB5E9270E"

codebase="http://yourHostURL/rx80.cab#version=1,0,0,1" width="800" height="191">

...

4. 参考资料

http://msdn.microsoft.com/library/default.asp?url=/library/en-

us/dnaxctrl/html/msdn_deplactx.asp

http://www.verisign.com

预览该网页,会弹出提示框

http://support.microsoft.com/?kbid=182598

http://www.china-askpro.com/msg40/qa13.shtml

How To Implement IObjectSafety in Visual Basic Controls

View products that this article applies to.

Article ID

:

182598

Last Review

:

September 1, 2005

Revision

:

3.1

This article was previously published under Q182598

SUMMARY

This article describes how to implement the IObjectSafety interface in Visual Basic controls to mark the controls safe for scripting and initialization. By default, Visual Basic controls use component category entries in the registry to mark the control safe for scripting and initialization. Implementing the IObjectSafety interface is the preferred method. This article contains all the code that is required to implement this interface in Visual Basic controls.

Please keep in mind that a control should only be marked as safe if it is, in fact, safe. This article does not describe the details of marking controls as safe for scripting and initialization; it simply demonstrates how to do it in code. Please refer to the Internet Client Software Development Kit (SDK) documentation for a detailed description of this. See "Safe Initialization and Scripting for ActiveX Controls" under the Component Development section.

MORE INFORMATION

WARNING: One or more of the following functions are discussed in this article: VarPtr, VarPtrArray, VarPtrStringArray, StrPtr, and ObjPtr. These functions are not supported by Microsoft Technical Support. They are not documented in the Visual Basic documentation and are provided in this Knowledge Base article "as is." Microsoft does not guarantee that they will be available in future releases of Visual Basic. For additional information about these functions, click the article number below to view the article in the Microsoft Knowledge Base:

199824 (http://support.microsoft.com/kb/199824/EN-US/) How To Get the Address of Variables in Visual Basic

The following steps illustrate how to create a simple Visual Basic control and mark it safe for scripting and initialization.

1.

Create a new folder where you can save all files that you create in this example.

2.

Get the OLE Automation Type Library Generator from the Visual Basic CD-ROM. To do this, copy all four files from the \Common\Tools\VB\Unsupprt\Typlib\ folder to your project folder.

3.

Copy the following text into Notepad, and save the file in the project folder as Objsafe.odl:

[

uuid(C67830E0-D11D-11cf-BD80-00AA00575603),

helpstring("VB IObjectSafety Interface"),

version(1.0)

]

library IObjectSafetyTLB

{

importlib("stdole2.tlb");

[

uuid(CB5BDC81-93C1-11cf-8F20-00805F2CD064),

helpstring("IObjectSafety Interface"),

odl

]

interface IObjectSafety:IUnknown {

[helpstring("GetInterfaceSafetyOptions")]

HRESULT GetInterfaceSafetyOptions(

[in] long riid,

[in] long *pdwSupportedOptions,

[in] long *pdwEnabledOptions);

[helpstring("SetInterfaceSafetyOptions")]

HRESULT SetInterfaceSafetyOptions(

[in] long riid,

[in] long dwOptionsSetMask,

[in] long dwEnabledOptions);

}

}

4.

At a command prompt, use the CD <path> command to move to the project folder, and type the following command to generate a .tlb file:

MKTYPLIB objsafe.odl /tlb objsafe.tlb

5.

From Visual Basic, create an ActiveX Control project. In the Properties list, change the name of the project to IObjSafety and the name of the control to DemoCtl. Put a CommandButton named cmdTest on the control. In the Click event handler of the cmdTest, put a MsgBox "Test" statement.

6.

On the Project menu, click References, browse to and add Objsafe.tlb, which you created earlier.

7.

Add a new module to your project with the following code, and name the module basSafeCtl:

Option Explicit

Public Const IID_IDispatch = "{00020400-0000-0000-C000-000000000046}"

Public Const IID_IPersistStorage = _

"{0000010A-0000-0000-C000-000000000046}"

Public Const IID_IPersistStream = _

"{00000109-0000-0000-C000-000000000046}"

Public Const IID_IPersistPropertyBag = _

"{37D84F60-42CB-11CE-8135-00AA004BB851}"

Public Const INTERFACESAFE_FOR_UNTRUSTED_CALLER = &H1

Public Const INTERFACESAFE_FOR_UNTRUSTED_DATA = &H2

Public Const E_NOINTERFACE = &H80004002

Public Const E_FAIL = &H80004005

Public Const MAX_GUIDLEN = 40

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _

(pDest As Any, pSource As Any, ByVal ByteLen As Long)

Public Declare Function StringFromGUID2 Lib "ole32.dll" (rguid As _

Any, ByVal lpstrClsId As Long, ByVal cbMax As Integer) As Long

Public Type udtGUID

Data1 As Long

Data2 As Integer

Data3 As Integer

Data4(7) As Byte

End Type

Public m_fSafeForScripting As Boolean

Public m_fSafeForInitializing As Boolean

Sub Main()

m_fSafeForScripting = True

m_fSafeForInitializing = True

End Sub

8.

From Project Properties, change the Startup Object to Sub Main to execute the Sub Main above. Use the m_fSafeForScripting and m_fSafeForInitializing variables to specify the values of safe for the scripting and/or initialization variables.

9.

Open the code window of your control. Add the following line of code to the Declaration section (right after Option Explicit or as the first):

Implements IObjectSafety

10.

Copy the following two procedures to your controls code:

Private Sub IObjectSafety_GetInterfaceSafetyOptions(ByVal riid As _

Long, pdwSupportedOptions As Long, pdwEnabledOptions As Long)

Dim Rc As Long

Dim rClsId As udtGUID

Dim IID As String

Dim bIID() As Byte

pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER Or _

INTERFACESAFE_FOR_UNTRUSTED_DATA

If (riid <> 0) Then

CopyMemory rClsId, ByVal riid, Len(rClsId)

bIID = String$(MAX_GUIDLEN, 0)

Rc = StringFromGUID2(rClsId, VarPtr(bIID(0)), MAX_GUIDLEN)

Rc = InStr(1, bIID, vbNullChar) - 1

IID = Left$(UCase(bIID), Rc)

Select Case IID

Case IID_IDispatch

pdwEnabledOptions = IIf(m_fSafeForScripting, _

INTERFACESAFE_FOR_UNTRUSTED_CALLER, 0)

Exit Sub

Case IID_IPersistStorage, IID_IPersistStream, _

IID_IPersistPropertyBag

pdwEnabledOptions = IIf(m_fSafeForInitializing, _

INTERFACESAFE_FOR_UNTRUSTED_DATA, 0)

Exit Sub

Case Else

Err.Raise E_NOINTERFACE

Exit Sub

End Select

End If

End Sub

Private Sub IObjectSafety_SetInterfaceSafetyOptions(ByVal riid As _

Long, ByVal dwOptionsSetMask As Long, ByVal dwEnabledOptions As Long)

Dim Rc As Long

Dim rClsId As udtGUID

Dim IID As String

Dim bIID() As Byte

If (riid <> 0) Then

CopyMemory rClsId, ByVal riid, Len(rClsId)

bIID = String$(MAX_GUIDLEN, 0)

Rc = StringFromGUID2(rClsId, VarPtr(bIID(0)), MAX_GUIDLEN)

Rc = InStr(1, bIID, vbNullChar) - 1

IID = Left$(UCase(bIID), Rc)

Select Case IID

Case IID_IDispatch

If ((dwEnabledOptions And dwOptionsSetMask) <> _

INTERFACESAFE_FOR_UNTRUSTED_CALLER) Then

Err.Raise E_FAIL

Exit Sub

Else

If Not m_fSafeForScripting Then

Err.Raise E_FAIL

End If

Exit Sub

End If

Case IID_IPersistStorage, IID_IPersistStream, _

IID_IPersistPropertyBag

If ((dwEnabledOptions And dwOptionsSetMask) <> _

INTERFACESAFE_FOR_UNTRUSTED_DATA) Then

Err.Raise E_FAIL

Exit Sub

Else

If Not m_fSafeForInitializing Then

Err.Raise E_FAIL

End If

Exit Sub

End If

Case Else

Err.Raise E_NOINTERFACE

Exit Sub

End Select

End If

End Sub

11.

On the File menu, save your project and files. Make an OCX file from your project. Your control now implements the IObjectSafety interface. To test it, insert the control in an .htm file.

http://bbs.nsfocus.net/index.php?act=ST&f=2&t=138429&view=old

本文介绍如何创建自己的代码证书(有CA证书签署的代码签名证书)

各位同学在自己动手操作之前请通篇阅读本文。尤其是各条注意事项。

不要看了前文不看后文就动手。否则很容易走上我曾经走过的弯路。

准备工作:

http://ftp.intron.ac/pub/security/里面下载以下软件包:

OpenSSL_0.9.6a-Binary-WIN32.zip

pvknew.zip

signcode_for_IE4.exe

将它们分别解压缩。将以下文件解压缩至一个目录中:

OpenSSL_0.9.6a-Binary-WIN32.zip包中的LIBEAY32.DLL,OPENSSL.CNF,OPENSSL.EXE,

SSLEAY32.DLL

pvknew.zip中的PVK.EXE(这个程序要用到SSLEAY32.DLL)

signcode_for_IE4.exe中的makecert.exe,cert2spc.exe,signcode.exe

1.用openssl创建CA证书的RSA密钥(PEM格式):

openssl genrsa -des3 -out ca.key 1024

2.用openssl创建CA证书(PEM格式,假如有效期为一年):

openssl req -new -x509 -days 365 -key ca.key -out ca.crt -config openssl.cnf

openssl是可以生成DER格式的CA证书的,很奇怪Windows却说那证书是“无效的”,

无奈,只好用IE将PEM格式的CA证书转换成DER格式的CA证书。

3.将ca.crt导入至IE中(我用的是WinME带的IE5.5)。

导入时注意一定要将证书存储至“本地计算机”。

具体步骤如下:

1)在“我的电脑”或“资源管理器”里双击该文件图标。

2)在“常规”卡片上选择“安装证书”。

3)点“下一步”至“证书导入向导”,选择“将所有的证书放入下列存储区”,

点下面的“浏览”。勾上“显示物理存储区”。选择“受信任的根目录...”下一级的

“本地计算机”。点“确定”,再点“下一步”。

4)点“完成”。

可以检查一下导入是否完全成功:

在IE的Internet选项中的“证书”中“受信任根证书颁发机构”中应该可以

看见上述的根证书。

4.IE的Internet选项中的“证书”中“受信任根证书颁发机构”中将刚才

导入的证书导出。格式为“DER编码的二进制X.509(.CER)”。

假设导出的文件名为ca.cer

5.将PEM格式的ca.key转换为Microsoft可以识别的pvk格式。

pvk -in ca.key -out ca.pvk -nocrypt -topvk

6.用codesign for IE4(不可用其它版本的签名工具,比方说for IE5的

或是VC5中带的CAB&SIGN或是.NET Framework SDK)中的makecert.exe制作

自己的有CA证书签署的证书。假设证书通用名为"IntronSoft",有效期六个月:

makecert -sv soft.pvk -iv ca.pvk -ic ca.cer -n CN=Intron的软件 -m 6 soft.cer

这时在“我的电脑”点击ca.cer的文件图标,就可以看见里面的内容了。

7.将soft.cer转换为soft.spc:

cert2spc soft.cer soft.spc

8.用signcode.exe签署自己的软件。假如是.cab文件,需要在用cabarc.exe制作的时候

用-s参数留出签名的空间(一般6144字节即可)。

cabarc.exe在http://ftp.intron.ac/pub/security/cabsign/

signcode -spc soft.spc -v soft.pvk -n Intron的软件 IntronSoft.cab

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有