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
- Crie uma nova
SignRequest(ou duplique uma existente). - 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
- Abra a aba Attachments no SoapUI.
- Adicione o arquivo PDF que você deseja assinar.
- Defina o
contentIDdo 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:
-
Feche o SoapUI. Se você modificar o XML com a aplicação aberta, o SoapUI pode sobrescrever as alterações.
-
Localize o XML do projeto. O nome do arquivo será
NOME_DO_PROJETO-soapui-project.xml(por exemplo,RTDSSService-soapui-project.xml). -
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> -
Salve as alterações e abra o SoapUI.
-
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
contentIDdo anexo deve corresponder exatamente ao valor dexop:Include href="cid:...". - No MTOM, você continua usando o elemento
Base64Data, mas substitui o texto Base64 por uma referênciaxop:Includeao 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
SignatureFormpor 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.