Pular para o conteúdo principal
Version: 4.41

Tutorial: Assinatura de documentos com MTOM via DSS

Este tutorial mostra como enviar documentos para o Digital Signature Service (DSS) usando MTOM (Message Transmission Optimization Mechanism). Você usa o SoapUI para enviar uma SignRequest que referencia o documento como um anexo MIME, em vez de incorporá-lo como Base64.

Ao concluir este tutorial, você terá uma petição de assinatura baseada em MTOM que retorna uma SignResponse válida do DSS.

Contexto

O MTOM é um mecanismo SOAP que permite enviar dados binários de grande porte de forma eficiente. Em vez de incorporar o documento como Base64 dentro do corpo SOAP, o cliente envia o documento como um anexo MIME e o referencia a partir da mensagem SOAP usando XOP.

No DSS, o MTOM altera a forma como o documento é transportado, não como ele é processado. A lógica de assinatura permanece a mesma, mas a petição usa um endpoint específico com MTOM habilitado e uma referência xop:Include em vez de Base64Data.

Antes de começar

Antes de começar, verifique se você dispõe do seguinte:

  • Acesso a um ambiente do Redtrust com o serviço DSS habilitado
  • Uma conta de usuário local do Redtrust (usuario@dominio) com uma política que permita serviços de assinatura (consulte a seção Como da política)
  • Pelo menos um certificado de assinatura disponível para esse usuário
  • SoapUI ou outro cliente HTTP capaz de enviar petições SOAP 1.2

Este tutorial parte de uma configuração do DSS existente e funcional no SoapUI. Se você não consegue enviar corretamente uma SignRequest padrão (sem MTOM), revise antes o tutorial de primeiros passos.

Etapa 1: Criar uma petição MTOM no SoapUI

  1. Crie uma nova SignRequest (ou duplique uma existente).
  2. Defina a URL da petição no endpoint MTOM.
https://REDTRUST_IP:8080/RTDSSService.svc/mtom

Configure a autenticação e o WS-Addressing exatamente da mesma forma que para as petições DSS padrão, conforme descrito no passo 4 do tutorial de primeiros passos.

Etapa 2: Adicionar o documento como anexo

  1. Abra a aba Attachments no SoapUI.
  2. Adicione o arquivo PDF que você deseja assinar.
  3. Defina o contentID do anexo (por exemplo, test.pdf).

Etapa 3: Forçar a parte do anexo para BODY

O SoapUI não permite selecionar BODY como parte do anexo pela interface gráfica. Para fazer isso manualmente:

  1. Feche o SoapUI. Se você modificar o XML com a aplicação aberta, o SoapUI pode sobrescrever as alterações.

  2. Localize o XML do projeto. O nome do arquivo será NOME_DO_PROJETO-soapui-project.xml (por exemplo, RTDSSService-soapui-project.xml).

  3. Na interface MTOM, procure a definição do anexo e substitua <con:part xsi:nil="true"/> por <con:part>BODY</con:part>. O resultado final deve ser semelhante a este:

    <con:attachment>
    <con:name>MyDocument.pdf</con:name>
    <con:contentType>application/pdf</con:contentType>
    <con:contentId>test.pdf</con:contentId>
    <con:part>BODY</con:part>
    <con:url>C:/path/to/MyDocument.pdf</con:url>
    </con:attachment>
  4. Salve as alterações e abra o SoapUI.

  5. Selecione a petição e, no painel Request Properties (normalmente abaixo da navegação do projeto), defina Force MTOM como true.

Passo 4: Construir a SignRequest com MTOM

Agora você pode construir a petição conforme mostrado abaixo. Observe o seguinte:

  • O contentID do anexo deve corresponder exatamente ao valor de xop:Include href="cid:...".
  • No MTOM, você continua usando o elemento Base64Data, mas substitui o texto Base64 por uma referência xop:Include ao anexo MIME.
  • Profile é o nome do perfil de assinatura que você criou no Redtrust.
  • Embora o documento assinado seja um PDF, este serviço expõe a assinatura PAdES sob o espaço de nomes do perfil XAdES. Não substitua o valor de SignatureForm por uma URI de PAdES.
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:urn="urn:oasis:names:tc:dss:1.0:core:schema">
<soap:Body>
<SignRequest Profile="YOUR_DSS_PROFILE" RequestID="SEU_PERFIL_DSS" xmlns="urn:oasis:names:tc:dss:1.0:core:schema">
<OptionalInputs>
<Language>en-US</Language>
<KeySelector>
<KeyInfo Id="Thumbprint" xmlns="http://www.w3.org/2000/09/xmldsig#">THUMBPRINT</KeyInfo>
</KeySelector>
<SignatureForm xmlns="urn:evolium:redtrust:dss:1.0:core:schema">urn:oasis:names:tc:dss:1.0:profiles:XAdES:forms:BES</SignatureForm>
</OptionalInputs>
<InputDocuments>
<Document ID="DOCUMENT_ID" xmime:contentType="application/pdf" xmlns:xmime="http://www.w3.org/2005/05/xmlmime">
<Base64Data MimeType="application/pdf">
<xop:Include href="cid:CONTENT_ID" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
</Base64Data>
</Document>
</InputDocuments>
</SignRequest>
</soap:Body>
</soap:Envelope>
Exemplo de solicitação
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:urn="urn:oasis:names:tc:dss:1.0:core:schema">
<soap:Body>
<SignRequest Profile="pades-bes-profile" RequestID="pades-bes-profile" xmlns="urn:oasis:names:tc:dss:1.0:core:schema">
<OptionalInputs>
<Language>en-US</Language>
<KeySelector>
<KeyInfo Id="Thumbprint" xmlns="http://www.w3.org/2000/09/xmldsig#">5F5162563AFF01EB353D346C8B786AAA2A0CFB09</KeyInfo>
</KeySelector>
<SignatureForm xmlns="urn:evolium:redtrust:dss:1.0:core:schema">urn:oasis:names:tc:dss:1.0:profiles:XAdES:forms:BES</SignatureForm>
</OptionalInputs>
<InputDocuments>
<Document ID="ID-document-1" xmime:contentType="application/pdf" xmlns:xmime="http://www.w3.org/2005/05/xmlmime">
<Base64Data MimeType="application/pdf">
<xop:Include href="cid:test.pdf" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
</Base64Data>
</Document>
</InputDocuments>
</SignRequest>
</soap:Body>
</soap:Envelope>

Passo 5: Enviar a solicitação e verificar o resultado

Se tudo estiver configurado corretamente, o DSS retorna uma SignResponse com o documento assinado na aba Attachment da resposta.

  <s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">urn:evolium:redtrust:dss:ws/RTDSSService/SignRequestResponse</a:Action>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SignResponse RequestID="pades-bes-profile" Profile="pades-bes-profile" xmlns="urn:oasis:names:tc:dss:1.0:core:schema">
<Result>
<ResultMajor>urn:oasis:names:tc:dss:1.0:resultmajor:Success</ResultMajor>
</Result>
<SignatureObject>
<Base64Signature Type="urn:ietf:rfc:3369">
<xop:Include href="cid:http://tempuri.org/1/639058938559817471" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
</Base64Signature>
</SignatureObject>
</SignResponse>
</s:Body>
</s:Envelope>

Próximos passos

  • Consulte a referência da API DSS para obter informações mais detalhadas sobre os elementos das solicitações.