对文档进行签名

[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

Store.Open

Signer.Certificate

Attribute

SignedData