对文档进行签名
[CAPICOM 是一个仅限 32 位的组件,可用于以下操作系统:Windows Server 2008、Windows Vista 和 Windows XP。 请改用.NET Framework来实现安全功能。 有关详细信息,请参阅 使用 CAPICOM 的替代方法。]
签名的标准用途是对文本进行签名,并将该签名文本保存到文件中。 签名的文本也可以通过 Internet 发送。 签名的消息采用 PKCS #7 格式。
在此示例中,当内容不包含在签名) 时,为分离内容 (创建签名。 如果签名的收件人具有确切的签名文本的副本,则最常使用分离签名。 在下面的示例中,原始消息和分离签名将写入单独的文件。
如果出现任何 CAPICOM 错误,则返回 Err.Number 的负十进制值。 有关详细信息,请参阅 CAPICOM_ERROR_CODE。 有关 Err.Number 的正十进制值的信息,请参阅 Winerror.h。
创建签名使用签名者的 私钥。 仅当签名者的证书具有关联的私钥可用时,才能创建签名。 Sign 方法的此示例未指定签名者。 如果未指定签名者,并且 CAPICOM_MY_STORE 中没有证书具有关联的私钥, 则 Sign 方法将失败。 如果 CAPICOM_MY_STORE 中只有一个证书具有关联的私钥,则使用该证书及其私钥来创建签名。 如果 CAPICOM_MY_STORE 存储中的多个证书具有关联的私钥,则会出现一个对话框,用户可以选择要用于创建签名的证书。
当基于 Web 的应用程序使用 Sign 方法时,始终显示一个提示,并且需要用户的权限,然后才能创建使用该签名者私钥的签名。
Sub Signfile(ByVal InputFileName As String, _
ByVal OutputFileName As String)
On Error GoTo ErrorHandler
Dim c As String
Dim s As String
Dim MyStore As New Store
Dim Signobj As New SignedData
Dim Signer As New Signer
' NOTE: the name 'Attribute' is not a unique name
' and must be preceded by 'CAPICOM.'
Dim SigningTime As New CAPICOM.Attribute
' Open the MY store and retrieve the first certificate from the
' Store. The signing operation will only work if this
' certificate is valid and has access to the signer's private key.
MyStore.Open CAPICOM_CURRENT_USER_STORE, "MY", _
CAPICOM_STORE_OPEN_READ_ONLY
Signer.Certificate = MyStore.Certificates.Item(1)
' Open the input file and read the content to be signed from
' the file.
Open App.Path & "\" & InputFileName For Input As #1
Input #1, c
Close #1
' Set the content to be signed.
Signobj.Content = c
' Save the time the data was signed as a signer attribute.
SigningTime.Name = CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME
SigningTime.Value = Now
Signer.AuthenticatedAttributes.Add SigningTime
' Sign the content using the signer's private key.
' The 'True' parameter indicates that the content signed is not
' included in the signature string.
s = Signobj.Sign(Signer, True)
Open App.Path & "\" & OutputFileName For Output As #2
Write #2, s
Close #2
MsgBox ("Signature done - Saved to file" & OutputFileName)
Set Signobj = Nothing
Set MyStore = Nothing
Set Signer = Nothing
Set SigningTime = Nothing
Exit Sub
ErrorHandler:
If Err.Number > 0 Then
MsgBox ("Visual Basic error found:" & Err.Description)
Else
MsgBox ("CAPICOM error found : " & Err.Number)
End If
End Sub
相关主题