CAPICOM开发指引——证书管理及数字签名

今天介绍如何使用CAPICOM进行证书管理和数字签名。CAPICOM组件有众多属性和方法,在这里不可能一一介绍,这篇文章不是组件的接口手册,而是要通过介绍一两个主要组件的方法,让大家了解调用CAPICOM的基本方法和思路。具体开发时,各位还需要参考具体文档。在这里插入图片描述
证书管理涉及到CAPICOM类型库里的Store、Cerificates和Certificate几个组件。Store为证书库组件,Cerificates是证书集合组件,Certificate就是证书组件了。返回本机上所有的证书集合,采用下面的代码即可(以VB调用为例):

Dim s_store As New CAPICOM.Store

Dim certs As Certificates

s_store.Open CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_READ_ONLY

Set certs = s_store.Certificates

**这里面核心的代码是证书库组件Store的Open方法,用来打开证书存储。**这个方法有三个参数。第一个参数是StoreLocation,代表打开证书存储的位置,取值及代表的含义如下表。
在这里插入图片描述

开发时常用的取值是CAPICOM_LOCAL_MACHINE_STORE和CAPICOM_CURRENT_USER_STORE,缺省值是CAPICOM_CURRENT_USER_STORE。

第二个参数是StoreName,代表要打开的证书存储的名称,即指定打开哪个证书存储,取值及代表的含义如下表。

在这里插入图片描述
参看IE浏览器的证书存储(前面的文章介绍过),就可以更清楚地理解上述参数取值的含义。缺省值是CAPICOM_MY_STORE。

第三个参数是OpenMode,代表证书存储的打开模式,取值及代表的含义如下表。
在这里插入图片描述

其中,后面两个参数取值可以和前三个取值用或操作合并赋值。参数缺省值是CAPICOM_STORE_OPEN_READ_ONLY,即只读打开。可以看出,调用Store组件的Open方法可以不传入任何参数,这也就是CAPICOM的特点,用缺省值设置最常用的应用场景,以最大程度地降低开发的难度。

**调用Open方法后,就可以通过Store组件的Certificates属性得到证书集合。**遍历这个集合对象,得到集合里的每一个Certificate对象元素,比如下面的代码。

Dim s_Cer As Certificate

For Each s_Cer In certs

//处理过程

End If

Next

通过Certificate对象,就可以访问和使用证书的各项功能了。比如下列代码:

//证书持有人的简称

s_Cer.GetInfo(CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME)

//证书颁发者的全称

s_Cer. IssuerName

//证书截止有效期

s_Cer.ValidToDate

//显示证书

s_Cer.Display

得到证书对象后,就可以使用证书对应的密钥进行数字签名了。这里面涉及到的SignedData组件和Signer组件。实现签名的代码也很简单。

Dim sd As New SignedData

sd.Content = InputMsg

Dim dispSigner As New Signer

dispSigner.Certificate = s_Cer.

signature = sd.Sign(dispSigner, True, CAPICOM_ENCODE_BASE64)

SignedData对象是完成签名功能的核心组件,它的Content属性代表产生数字签名的原文,因此签名前需要将原文赋值给它。Signer对象代表签名的用户,其实就可以理解成生成签名的证书,它的缺省属性也就是Certificate。前面文章介绍过,数字签名实际是调用证书所对应的私钥,所以一定要使用打开个人证书存储得到的证书集合里的证书元素对象为Signer.Certificate属性赋值,而通过其他方式得到的证书对象是没有对应私钥的,不能用来签名。前面两个属性设置好后,就可以调用SignedData对象的Sign方法进行签名。Sign方法也包含三个参数,同样都是可选的。第一个参数是Signer,即代表生成签名的证书的Signer组件对象,如果不设置此参数,调用方法时系统会弹出证书对话框让用户选择要用来签名的证书;
在这里插入图片描述

第二个参数是bDetached,表示原文和签名结果是否分离。如果为True,说明签名结果里不包含原文,否则包含。这个参数的缺省值是False,但在实际应用中这里一般应该传True,因为验证签名时明文都是由外部传入,而不会用签名结果里的明文;第三个参数是EncodingType,代表数字签名结果的编码方式,取值及代表的含义如下表。
在这里插入图片描述

缺省值是CAPICOM_ENCODE_BASE64,这样适用的范围更加广泛,特别是针对客户端脚本调用环境。Sign方法成功后,将返回以指定方式编码的签名结果,否则会抛出错误。

数字签名验证代码如下:

sd.Content = InputMsg

sd.Verify signature, True, CAPICOM_VERIFY_SIGNATURE_ONLY

和Sign方法一样,验证签名前需要将原文赋值给SignedData对象的Content属性。数字签名的验证调用SignedData对象的Verify方法,第一个参数SignedMessage为待验证数字签名;第二个参数是bDetached,意义与Sign方法的bDetached参数一致,应用时取值也必须和Sign方法一样;第三个参数是VerifyFlag,用来标识验证方式,取值及代表的含义如下表。
在这里插入图片描述

VerifyFlag的缺省值是CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE,但在实际应用时,验证证书有效性可能会带来一些复杂的结果,所以这里推荐使用CAPICOM_VERIFY_SIGNATURE_ONLY,证书的有效性可以单独来验证。此方法没有返回结果,如果验证失败,会抛出具体错误,否则表明验证成功。数字签名如果验证成功,可以通过访问SignedData对象的Signers属性返回签名所使用的证书集合。这里要说明的是,调用Sign方法签名时传入的是Signer对象,但验证时返回的是Signers对象,即Signer对象的集合,是因为SignedData对象支持通过调用CoSign方法实现多用户会签。

证书管理以及数字签名是最基本的,也是最常用的CAPICOM应用实例。相信大家现在对CAPICOM的使用应该有所了解了,总体来讲还是比较简单的。如果有任何问题,欢迎在评论区交流讨论。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_45303938

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值