Partilhar via


Assinando um documento

[CAPICOM é um componente somente de 32 bits que está disponível para uso nos seguintes sistemas operacionais: Windows Server 2008, Windows Vista e Windows XP. Em vez disso, use o .NET Framework para implementar recursos de segurança. Para obter mais informações, consulte Alternativas ao uso de CAPICOM.]

Um uso padrão de uma assinatura é assinar um texto e salvar esse texto assinado em um arquivo. O texto assinado também pode ser enviado pela Internet. A mensagem assinada está no formato PKCS nº 7.

Neste exemplo, a assinatura é criada para conteúdo desanexado (quando o conteúdo não está incluído com a assinatura). Uma assinatura desanexada seria usada com mais frequência se o destinatário da assinatura tivesse uma cópia do texto assinado exato. No exemplo abaixo, a mensagem original e a assinatura desanexada são gravadas em arquivos separados.

Em qualquer erro CAPICOM, um valor decimal negativo de Err.Number é retornado. Para obter mais informações, consulte CAPICOM_ERROR_CODE. Para obter informações sobre valores decimais positivos de Err.Number, consulte Winerror.h.

A criação de uma assinatura usa a chave privada do signatário. Uma assinatura só poderá ser criada se o certificado do signatário com uma chave privada associada estiver disponível. Este exemplo do método Sign não especifica um signatário. Se um signatário não for especificado e nenhum certificado no CAPICOM_MY_STORE tiver uma chave privada associada, o método Sign falhará. Se um e apenas um certificado no CAPICOM_MY_STORE tiver uma chave privada associada, esse certificado e sua chave privada serão usados para criar a assinatura. Se mais de um certificado no repositório CAPICOM_MY_STORE tiver uma chave privada associada, uma caixa de diálogo será exibida e o usuário poderá escolher o certificado a ser usado para criar a assinatura.

Quando um aplicativo baseado na Web usa o método Sign , um prompt é sempre exibido e a permissão do usuário é necessária antes que uma assinatura que usa a chave privada desse signatário seja criada.

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

Atributo

SignedData