Подписывание документа
[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
Связанные темы