Поделиться через


Подписывание документа

[CAPICOM — это 32-разрядный компонент, доступный для использования в следующих операционных системах: Windows Server 2008, Windows Vista и Windows XP. Вместо этого используйте платформа .NET Framework для реализации функций безопасности. Дополнительные сведения см. в разделе Альтернативы использованию CAPICOM.]

Стандартное использование подписи — подписывать текст и сохранять его в файл. Подписанный текст также можно отправить через Интернет. Подписанное сообщение имеет формат PKCS 7.

В этом примере подпись создается для отсоединяемого содержимого (если содержимое не входит в сигнатуру). Отсоединенную подпись чаще всего используют, если получатель подписи имеет копию точного подписанного текста. В приведенном ниже примере исходное сообщение и отсоединенная подпись записываются в отдельные файлы.

При любой ошибке CAPICOM возвращается отрицательное десятичное значение Err.Number . Дополнительные сведения см. в разделе CAPICOM_ERROR_CODE. Сведения о положительных десятичных значениях Err.Number см. в разделе Winerror.h.

При создании подписи используется закрытый ключ подписывателя. Подпись может быть создана только в том случае, если доступен сертификат подписавшего с соответствующим закрытым ключом. В этом примере метода Sign не указывается подписыватель. Если подписыватель не указан и сертификат в CAPICOM_MY_STORE не имеет связанного закрытого ключа, метод Sign завершается ошибкой. Если один и только один сертификат в CAPICOM_MY_STORE имеет связанный закрытый ключ, этот сертификат и его закрытый ключ используются для создания подписи. Если несколько сертификатов в хранилище CAPICOM_MY_STORE имеют связанный закрытый ключ, появится диалоговое окно, и пользователь может выбрать сертификат, который будет использоваться для создания подписи.

Когда веб-приложение использует метод 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