# Getting started

## O que é a solução?

Unificamos e simplificamos o uso de diversos dispositivos criptográficos em uma única plataforma de rápida integração. Cuidamos de todo o ciclo de vida do processo desde a autenticação, tokenização e geração dos resumos criptográficos.&#x20;

### Essa solução é a ideal para o meu negócio?

Precisa oferecer suporte a assinatura e/ou criptografia nos padrões ICP-Brasil no seu sistema e não quer perder tempo desenvolvendo e mantendo uma solução para comunicação com certificados A1/A3 e ainda se preocupando com diversos protocolos de conexão com smartcards/tokens etc? Se sim, essa é a solução ideal para você conseguir estar a frente do mercado e continuar com o foco principal do seu software.

## Quais são os dispositivos compatíveis?

São compatíveis todos os certificados digitais aderentes a ICP-Brasil. O que é preciso observar é onde esse certificado está armazenado.

Os certificados comumente encontrados no mercado são os do tipo A1 e A3. Aí que está a principal diferença, os certificados do tipo A3 precisam ser emitidos e armazenados em dispositivos de segurança tais como: tokens, cartões e HSMs. Já os certificados do tipo A1 podem ser emitidos diretamente no seu computador fora de um hardware de segurança específico para tal finalidade (por isso os certificados A1 possuem um nível de classificação de segurança inferior e consequentemente só podem receber um menor tempo de expiração/vencimento)

No universo WEB acessar dispositivos de hardware via porta USB/rede (A3) ou arquivos na máquina (A1) requerem um plugin para possibilitar a comunicação do site web com um componente local instalado na máquina. A nossa plataforma possui um plugin próprio e abstrai toda a comunicação entre esses componentes, tornando indiferente para o processo de assinatura o tipo de certificado e se ele está armazenado em um arquivo, token/smartcard.

Também somos compatíveis com o mais novo padrão da ICP-Brasil, o certificado em nuvem: O certificado em nuvem pode ser um A1/A3 que fica armazenado na infraestrutura de um PSC - (Prestador de serviço de confiança credenciado ICP Brasil). Esse armazenamento em nuvem possui diversas vantagens tanto no uso quanto na segurança, com o uso do certificado em nuvem a nossa plataforma não requer o uso do plugin instalado no computador para realizar as operações criptografícas, podendo ser feitas até mesmo em um *smartphone* ou *tablet*.

## Como funciona?

### 1º Passo

De dentro do seu sistema, redirecione o usuário para a plataforma carregando um *payload* de transação. Nesse *payload* deve conter as informações dos documentos a serem assinados e qual URL do seu sistema o usuário será redirecionado de volta ao finalizar a assinatura.&#x20;

### 2º Passo

Receba o usuário na URL definida no primeiro passo. Junto a essa URL será retornado o *payload* do processo de assinatura  com as informações dos documentos já assinados

## Exemplo

### Chamada de redirecionamento:

```
https://sandbox-assinatura.gestao.plus/sign/<PAYLOAD>
```

### Como compor o payload:

O payload esperado deve ser no formato JSON

```javascript
{
	"callbackUrl": "https://myfrontend-routesample?origin=usersamplexpto&state=anystate&payload=",
	"webhookUrl": "https://mybackend-routesample?origin=usersamplexpto&state=anystate",
	"security": {
		"allowAddNewDocument": false,
		"allowDocumentType": false,
    "payloadCallbackUrl": true
	},
	"files": [{
			"name": "Sample PDF",
			"src": "http://nematoides.com.br/Content/Fotos/exemplo-de-pdf.pdf"
		},
		{
			"name": "Sample PDF 2",
			"src": "data:application/pdf;base64,JVBERi0xLjUKJbXtrvsKMyAwIG9iago8PCAvTGVuZ3RoIDQgMCBSCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4nE2NuwoCQQxF+/mK+wMbk5lkHl+wIFislmIhPhYEi10Lf9/MVgZCAufmZAkMppJ6+ZLUuFWsM3ZXxvzpFNaMYjEriqpCtbZSBOsDzw0zjqPHZYtTrEmz4eto7/0K54t7GfegOGCBbBdDH3+y2zsMsVERc9SoRkXORqKGJupS6/9OmMIUfgypJL4KZW5kc3RyZWFtCmVuZG9iago0IDAgb2JqCiAgIDEzOAplbmRvYmoKMiAwIG9iago8PAogICAvRXh0R1N0YXRlIDw8CiAgICAgIC9hMCA8PCAvQ0EgMC42MTE5ODcgL2NhIDAuNjExOTg3ID4+CiAgICAgIC9hMSA8PCAvQ0EgMSAvY2EgMSA+PgogICA+Pgo+PgplbmRvYmoKNSAwIG9iago8PCAvVHlwZSAvUGFnZQogICAvUGFyZW50IDEgMCBSCiAgIC9NZWRpYUJveCBbIDAgMCA1OTUuMjc1NTc0IDg0MS44ODk3NzEgXQogICAvQ29udGVudHMgMyAwIFIKICAgL0dyb3VwIDw8CiAgICAgIC9UeXBlIC9Hcm91cAogICAgICAvUyAvVHJhbnNwYXJlbmN5CiAgICAgIC9DUyAvRGV2aWNlUkdCCiAgID4+CiAgIC9SZXNvdXJjZXMgMiAwIFIKPj4KZW5kb2JqCjEgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzCiAgIC9LaWRzIFsgNSAwIFIgXQogICAvQ291bnQgMQo+PgplbmRvYmoKNiAwIG9iago8PCAvQ3JlYXRvciAoY2Fpcm8gMS4xMS4yIChodHRwOi8vY2Fpcm9ncmFwaGljcy5vcmcpKQogICAvUHJvZHVjZXIgKGNhaXJvIDEuMTEuMiAoaHR0cDovL2NhaXJvZ3JhcGhpY3Mub3JnKSkKPj4KZW5kb2JqCjcgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cKICAgL1BhZ2VzIDEgMCBSCj4+CmVuZG9iagp4cmVmCjAgOAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDA1ODAgMDAwMDAgbiAKMDAwMDAwMDI1MiAwMDAwMCBuIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAyMzAgMDAwMDAgbiAKMDAwMDAwMDM2NiAwMDAwMCBuIAowMDAwMDAwNjQ1IDAwMDAwIG4gCjAwMDAwMDA3NzIgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSA4CiAgIC9Sb290IDcgMCBSCiAgIC9JbmZvIDYgMCBSCj4+CnN0YXJ0eHJlZgo4MjQKJSVFT0YK"
		}
	]
}
```

{% hint style="warning" %}
Pode ser necessário a inclusão do endpoint <https://sandbox-assinatura.gestao.plus> na whitelist de CORS de onde o PDF está armazenado. (GET/HEAD)\
\
Veja como habilitar esse recurso em um bucket AWS/S3 <https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html#how-do-i-enable-cors>
{% endhint %}

### Como envelopar o payload e computar URL com token HMAC:

O payload deve ser assinado para garantir a origem/integridade da URL de redirecionamento

{% tabs %}
{% tab title="PHP" %}

```php
<?php

$plusGApp = "https://sandbox-assinatura.gestao.plus/sign";
$sharedKey = "MY_SECRET";

$payloadJson = '{"callbackUrl":"https://myfrontend-routesample?origin=usersamplexpto&state=anystate&payload=","webhookUrl":"https://mybackend-routesample?origin=usersamplexpto&state=anystate","security":{"allowAddNewDocument":false,"allowDocumentType":false,"payloadCallbackUrl":true},"files":[{"name":"Sample PDF","src":"http://nematoides.com.br/Content/Fotos/exemplo-de-pdf.pdf"},{"name":"Sample PDF 2","src":"data:application/pdf;base64,JVBERi0xLjUKJbXtrvsKMyAwIG9iago8PCAvTGVuZ3RoIDQgMCBSCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4nE2NuwoCQQxF+/mK+wMbk5lkHl+wIFislmIhPhYEi10Lf9/MVgZCAufmZAkMppJ6+ZLUuFWsM3ZXxvzpFNaMYjEriqpCtbZSBOsDzw0zjqPHZYtTrEmz4eto7/0K54t7GfegOGCBbBdDH3+y2zsMsVERc9SoRkXORqKGJupS6/9OmMIUfgypJL4KZW5kc3RyZWFtCmVuZG9iago0IDAgb2JqCiAgIDEzOAplbmRvYmoKMiAwIG9iago8PAogICAvRXh0R1N0YXRlIDw8CiAgICAgIC9hMCA8PCAvQ0EgMC42MTE5ODcgL2NhIDAuNjExOTg3ID4+CiAgICAgIC9hMSA8PCAvQ0EgMSAvY2EgMSA+PgogICA+Pgo+PgplbmRvYmoKNSAwIG9iago8PCAvVHlwZSAvUGFnZQogICAvUGFyZW50IDEgMCBSCiAgIC9NZWRpYUJveCBbIDAgMCA1OTUuMjc1NTc0IDg0MS44ODk3NzEgXQogICAvQ29udGVudHMgMyAwIFIKICAgL0dyb3VwIDw8CiAgICAgIC9UeXBlIC9Hcm91cAogICAgICAvUyAvVHJhbnNwYXJlbmN5CiAgICAgIC9DUyAvRGV2aWNlUkdCCiAgID4+CiAgIC9SZXNvdXJjZXMgMiAwIFIKPj4KZW5kb2JqCjEgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzCiAgIC9LaWRzIFsgNSAwIFIgXQogICAvQ291bnQgMQo+PgplbmRvYmoKNiAwIG9iago8PCAvQ3JlYXRvciAoY2Fpcm8gMS4xMS4yIChodHRwOi8vY2Fpcm9ncmFwaGljcy5vcmcpKQogICAvUHJvZHVjZXIgKGNhaXJvIDEuMTEuMiAoaHR0cDovL2NhaXJvZ3JhcGhpY3Mub3JnKSkKPj4KZW5kb2JqCjcgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cKICAgL1BhZ2VzIDEgMCBSCj4+CmVuZG9iagp4cmVmCjAgOAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDA1ODAgMDAwMDAgbiAKMDAwMDAwMDI1MiAwMDAwMCBuIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAyMzAgMDAwMDAgbiAKMDAwMDAwMDM2NiAwMDAwMCBuIAowMDAwMDAwNjQ1IDAwMDAwIG4gCjAwMDAwMDA3NzIgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSA4CiAgIC9Sb290IDcgMCBSCiAgIC9JbmZvIDYgMCBSCj4+CnN0YXJ0eHJlZgo4MjQKJSVFT0YK"}]}';

//Payload
$payloadEncoded = base64_encode($payloadJson);

//Compute HMAC
$nonce = time() . rand(0,9999);
$token = $nonce . "-" . md5($nonce . $sharedKey . md5($payloadEncoded));

//URL
$url = $plusGApp . '/' . $token . '/' . urlencode($payloadEncoded);

echo $url;
```

{% endtab %}
{% endtabs %}

### Como esperar o callback de retorno do frontend (web/deep linking app):

Ao criar o payload de envio pode ser criado uma URL prévia da URL de retorno da sua aplicação, contendo as informações de *estado* da aplicação (exemplo: tela de retorno, usuário logado etc)

```javascript
https://myfrontend-routesample?origin=usersamplexpto&state=anystate
```

Caso no payload seja solicitado também os ids e URLS dos documentos assinados (através da ativação da flag em: *security* -> *payloadCallbackUrl* ) a url de retorno deve estar preparada para o payload ser concatenado no final, exemplo:&#x20;

```javascript
https://myfrontend-routesample?origin=usersamplexpto&state=anystate&payload=
```

### Como esperar o webhook de retorno:

Será enviada uma requisição REST do tipo POST com o JSON de retorno do Webhook, o endpoint enviado de retorno de webhook da sua aplicação deve esperar o formato:

```javascript
{
  "message": "Signed OK",
  "documents": [{
    "id": 0,
    "downloadLink": "https://sandbox-assinatura.gestao.plus/storage/0-bcbb5b72af85a68709f12c9bdfbd1efd759522d3.pdf"
  }, {
    "id": 1,
    "downloadLink": "https://sandbox-assinatura.gestao.plus/storage/1-d5e5b6f4b3b7ea13920286d400b4fa1d34512f2b.pdf"
  }]
}
```

## Exemplo no cenário médico (CFM/CFF)

### Especificando o tipo de arquivo

É possível através do payload indiciar o tipo de documento (por arquivo), essa opção esconde o combobox na hora da assinatura.

Ex:

```javascript
{
	...
	"files": [{
		"name": "Sample Base64",
		"id": "token-1",
		"src": "data:application\/pdf;base64,JVBERi0xLjUKJbXtrvsKMyAwIG9iago8PCAvTGVuZ3RoIDQgMCBSCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4nE2NuwoCQQxF+\/mK+wMbk5lkHl+wIFislmIhPhYEi10Lf9\/MVgZCAufmZAkMppJ6+ZLUuFWsM3ZXxvzpFNaMYjEriqpCtbZSBOsDzw0zjqPHZYtTrEmz4eto7\/0K54t7GfegOGCBbBdDH3+y2zsMsVERc9SoRkXORqKGJupS6\/9OmMIUfgypJL4KZW5kc3RyZWFtCmVuZG9iago0IDAgb2JqCiAgIDEzOAplbmRvYmoKMiAwIG9iago8PAogICAvRXh0R1N0YXRlIDw8CiAgICAgIC9hMCA8PCAvQ0EgMC42MTE5ODcgL2NhIDAuNjExOTg3ID4+CiAgICAgIC9hMSA8PCAvQ0EgMSAvY2EgMSA+PgogICA+Pgo+PgplbmRvYmoKNSAwIG9iago8PCAvVHlwZSAvUGFnZQogICAvUGFyZW50IDEgMCBSCiAgIC9NZWRpYUJveCBbIDAgMCA1OTUuMjc1NTc0IDg0MS44ODk3NzEgXQogICAvQ29udGVudHMgMyAwIFIKICAgL0dyb3VwIDw8CiAgICAgIC9UeXBlIC9Hcm91cAogICAgICAvUyAvVHJhbnNwYXJlbmN5CiAgICAgIC9DUyAvRGV2aWNlUkdCCiAgID4+CiAgIC9SZXNvdXJjZXMgMiAwIFIKPj4KZW5kb2JqCjEgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzCiAgIC9LaWRzIFsgNSAwIFIgXQogICAvQ291bnQgMQo+PgplbmRvYmoKNiAwIG9iago8PCAvQ3JlYXRvciAoY2Fpcm8gMS4xMS4yIChodHRwOi8vY2Fpcm9ncmFwaGljcy5vcmcpKQogICAvUHJvZHVjZXIgKGNhaXJvIDEuMTEuMiAoaHR0cDovL2NhaXJvZ3JhcGhpY3Mub3JnKSkKPj4KZW5kb2JqCjcgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cKICAgL1BhZ2VzIDEgMCBSCj4+CmVuZG9iagp4cmVmCjAgOAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDA1ODAgMDAwMDAgbiAKMDAwMDAwMDI1MiAwMDAwMCBuIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAyMzAgMDAwMDAgbiAKMDAwMDAwMDM2NiAwMDAwMCBuIAowMDAwMDAwNjQ1IDAwMDAwIG4gCjAwMDAwMDA3NzIgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSA4CiAgIC9Sb290IDcgMCBSCiAgIC9JbmZvIDYgMCBSCj4+CnN0YXJ0eHJlZgo4MjQKJSVFT0YK",
		"signatureSetting": {
			"type": "CFMBR-2.16.76.1.12.1.11"
		}
	}, {
		"name": "Name Xpty",
		"id": "token-2",
		"src": "https:\/\/cdn.rawgit.com\/mozilla\/pdf.js\/c6e8ca86\/test\/pdfs\/calrgb.pdf",
		"signatureSetting": {
			"type": "CFMBR-2.16.76.1.12.1.6"
		}
	}]
}
```

| Tipo                    | Descrição                       |
| ----------------------- | ------------------------------- |
| CFMBR-2.16.76.1.12.1.1  | Prescrição de medicamento       |
| CFMBR-2.16.76.1.12.1.2  | Atestado médico                 |
| CFMBR-2.16.76.1.12.1.3  | Solicitação de exame            |
| CFMBR-2.16.76.1.12.1.4  | Laudo laboratorial              |
| CFMBR-2.16.76.1.12.1.5  | Sumária de alta                 |
| CFMBR-2.16.76.1.12.1.6  | Registro de atendimento clínico |
| CFMBR-2.16.76.1.12.1.7  | Dispensação de medicamento      |
| CFMBR-2.16.76.1.12.1.8  | Vacinação                       |
| CFMBR-2.16.76.1.12.1.11 | Relatório Médico                |
| DOC-pdf                 | Outros arquivos de PDF          |

### Especificando os campos adicionais

O portal de validação de documentos digitais do ITI (Instituto Nacional de Tecnologia da Informação) em parceria com CFM (Conselho Federal de Medicina.)  e CFF (Conselho Federal de Farmácia)  espera alguns  metadados do profissional como número do CRM/CFF e UF durante o processo de assinatura. A lista completa pode ser conferida no site <https://assinaturadigital.iti.gov.br/duvidas/#1587761771301-8f0416f4-c42c>\
\
Esses campos também devem ser adicionados no payload para serem incluídos na hora da assinatura.

Ex:

```javascript
{
	...
	"extraKeys": [{
		"name": "2.16.76.1.4.2.2.1",
		"value": "1234567"
	}, {
		"name": "2.16.76.1.4.2.2.2",
		"value": "GO"
	}],
	... 
}
```

|   |
| - |

Exemplo completo de payload no cenário médico:

```javascript
{
	"callbackUrl": "https:\/\/api-sandbox-assinatura.gestao.plus\/sample.php?signed=true&payload=",
	"webhookUrl": "https:\/\/gestao.plus\/?origin=usersamplexpto&state=anystate",
	"extraKeys": [{
		"name": "2.16.76.1.4.2.2.1",
		"value": "1234567"
	}, {
		"name": "2.16.76.1.4.2.2.2",
		"value": "GO"
	}],
	"ui": {
		"username": "65415708090"
	},
	"security": {
		"allowAddNewDocument": false,
		"allowDocumentType": false,
		"payloadCallUrl": true
	},
	"files": [{
		"name": "Sample Base64",
		"id": "token-1",
		"src": "data:application\/pdf;base64,JVBERi0xLjUKJbXtrvsKMyAwIG9iago8PCAvTGVuZ3RoIDQgMCBSCiAgIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlCj4+CnN0cmVhbQp4nE2NuwoCQQxF+\/mK+wMbk5lkHl+wIFislmIhPhYEi10Lf9\/MVgZCAufmZAkMppJ6+ZLUuFWsM3ZXxvzpFNaMYjEriqpCtbZSBOsDzw0zjqPHZYtTrEmz4eto7\/0K54t7GfegOGCBbBdDH3+y2zsMsVERc9SoRkXORqKGJupS6\/9OmMIUfgypJL4KZW5kc3RyZWFtCmVuZG9iago0IDAgb2JqCiAgIDEzOAplbmRvYmoKMiAwIG9iago8PAogICAvRXh0R1N0YXRlIDw8CiAgICAgIC9hMCA8PCAvQ0EgMC42MTE5ODcgL2NhIDAuNjExOTg3ID4+CiAgICAgIC9hMSA8PCAvQ0EgMSAvY2EgMSA+PgogICA+Pgo+PgplbmRvYmoKNSAwIG9iago8PCAvVHlwZSAvUGFnZQogICAvUGFyZW50IDEgMCBSCiAgIC9NZWRpYUJveCBbIDAgMCA1OTUuMjc1NTc0IDg0MS44ODk3NzEgXQogICAvQ29udGVudHMgMyAwIFIKICAgL0dyb3VwIDw8CiAgICAgIC9UeXBlIC9Hcm91cAogICAgICAvUyAvVHJhbnNwYXJlbmN5CiAgICAgIC9DUyAvRGV2aWNlUkdCCiAgID4+CiAgIC9SZXNvdXJjZXMgMiAwIFIKPj4KZW5kb2JqCjEgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzCiAgIC9LaWRzIFsgNSAwIFIgXQogICAvQ291bnQgMQo+PgplbmRvYmoKNiAwIG9iago8PCAvQ3JlYXRvciAoY2Fpcm8gMS4xMS4yIChodHRwOi8vY2Fpcm9ncmFwaGljcy5vcmcpKQogICAvUHJvZHVjZXIgKGNhaXJvIDEuMTEuMiAoaHR0cDovL2NhaXJvZ3JhcGhpY3Mub3JnKSkKPj4KZW5kb2JqCjcgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cKICAgL1BhZ2VzIDEgMCBSCj4+CmVuZG9iagp4cmVmCjAgOAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDA1ODAgMDAwMDAgbiAKMDAwMDAwMDI1MiAwMDAwMCBuIAowMDAwMDAwMDE1IDAwMDAwIG4gCjAwMDAwMDAyMzAgMDAwMDAgbiAKMDAwMDAwMDM2NiAwMDAwMCBuIAowMDAwMDAwNjQ1IDAwMDAwIG4gCjAwMDAwMDA3NzIgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSA4CiAgIC9Sb290IDcgMCBSCiAgIC9JbmZvIDYgMCBSCj4+CnN0YXJ0eHJlZgo4MjQKJSVFT0YK",
		"signatureSetting": {
			"type": "CFMBR-2.16.76.1.12.1.11"
		}
	}, {
		"name": "Name Xpty",
		"id": "token-2",
		"src": "https:\/\/cdn.rawgit.com\/mozilla\/pdf.js\/c6e8ca86\/test\/pdfs\/calrgb.pdf",
		"signatureSetting": {
			"type": "CFMBR-2.16.76.1.12.1.6"
		}
	}]
}
```


# Requisição de assinatura

Parâmetros para compor uma solicitação de assinatura

## Tipos de assinatura por tipo de arquivo

### Assinatura CMS - Internacional

```json
{
  "callbackUrl": "...", //URL de callback (página que será retornado ao assinar)
  "webhookUrl": "...", //URL de webhook (opcional)
  "security": {...}, //Array da configuração de segurança (na UI)
  "ui": {...}, //Configuração de UI
  "files": [{
    "id": "idsample1@xpto",
    "name": "Assinando conteudo attached", //Nome/Descrição do arquivo
    "description": "<h2> HTML sample <\/h2> Assinatura de conte\u00fado (CMS) .txt remoto https:\/\/gist.githubusercontent.com\/apipemc\/6047552\/raw\/5cf8793e00d569de4f1ee8c125648ee5e0b6e2de\/links.txt", //Descrição completa (que será exibida para o usuário) na hora da assinatura
    "src": "https:\/\/gist.githubusercontent.com\/apipemc\/6047552\/raw\/5cf8793e00d569de4f1ee8c125648ee5e0b6e2de\/links.txt", //Link do conteúdo que será assinado
    "signatureSetting": { //Configurações da assinatura
      "type": "hash", //Tipo hash/CMS (assina utilizando o hash do arquivo)
      "detached": false //Quando detached: o conteúdo assinado precisa ser mantido/armazenado para utilização da assinatura; quando attached: o conteúdo/arquivo fica embutido na assinatura bastando o arquivo de assinatura para validação e geração(extração) do arquivo original
    }
  }]
}
```

### Assinatura CAdES AD\_RB - ICP Brasil

```json
{
  "callbackUrl": "...", //URL de callback (página que será retornado ao assinar)
  "webhookUrl": "...", //URL de webhook (opcional)
  "security": {...}, //Array da configuração de segurança (na UI)
  "ui": {...}, //Configuração de UI
  "files": [{
    "id": "idsample3@xpto",
    "name": "Assinando conteudo attached", //Nome/Descrição do arquivo
    "description": "<h2> HTML sample <\/h2> Assinatura de conte\u00fado (CMS/CADES) .txt remoto https:\/\/gist.githubusercontent.com\/apipemc\/6047552\/raw\/5cf8793e00d569de4f1ee8c125648ee5e0b6e2de\/links.txt", //Descrição completa (que será exibida para o usuário) na hora da assinatura
    "src": "https:\/\/gist.githubusercontent.com\/apipemc\/6047552\/raw\/5cf8793e00d569de4f1ee8c125648ee5e0b6e2de\/links.txt", //Link do conteúdo que será assinado
    "signatureSetting": { //Configurações da assinatura
      "type": "hash", //Tipo hash/CMS (assina utilizando o hash do arquivo)
      "policy": "CAdES-AD_RB", //Indica que será utilizado a politica CAdES 
      "detached": false //Quando detached: o conteúdo assinado precisa ser mantido/armazenado para utilização da assinatura; quando attached: o conteúdo/arquivo fica embutido na assinatura bastando o arquivo de assinatura para validação e geração(extração) do arquivo original
    }
  }]
}
```

### Assinatura CAdES AD\_RT - ICP Brasil

```json
{
  "callbackUrl": "...", //URL de callback (página que será retornado ao assinar)
  "webhookUrl": "...", //URL de webhook (opcional)
  "security": {...}, //Array da configuração de segurança (na UI)
  "ui": {...}, //Configuração de UI
  "files": [{
    "id": "idsample1@xpto",
    "name": "Assinando conteudo attached", //Nome/Descrição do arquivo
    "description": "<h2> HTML sample <\/h2> Assinatura de conte\u00fado (CMS/CADES) .txt remoto https:\/\/gist.githubusercontent.com\/apipemc\/6047552\/raw\/5cf8793e00d569de4f1ee8c125648ee5e0b6e2de\/links.txt", //Descrição completa (que será exibida para o usuário) na hora da assinatura
    "src": "https:\/\/gist.githubusercontent.com\/apipemc\/6047552\/raw\/5cf8793e00d569de4f1ee8c125648ee5e0b6e2de\/links.txt", //Link do conteúdo que será assinado
    "signatureSetting": { //Configurações da assinatura
      "type": "hash", //Tipo hash/CMS (assina utilizando o hash do arquivo)
      "policy": "CAdES-AD_RT", //Indica que será utilizado a politica CAdES com uso do carimbo do tempo
      "detached": false //Quando detached: o conteúdo assinado precisa ser mantido/armazenado para utilização da assinatura; quando attached: o conteúdo/arquivo fica embutido na assinatura bastando o arquivo de assinatura para validação e geração(extração) do arquivo original
    }
  }]
}
```

### Assinatura PDFSignature - Internacional

```json
{
  "callbackUrl": "...", //URL de callback (página que será retornado ao assinar)
  "webhookUrl": "...", //URL de webhook (opcional)
  "security": {...}, //Array da configuração de segurança (na UI)
  "ui": {...}, //Configuração de UI
  "files": [{
    "id": "idsample7@xpto",
    "name": "Assinando PDFSignature", //Nome/Descrição do arquivo
    "description": "<h2>HTML que pode aparecer no lugar do arquivo, aceita bootstrap</h2>", //Caso seja uma assinatura de PDF, só exibe se o "preferPreview" for preenchido com "description"
    "src": "https:\/\/api-sandbox-assinatura.gestao.plus\/resolve?download-without-cors=https:\/\/api-sandbox-assinatura.gestao.plus\/gocrypto.pdf", //Link do PDF que será assinado
    "signatureSetting": { //Configurações da assinatura
      "type": "DOC-pdf", //Tipo doc-PDF 
      "visibleSignImg": "https:\/\/api-sandbox-assinatura.gestao.plus\/fixed-signature.png", //Link da imagem de assinatura visivel (opcional, veja todas as outras opções de layout)
      "visibleSignPage": 1, //Página que o field será colocado (quando houver assinatura visivel) 
      "visibleSignX": 390, //Posição do eixo X do field (quando houver assinatura visivel) 
      "visibleSignY": 10, //Posição do eixo Y do field (quando houver assinatura visivel) 
      "visibleSignWidth": 200, //Largura do field (quando houver assinatura visivel)
      "visibleSignHeight": 28 //Altura do field (quando houver assinatura visivel) 
    }
  }]
}
```

### Assinatura PAdES AD\_RB - ICP Brasil

```json
{
  "callbackUrl": "...", //URL de callback (página que será retornado ao assinar)
  "webhookUrl": "...", //URL de webhook (opcional)
  "security": {...}, //Array da configuração de segurança (na UI)
  "ui": {...}, //Configuração de UI
  "files": [{
    "id": "idsample7@xpto",
    "name": "Assinando PDFSignature", //Nome/Descrição do arquivo
    "src": "https:\/\/api-sandbox-assinatura.gestao.plus\/resolve?download-without-cors=https:\/\/api-sandbox-assinatura.gestao.plus\/gocrypto.pdf", //Link do PDF que será assinado
    "signatureSetting": { //Configurações da assinatura
      "type": "DOC-pdf", //Tipo doc-PDF 
      "policy": "PAdES-AD_RB" //Indica a Policita PaDES - AD_RB
    }
  }]
}
```

### Assinatura PAdES AD\_RT - ICP Brasil

```json
{
  "callbackUrl": "...", //URL de callback (página que será retornado ao assinar)
  "webhookUrl": "...", //URL de webhook (opcional)
  "security": {...}, //Array da configuração de segurança (na UI)
  "ui": {...}, //Configuração de UI
  "files": [{
    "id": "idsample7@xpto",
    "name": "Assinando PDFSignature", //Nome/Descrição do arquivo
    "src": "https:\/\/api-sandbox-assinatura.gestao.plus\/resolve?download-without-cors=https:\/\/api-sandbox-assinatura.gestao.plus\/gocrypto.pdf", //Link do PDF que será assinado
    "signatureSetting": { //Configurações da assinatura
      "type": "DOC-pdf", //Tipo doc-PDF 
      "policy": "PAdES-AD_RT" //Indica a Policita PaDES - AD_RT
    }
  }]
}
```

{% hint style="warning" %}
A aplicação GOCrypto abstrai o uso da carimbadora do tempo e inclusão do carimbo nas assinaturas;  Bastando incluir a politica no payload

Para uso da política (P/C)AdES\_RT é necessário incluir esse produto em contrato para bilhetagem (cobrança)
{% endhint %}

## Assinatura PDF com elementos gráficos

### Configuração de layout de assinatura visível (PDF)

#### Opção 1 (Default) - Geração de uma imagem/layout automático

A aplicação GOCrypto gera uma imagem para ser plotada no local de assinatura indicado, a imagem é gerado com base em um layout padrão e com os dados do certificado que está sendo utilizado para realizar a assinatura. &#x20;

Nessa modalidade é possível enviar parâmetros opcionais no array "signatureSetting" para realizar customização na imagem que será gerada&#x20;

<table><thead><tr><th width="322">Parâmetro</th><th>Descrição</th></tr></thead><tbody><tr><td>visibleSignatureGeneratorName</td><td>(opcional) Nome de quem está assinando (se não enviado, obtém do certificado)</td></tr><tr><td>visibleSignatureGeneratorDocument</td><td>(opcional) Documento de quem está assinando (Sufixo adicionado após o nome)</td></tr><tr><td>visibleSignatureGeneratorFooter</td><td>(opcional) Texto do rodapé da imagem</td></tr><tr><td>visibleSignatureGeneratorHeader</td><td>(opcional) Texto do cabeçalho da imagem</td></tr><tr><td>visibleSignatureGeneratorMarkerSrc</td><td>(opcional) Link de uma imagem de marcador (canto superior esquerdo)</td></tr><tr><td>visibleSignatureGeneratorBackgroundSrc</td><td>(opcional) Link de uma imagem que será utilizada como fundo (background)</td></tr><tr><td>visibleSignatureDateFormat</td><td>(opcional) Formato de data em texto<br><br>Ex1: d/m/Y\nH:i:s|TZ|America/Sao_Paulo<br><br>Ex2: d-m-Y H:i|TZ|America/Sao_Paulo</td></tr></tbody></table>

#### Opção 2 - Envio de uma imagem pronta para ser plotada

Nessa modalidade a aplicação cliente pode utilizar uma imagem fixa para todas as assinaturas, ou ficar responsável para gerar uma imagem PNG a cada assinatura, já enviando um link dessa imagem gerada.&#x20;

<table><thead><tr><th width="324">Parâmetro</th><th>Descrição</th></tr></thead><tbody><tr><td>visibleSignImg</td><td>Link de uma imagem (em PNG)</td></tr></tbody></table>

#### Opção 3 - Envio de um layout em HTML para geração de uma imagem customizada

Nessa modalidade a aplicação cliente tem total autonomia para fazer alterações de layout gerando um HTML único para todas assinaturas, trocando somente informações que são dinâmicas como (Data/hora, assinante etc) via parâmetro no layout.&#x20;

Também é possível a aplicação cliente gerar um layout diferente a cada assinante, podendo ou não usar os parâmetros disponíveis.

<table><thead><tr><th width="331">Parâmetro</th><th>Descrição</th></tr></thead><tbody><tr><td>visibleSignatureCustomTemplateSrc</td><td><p>Link do HTML que será utilizado para gerar a imagem.</p><p></p><p>As palavras chaves: <br>$P{name} - Será substituída pelo nome do assinante<br>$P{document} - Será substituída pelo documento do assinante (CPF/CNPJ)<br>$P{dateTime} - Será substituída pela data/hora do momento exato da assinatura<br><br>Ex: <a href="https://cdn.gestao.plus/gocrypto.com.br/assets/tests/template.html">https://cdn.gestao.plus/gocrypto.com.br/assets/tests/template.html</a></p></td></tr><tr><td>visibleSignatureDateFormat</td><td>(opcional) Formato de data em texto<br><br>Ex1: d/m/Y\nH:i:s|TZ|America/Sao_Paulo<br><br>Ex2: d-m-Y H:i|TZ|America/Sao_Paulo</td></tr></tbody></table>

## Configurações de usabilidade durante a assinatura

### Configuração de UI (User interface)

```json
{
    "callbackUrl": "...", //URL de callback (página que será retornado ao assinar)
    "webhookUrl": "...", //URL de webhook (opcional)
    "security": {...}, //Array da configuração de segurança (na UI)
    "ui": {
      "username": "04660457192", //CPF/CNPJ que será preenchido no username (para provedores de certificado em nuvem/PSC) 
      "scope": "signature_session", //Tipo de escopo do usuário (single_signature, multi_signature ou signature_session) 
      "lifetime": 86400, //Tempo de vida (caso use o scope: signature_session)
      "button": "Prosseguir", //Nomenclatura que será exibida no botão de "Assinar"
      "bg": "#f9f9f9", //Utiliza cor em hexadecimal (opcional)
      "color": "#f9f9f9", //Utiliza cor em hexadecimal (opcional)
      "callback": "https:\/\/gestao-online.com", //Cria o botão "Voltar" apontando para o link (para o caso de desistência da assinatura)
      "preferPreview": "file", //Default é "file" opcional enviar valor "description"
    },
    "files": [...] //Array de arquivos que serão assinados
  }
```

### Configuração de segurança de UI (User interface)

```json
{
    "callbackUrl": "...", //URL de callback (página que será retornado ao assinar)
    "webhookUrl": "...", //URL de webhook (opcional)
    "security": {
      "allowAddNewDocument": false, //Flag de adição de PDFs por parte do usuário (default: false)
      "allowChangeUsername": false, //Flag de trava do input de username (para provedores de certificado em nuvem/PSC) valor padrão (default: true)
      "allowDocumentType": false, //Flag de troca do tipo de assinatura (default: false)
      "payloadCallbackUrl": false, //Flag de permitir ou não o retorno dos links temporários do arquivo assinado na URL de callback (default: true), esse parâmetro deve ser sinalizado como falso quando se utiliza os Webhooks
      "allowEditScope": false, //Flag para permitir o usuário alterar o escopo
      "allowEditLifetime": false //Flag para permitir o usuário alterar o TTL (tempo de vida) da sessão
    },
    "ui": {..}, //Configuração de UI
    "files": [...] //Array de arquivos que serão assinados
}
```

### Configuração de certificados (Filtros de certificados)

O array de filtros, recebe N objetos de filtro. Cada objeto (filtro) é tratado as suas condições internas como uma condição (AND).  E cada objeto (filtro) são tratados entre si com a condição (OR).

Exemplo 1:  (Filtro 1) OR (Filtro 2) OR (Filtro 3). Se o certificado atender uma das condições de filtro, ele será listado.

Exemplo 2: Filtro 1 = { (Condição A) AND (Condição B) AND (Condição N) }.  O certificado deve atender todas as condições do filtro para que o filtro seja válido.

```json
{
  "callbackUrl": "...", //URL de callback (página que será retornado ao assinar)
  "webhookUrl": "...", //URL de webhook (opcional)
  "security": {...}, //Array da configuração de segurança (na UI)
  "ui": {..}, //Configuração de UI
  "certificates": { //Configuração de uso de certificados
    "filters": [ //Array de filtros (Filtro 1) OR (Filtro 2) OR (Filtro 3)
        { //Certificado é válido AND cadeia icpbr AND dá o match no CPF
          "validity": "now", //Se o certificado é válido agora (ou o momento Y-m-d H:i:s)
          "issuer=>organizationName": "ICP-Brasil", //Filtro da raiz ICP BR
          "subjectAltName=>otherName=>2.16.76.1.3.1": "********04660457192**************************" CPF filtro (deixe os *)
        },
        { //Certificado é válido AND cadeia icpbr AND dá o match no e-mail AND dá o match no cnpj
          "validity": "now", //Se o certificado é válido agora 
          "issuer=>organizationName": "ICP-Brasil", //Filtro da raiz ICP BR
          "subjectAltName=>rfc822Name": "paulo@gestao-online.com", //Filtro de e-mail no certificado
          "subjectAltName=>otherName=>2.16.76.1.3.3": "22361741000130" //Filtro de CNPJ
        },
        { //Certificado é válido AND cadeia icpbr AND dá o match no cn
          "validity": "now", //Se o certificado é válido agora 
          "issuer=>organizationName": "ICP-Brasil", //Filtro da raiz ICP BR
          "cn": "PAULO FILIPE MACEDO DOS SANTOS:04660457192" //Filtro por CN
        }
    ]
  },
  "files": [...]
}
```

<table><thead><tr><th width="290">Filtro (Rule)</th><th>Descrição</th></tr></thead><tbody><tr><td>validity</td><td>"now" ou datetime do momento (Y-m-d H:i:s) </td></tr><tr><td>subjectAltName=>rfc822Name</td><td>E-mail que será filtrado</td></tr><tr><td>issuer=>organizationName</td><td>"ICP-Brasil", caso não seja enviado poderão ser listados de outras cadeias de confiança ou certificados auto-assinados</td></tr><tr><td>subjectAltName=>otherName=>2.16.76.1.3.1</td><td>Filtro pelo OID 2.16.76.1.3.1, usar * (wildcard) para qualquer valor, <br><br>Ex: Para filtro de CPF: <br><br>"*******04660457192******************"<br><br>Também pode ser realizados outros filtros pelo OID:<br>- Nas primeiras 8 (oito) posições, a data de nascimento do titular, no formato ddmmaaaa; <br>- Nas 11 (onze) posições subseqüentes, o Cadastro de Pessoa Física (CPF) do titular<br>- Nas 11 (onze) posições subseqüentes, o número de inscrição do titular no PIS/PASEP<br>- Nas 11 (onze) posições subseqüentes, o número do Registro Geral - RG do titular; nas 6 (seis) posições subseqüentes, as siglas do órgão expedidor do RG e respectiva UF.</td></tr><tr><td>subjectAltName=>otherName=>2.16.76.1.3.3</td><td>Filtro pelo OID 2.16.76.1.3.3 nesse campo está previsto o valor do CNPJ</td></tr></tbody></table>

####


# Requisição de validação

## Formatos e tipo de assinatura

### Assinatura para qualquer tipo de arquivo (Padrão CMS/CAdES)

* CMS attached - Padrão internacional, com bytes assinados embutidos
* CMS detached - Padrão internacional, com bytes (conteúdo) separado da assinatura
* CAdES-AD\_RB attached - Padrão ICP-Brasil, com bytes assinados embutidos
* CAdES-AD\_RB detached - Padrão ICP-Brasil, com bytes (conteúdo) separado da assinatura
* CAdES-AD\_RT attached - Padrão ICP-Brasil (c/ carimbo do tempo), com bytes assinados embutidos&#x20;
* CAdES-AD\_RT detached  - Padrão ICP-Brasil (c/ carimbo do tempo), com bytes (conteúdo) separado da assinatura

### Assinatura para PDF (Padrão PDFsignature ou PAdES)

* PDFSignature - Padrão internacional, podendo ser com assinatura visível ou invisível&#x20;
* PAdES-AD\_RB - Padrão ICP-Brasil, podendo ser com assinatura visível ou invisível&#x20;
* PAdES-AD\_RT -  Padrão ICP-Brasil (c/ carimbo do tempo), podendo ser com assinatura visível ou invisível&#x20;

## Utilizando a API

<mark style="color:green;">`POST`</mark> `api-sandbox-assinatura.gestao.plus/validator-signature`

Endpoint/API para validação de assinatura

#### Query Parameters

| Name          | Type    | Description                                                                                                                                                                                                  |
| ------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| certData      | Boolean | <p>Flag que determina se os dados do(s) certificado(s) serão retornados<br><br>Default: true</p>                                                                                                             |
| certChainData | Boolean | <p>Flag que determina se os dados dos certificados da cadeia de confiança também serão retornados<br><br>Default: true</p>                                                                                   |
| X509          | Boolean | <p>Flag que determina se o(s) certificado(s) utilizados na assinatura também serão retornados (x509 PEM)</p><p></p><p>Default: true</p>                                                                      |
| content       | Boolean | <p>Flag que determina se o conteúdo (bytes internos) usados durante a validação serão ou não retornados.</p><p></p><p>Útil para extração de conteúdo de assinaturas attached.</p><p></p><p>Default: true</p> |

#### Headers

| Name                                            | Type   | Description                                                                                                                                                                    |
| ----------------------------------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Authorization<mark style="color:red;">\*</mark> | String | <p>Credenciais para uso do endpoint,</p><p></p><p>Deve ter o sufixo "Basic " e o valor "appid:appsecret" (encodado em base64) </p><p></p><p>Ex: Basic YXBwaWQ6YXBwc2VjcmV0</p> |

#### Request Body

| Name                                   | Type   | Description                                                                                   |
| -------------------------------------- | ------ | --------------------------------------------------------------------------------------------- |
| file<mark style="color:red;">\*</mark> | Binary | Envia os bytes do arquivo/assinatura                                                          |
| content                                | Binary | Envia os bytes do arquivo (separado da assinatura, utilizado somente para CMS/CaDEs detached) |

{% tabs %}
{% tab title="200: OK " %}

```json
{
  "validate": {
    "flag": true,
    "messages": [],
    "name": "sample7-pdfsignature.pdf",
    "date": "2022-10-21T01:46:19+0000",
    "details": {
      "signature": true,
      "ESS": true,
      "certs": true
    }
  },
  "signatures": [
    {
      "validate": {
        "flag": true,
        "messages": [],
        "details": {
          "signature": true,
          "ESS": true,
          "certs": true
        }
      },
      "data": {
        "version": "v1",
        "digestAlgorithm": "sha256",
        "signedAttrs": {
          "contentType": true,
          "signingTime": "2022-09-06T13:10:10+0000",
          "messageDigest": true,
          "signingCertificateV2": true
        },
        "signatureAlgorithm": "rsaEncryption",
        "signatureTime": {
          "m": "2022-09-06T13:10:11+0000",
          "signedAttr": "2022-09-06T13:10:10+0000"
        }
      },
      "certs": [
        {
          "flag": true,
          "isCertSignatureValidated": true,
          "isRevoked": false,
          "isExpired": false,
          "isTrust": true,
          "chain": [
            {
              "flag": true,
              "isCertSignatureValidated": true,
              "isRevoked": false,
              "isExpired": false,
              "data": {
                "validate": {
                  "notBefore": "2017-05-05T18:06:38+0000",
                  "notAfter": "2029-02-20T18:06:38+0000"
                },
                "version": "v3",
                "dn": "C=BR, O=ICP-Brasil, OU=Secretaria da Receita Federal do Brasil - RFB, CN=AC VALID RFB v5",
                "cn": "AC VALID RFB v5",
                "basicConstraints": {
                  "cA": true
                },
                "issuerCn": "AC Secretaria da Receita Federal do Brasil v4",
                "serialNumberHex": "0f",
                "keyIdentifier": "U8ul5HVQmUAsvlsVRcm+yzCqicU=",
                "fingerprint": "7a0d7b3c91409b65727a3b9f99a1e13f2d5871bb",
                "keyUsage": [
                  "cRLSign",
                  "keyCertSign"
                ],
                "extKeyUsage": false,
                "algorithm": "sha512WithRSAEncryption",
                "policyCA": [
                  {
                    "oid": "2.16.76.1.2.1.37",
                    "dpc": "http://www.receita.fazenda.gov.br/acrfb/dpcacrfb.pdf",
                    "name": "A1"
                  },
                  {
                    "oid": "2.16.76.1.2.3.36",
                    "dpc": "http://www.receita.fazenda.gov.br/acrfb/dpcacrfb.pdf",
                    "name": "A3"
                  }
                ],
                "publicKey": {
                  "algorithm": "rsaEncryption",
                  "bits": 4096
                }
              },
              "revokeData": {
                "crl": {
                  "number": "54",
                  "last_update": "2022-09-22T19:18:01+0000",
                  "next_update": "2022-12-21T19:18:01+0000",
                  "origin": "cache",
                  "checksum": "fc4d065b9e7f7654c4872af335479d6f0b4e02ddc58c5068a50d89d9c0f2d41f"
                }
              }
            },
            {
              "flag": true,
              "isCertSignatureValidated": true,
              "isRevoked": false,
              "isExpired": false,
              "data": {
                "validate": {
                  "notBefore": "2016-07-20T13:32:04+0000",
                  "notAfter": "2029-03-02T12:00:04+0000"
                },
                "version": "v3",
                "dn": "C=BR, O=ICP-Brasil, OU=Autoridade Certificadora Raiz Brasileira v5, CN=AC Secretaria da Receita Federal do Brasil v4",
                "cn": "AC Secretaria da Receita Federal do Brasil v4",
                "basicConstraints": {
                  "cA": true
                },
                "issuerCn": "Autoridade Certificadora Raiz Brasileira v5",
                "serialNumberHex": "04",
                "keyIdentifier": "GpjmQ8oc3ZKemWNFWirpH4cgzTU=",
                "fingerprint": "0851732f169d384be40713a3f7e1c82ee11d1b16",
                "keyUsage": [
                  "cRLSign",
                  "keyCertSign"
                ],
                "extKeyUsage": false,
                "algorithm": "sha512WithRSAEncryption",
                "policyCA": [
                  {
                    "oid": "2.16.76.1.1.8",
                    "dpc": "",
                    "name": null
                  }
                ],
                "publicKey": {
                  "algorithm": "rsaEncryption",
                  "bits": 4096
                }
              },
              "revokeData": {
                "crl": {
                  "number": "31",
                  "last_update": "2022-10-20T18:22:37+0000",
                  "next_update": "2023-01-18T18:22:37+0000",
                  "origin": "cache",
                  "checksum": "941a3147cf8590e75f6cc438b174bb38710c50a5aaff16117b1994958e18e165"
                }
              }
            },
            {
              "flag": true,
              "isCertSignatureValidated": true,
              "isRevoked": false,
              "isExpired": false,
              "data": {
                "validate": {
                  "notBefore": "2016-03-02T13:01:38+0000",
                  "notAfter": "2029-03-02T23:59:38+0000"
                },
                "version": "v3",
                "dn": "C=BR, O=ICP-Brasil, OU=Instituto Nacional de Tecnologia da Informacao - ITI, CN=Autoridade Certificadora Raiz Brasileira v5",
                "cn": "Autoridade Certificadora Raiz Brasileira v5",
                "basicConstraints": {
                  "cA": true
                },
                "issuerCn": "Autoridade Certificadora Raiz Brasileira v5",
                "serialNumberHex": "01",
                "keyIdentifier": "aai+ddnE72znE0XkYW7laPi2QF4=",
                "fingerprint": "5a2097dddf398577108af75c25ddaef2b8555b5a",
                "keyUsage": [
                  "cRLSign",
                  "keyCertSign"
                ],
                "extKeyUsage": false,
                "algorithm": "sha512WithRSAEncryption",
                "policyCA": [
                  {
                    "oid": "2.16.76.1.1.0",
                    "dpc": "http://acraiz.icpbrasil.gov.br/DPCacraiz.pdf",
                    "name": null
                  }
                ],
                "publicKey": {
                  "algorithm": "rsaEncryption",
                  "bits": 4096
                }
              },
              "revokeData": {
                "crl": {
                  "number": "31",
                  "last_update": "2022-10-20T18:22:37+0000",
                  "next_update": "2023-01-18T18:22:37+0000",
                  "origin": "cache",
                  "checksum": "941a3147cf8590e75f6cc438b174bb38710c50a5aaff16117b1994958e18e165"
                }
              }
            }
          ],
          "data": {
            "validate": {
              "notBefore": "2022-07-27T18:16:31+0000",
              "notAfter": "2027-07-26T18:16:31+0000"
            },
            "version": "v3",
            "dn": "C=BR, O=ICP-Brasil, OU=Secretaria da Receita Federal do Brasil - RFB, OU=RFB e-CPF A3, OU=VALID, OU=AR ATOS CERTIFICADORA, OU=Videoconferencia, OU=24226997000160, CN=PAULO FILIPE MACEDO DOS SANTOS:04660457192",
            "cn": "PAULO FILIPE MACEDO DOS SANTOS:04660457192",
            "basicConstraints": {
              "cA": false
            },
            "issuerCn": "AC VALID RFB v5",
            "serialNumberHex": "4e474011cd4443c7",
            "keyIdentifier": false,
            "fingerprint": "713c87fd594d4abc2a0c659885a4a1e2db7f83d1",
            "keyUsage": [
              "keyEncipherment",
              "nonRepudiation",
              "digitalSignature"
            ],
            "extKeyUsage": [
              "id-kp-clientAuth",
              "id-kp-emailProtection"
            ],
            "algorithm": "sha256WithRSAEncryption",
            "policy": {
              "oid": "2.16.76.1.2.3.36",
              "dpc": "http://icp-brasil.validcertificadora.com.br/ac-validrfb/dpc-ac-validrfbv5.pdf",
              "name": "A3",
              "type": "PF"
            },
            "subject": {
              "email": "paulo@gestao-online.com",
              "cei": "000000000000",
              "tituloEleitor": {
                "numero": "000000000000",
                "zona": "000",
                "secao": "0000",
                "municipio": ""
              }
            },
            "responsible": {
              "dataNascimento": "1990-02-10",
              "cpf": "04660457192",
              "nis": "00000000000",
              "rg": {
                "numero": "000000000000000",
                "emissor": ""
              }
            },
            "publicKey": {
              "algorithm": "rsaEncryption",
              "bits": 2048
            }
          },
          "revokeData": {
            "crl": {
              "number": "91070",
              "last_update": "2022-10-21T01:24:12+0000",
              "next_update": "2022-10-21T02:24:12+0000",
              "origin": "download",
              "checksum": "5bc62b05d079e862be2e0470e7285cba1b3abe8b11290754dece018eeb3f05a9"
            }
          }
        }
      ],
      "pdf": {
        "visibleSignature": {
          "name": "Signature1",
          "width": 0,
          "height": 0,
          "page": 1,
          "pageHeight": 842,
          "pageWidth": 596,
          "pageRotation": 0,
          "x": 0,
          "y": 842,
          "position": "Signature1::1::0.0::842.0::0.0::0.0",
          "filter": "/Adobe.PPKLite",
          "subfilter": "/adbe.pkcs7.detached",
          "signatureType": "approval",
          "isFillInAllowed": true,
          "isAnnotationsAllowed": true,
          "m": "D:20220906131011Z",
          "revision": 1
        }
      }
    }
  ]
}
```

{% endtab %}

{% tab title="401: Unauthorized " %}

```javascript
{
    // Response
}
```

{% endtab %}
{% endtabs %}

### Estrutura da resposta

#### Estrutura macro

```json
{
  "validate": { //Objeto com o status geral da validação do documento
    "flag": true, //Flag macro se o documento é válido
    "messages": [], //Array de mensagens sobre a validação do arquivo
    "name": "sample7-pdfsignature.pdf", //Nome do arquivo
    "date": "2022-10-21T01:50:30+0000", //Data hora do relátorio (validação)
    "details": {
      "signature": true, //Flag do status da asssinatura de todas as assinaturas
      "ESS": true, //Flag do status da asssinatura (ESS) de todas as assinaturas
      "certs": true //Flag da verificação dos certificados de todas as assinaturas
    }
  },
  "signatures": [...] //Array de assinaturas
}
```

#### Detalhando o array "signatures"

```json
[
    {
        //... Um documento pode retornar mais de uma assinatura
    },
    {
      "validate": { //Objeto com o status geral da validação da assinatura
        "flag": true, //Flag macro se o documento é válido
        "messages": [], //Array de mensagens sobre a validação da assinatura
        "details": { //Flags de certificado e assinatura; Objetivo principal, detectar se o certificado indicado foi o utilizado para realizar a assinatura, e que assinatura está integra (não foi adulterada)
          "signature": true, //Flag do status da validação da assinatura 
          "ESS": true, //Flag do status da validação da assinatura (ESS)
          "certs": true ////Flag da verificação dos certificados da assinatura
        }
      },
      "data": { //Array de objetos com informações sobre a assinatura
        "version": "v1", //Versão da assinatura
        "digestAlgorithm": "sha256", //Algoritmo de hash utilizado para digerir o conteúdo assinado
        "signedAttrs": { //Array de attributos assináveis
          "contentType": true,
          "signingTime": "2022-09-06T13:10:10+0000", //Attributo utilizado em assinaturas CMS/CADES e PDFSignature (internacional)
          "messageDigest": true, 
          "signingCertificateV2": true
        },
        "signatureAlgorithm": "rsaEncryption",
        "signatureTime": {
          "m": "2022-09-06T13:10:11+0000", //Referência temporal (Extraida do PDF)
          "signedAttr": "2022-09-06T13:10:10+0000" //Referência temporal (Extraida do attributo assinável)
        }
      },
      "certs": [...], //Array de certificados utilizados na assinatura
      "pdf": { //Objeto detalhando os elementos incluídos no PDF (Somente PDFSignature e PaDES)
        "visibleSignature": {
          "name": "Signature1", //Nome do field no AcroForm
          "width": 0, //Largura do field (quando houver assinatura visivel) 
          "height": 0, //Altura do field (quando houver assinatura visivel) 
          "page": 1, //Página que o field será colocado (quando houver assinatura visivel) 
          "pageHeight": 842, //Altura da página
          "pageWidth": 596, //Largura da página
          "pageRotation": 0, //Rotação da página (Paisagem/Retrato)
          "x": 0, //Posição do eixo X do field (quando houver assinatura visivel) 
          "y": 842, //Posição do eixo Y do field (quando houver assinatura visivel) 
          "position": "Signature1::1::0.0::842.0::0.0::0.0",
          "filter": "/Adobe.PPKLite", //Tipo de filter utilizado para a assinatura
          "subfilter": "/adbe.pkcs7.detached", //Tipo de subfilter utilizado para a assinatura
          "signatureType": "approval", //Tipo de assinatura utilizado no PDF
          "isFillInAllowed": true,
          "isAnnotationsAllowed": true,
          "m": "D:20220906131011Z", //Attributo M (momento da assinatura)
          "revision": 1 //Versão/Revisão (controle de versionamento do PDF)
        }
      }
    }
]
```

#### Detalhando o array "certs" dentro de um assinatura do array "signatures"

```json
[
    {
        //... Uma assinatura pode conter mais de um certs (Co-assinatura)
    },
    {
          "flag": true, //Flag macro se o certificado é válido
          "isCertSignatureValidated": true, //Flag se a assinatura (caminho) do certificado é válido
          "isRevoked": false, //Flag se o certificado é revogado
          "isExpired": false, //Flag se o certificado é expirado
          "isTrust": true, //Flag se o certificado é confiável (está na cadeia de confiança)
          "chain": [...], //Array detalhando certificados da cadeia de confiança, possui um a estrutura de dados semlhante a essa que está sendo descrita aqui... (Certificados da AC's)
          "data": { //Dados do certificado
            "validate": { //Parâmetros de período de validação
              "notBefore": "2022-07-27T18:16:31+0000", //Não válido antes de:
              "notAfter": "2027-07-26T18:16:31+0000" //Não válido depois de:
            },
            "version": "v3", //Versão do certificado
            "dn": "C=BR, O=ICP-Brasil, OU=Secretaria da Receita Federal do Brasil - RFB, OU=RFB e-CPF A3, OU=VALID, OU=AR ATOS CERTIFICADORA, OU=Videoconferencia, OU=24226997000160, CN=PAULO FILIPE MACEDO DOS SANTOS:04660457192", //DN do certificado
            "cn": "PAULO FILIPE MACEDO DOS SANTOS:04660457192", //CN do certificado
            "basicConstraints": {
              "cA": false //Constraints básicas, Flag de CA (certificado pode ou não ser utilizado para assinar outro certificado)
            },
            "issuerCn": "AC VALID RFB v5", //CN do emissor (um nível acima)
            "serialNumberHex": "4e474011cd4443c7", //Número serial encodado em hexadecimal
            "keyIdentifier": false,
            "fingerprint": "713c87fd594d4abc2a0c659885a4a1e2db7f83d1", //Assinatura única do certificado
            "keyUsage": [ //Tipo/Propósito de uso previsto para o certificado
              "keyEncipherment",
              "nonRepudiation",
              "digitalSignature"
            ],
            "extKeyUsage": [ //Tipo/Propósito de uso previsto para o certificado
              "id-kp-clientAuth",
              "id-kp-emailProtection"
            ],
            "algorithm": "sha256WithRSAEncryption", //Algoritmo de assinatura do certificado
            "policy": { //Politica de emissão da AC (Autoridade Certificadora)
              "oid": "2.16.76.1.2.3.36", //Número do (Object Identifier) da politica
              "dpc": "http://icp-brasil.validcertificadora.com.br/ac-validrfb/dpc-ac-validrfbv5.pdf", //Link da DPC da AC
              "name": "A3", //Nome da politica
              "type": "PF" //Tipo da politica
            },
            "subject": { //Dados do titular do certificado
              "email": "paulo@gestao-online.com",
              "cei": "000000000000",
              "tituloEleitor": {
                "numero": "000000000000",
                "zona": "000",
                "secao": "0000",
                "municipio": ""
              }
            },
            "responsible": { //Dados do responsável do certificado
              "dataNascimento": "1990-02-10",
              "cpf": "04660457192",
              "nis": "00000000000",
              "rg": {
                "numero": "000000000000000",
                "emissor": ""
              }
            },
            "publicKey": { //Dados da chave pública
              "algorithm": "rsaEncryption",
              "bits": 2048 //Tamanho da chave (Ex: 2048, 4096)
            }
          },
          "revokeData": { //Dados utilizados para validação do status de revogação do certificado
            "crl": { //Utilizado o metódo de verificação de LCR (Lista de certificados revogados)
              "number": "91070", //Número da LCR
              "last_update": "2022-10-21T01:24:12+0000", //Quando foi gerada/atualizada a LCR
              "next_update": "2022-10-21T02:24:12+0000", //Até quando pode ser utilizada a LCR (expiração)
              "origin": "cache", //Origem da LCR no momento da validação (Cache interno ou download no repositório da AC)
              "checksum": "5bc62b05d079e862be2e0470e7285cba1b3abe8b11290754dece018eeb3f05a9" //Hash da LCR (checksum)
            }
          }
        }
    }
]
```

{% hint style="success" %}
Visando a melhor perfomance da solução a aplicação GOCrypto realiza cache das ACs intermediárias (AC2 e AC1) e das LCRs respeitando o tempo de expiração.
{% endhint %}

{% hint style="info" %}
Caso ainda não tenha as credenciais da API e/ou queira realizar um teste de validação via interface gráfica que utiliza essa mesma API, acesse: <https://api-sandbox-assinatura.gestao.plus/sample-validator.php>
{% endhint %}

## Arquivos de exemplo (Massa de testes)

<table><thead><tr><th width="249">Tipo</th><th width="94">Status</th><th>Formato</th><th>Link</th></tr></thead><tbody><tr><td>.txt (Conteúdo detached usado nos testes)</td><td></td><td>Bytes assinados</td><td><a href="https://api-sandbox-assinatura.gestao.plus/tests/signatures/detached-content.txt">detached-content.txt</a></td></tr><tr><td>.p7s (assinatura incluindo conteúdo)</td><td><mark style="color:green;">Válido</mark></td><td>CMS Padrão Internacional</td><td><a href="https://api-sandbox-assinatura.gestao.plus/tests/signatures/sample1-cms-attached.p7s">sample1-cms-attached.p7s</a></td></tr><tr><td>.p7s (assinatura com conteúdo separado)</td><td><mark style="color:green;">Válido</mark></td><td>CMS Padrão Internacional</td><td><a href="https://api-sandbox-assinatura.gestao.plus/tests/signatures/sample2-cms-detached.p7s">sample2-cms-detached.p7s</a></td></tr><tr><td>.p7s (assinatura incluindo conteúdo)</td><td><mark style="color:green;">Válido</mark></td><td>CaDEs AD_RB - Padrão ICP Brasil</td><td><a href="https://api-sandbox-assinatura.gestao.plus/tests/signatures/sample3-cades-adrb-attached.p7s">sample3-cades-adrb-attached.p7s</a></td></tr><tr><td>.p7s (assinatura com conteúdo separado)</td><td><mark style="color:green;">Válido</mark></td><td>CaDEs AD_RB - Padrão ICP Brasil</td><td><a href="https://api-sandbox-assinatura.gestao.plus/tests/signatures/sample4-cades-adrb-detached.p7s">sample4-cades-adrb-detached.p7s</a></td></tr><tr><td>.p7s (assinatura incluindo conteúdo e assinatura de carimbo do tempo)</td><td><mark style="color:green;">Válido</mark></td><td>CaDEs AD_RT - Padrão ICP Brasil (Referência temporal de carimbadora)</td><td><a href="https://api-sandbox-assinatura.gestao.plus/tests/signatures/sample5-cades-adrt-attached.p7s">sample5-cades-adrt-attached.p7s</a></td></tr><tr><td>.pdf (arquivo de PDF e assinatura, invisível/sem elementos gráficos) </td><td><mark style="color:green;">Válido</mark></td><td>PDFSignature Padrão Internacional</td><td><a href="https://api-sandbox-assinatura.gestao.plus/tests/signatures/sample7-pdfsignature.pdf">sample7-pdfsignature.pdf</a></td></tr><tr><td>.pdf (arquivo de PDF e assinatura, invisível/sem elementos gráficos) </td><td><mark style="color:green;">Válido</mark></td><td>PaDES AD_RB - Padrão ICP Brasil</td><td><a href="https://api-sandbox-assinatura.gestao.plus/tests/signatures/sample8-pades-adrb.pdf">sample8-pades-adrb.pdf</a></td></tr><tr><td>.pdf (arquivo de PDF e assinatura, invisível/sem elementos gráficos) </td><td><mark style="color:green;">Válido</mark></td><td>PaDES AD_RT - Padrão ICP Brasil (Referência temporal de carimbadora)</td><td><a href="https://api-sandbox-assinatura.gestao.plus/tests/signatures/sample9-pades-adrt.pdf">sample9-pades-adrt.pdf</a></td></tr><tr><td>.pdf (arquivo de PDF e assinatura, invisível/sem elementos gráficos) </td><td><mark style="color:red;">Inválido</mark></td><td>PDFSignature Padrão Internacional (certificado revogado antes da assinatura)</td><td><a href="https://api-sandbox-assinatura.gestao.plus/tests/signatures/sample10-pdfsignature-revoked.pdf">sample10-pdfsignature-revoked.pdf</a></td></tr><tr><td>.pdf (arquivo de PDF e assinatura, invisível/sem elementos gráficos) </td><td><mark style="color:red;">Inválido</mark></td><td>PDFSignature Padrão Internacional (certificado não confiável, caminho para a AC raiz é inválido)</td><td><a href="https://api-sandbox-assinatura.gestao.plus/tests/signatures/sample11-pdfsignature-invalid-ca.pdf">sample11-pdfsignature-invalid-ca.pdf</a></td></tr><tr><td>.pdf (arquivo de PDF e assinatura, invisível/sem elementos gráficos) </td><td><mark style="color:red;">Inválido</mark></td><td>PDFSignature Padrão Internacional (certificado vencido/expirado antes da assinatura)</td><td><a href="https://api-sandbox-assinatura.gestao.plus/tests/signatures/sample12-pdfsignature-expired-before-sign.pdf">sample12-pdfsignature-expired-before-sign.pdf</a></td></tr><tr><td>.pdf (arquivo de PDF e assinatura, invisível/sem elementos gráficos) </td><td><mark style="color:green;">Válido</mark></td><td>PDFSignature Padrão Internacional (certificado vencido/expirado após a assinatura) - O certificado estava válido no momento da assinatura</td><td><a href="https://api-sandbox-assinatura.gestao.plus/tests/signatures/sample13-pdfsignature-expired-after-sign.pdf">sample13-pdfsignature-expired-after-sign.pdf</a></td></tr></tbody></table>

## Utilizando a interface gráfica (demo)

{% embed url="<https://api-sandbox-assinatura.gestao.plus/sample-validator.php>" %}


# Carimbo do tempo

## O que é?&#x20;

O Carimbo do Tempo é uma marca temporal emitida por uma entidade de confiança, a Autoridade de Carimbo do Tempo, que certifica que um documento ou transação eletrônica já existia no instante em que o selo foi aplicado. Esse recurso, ao ser adicionado a um documento digitalmente assinado, elimina o risco de erros ou fraudes devido a discrepâncias nos horários de sistemas.

Quando aplicado a uma assinatura digital ou a um documento, o carimbo do tempo comprova que ambos existiam exatamente naquela data e hora, assegurando que o certificado utilizado estava válido no momento da assinatura. Isso é essencial, pois os relógios eletrônicos dos computadores, responsáveis por registrar a data e hora, são facilmente ajustáveis, podendo invalidar o processo de certificação.

Sincronizado com a hora oficial, o carimbo utiliza criptografia para estabelecer um registro temporal fixo e inalterável, o que reforça a segurança do documento ou transação, agora autenticados por uma fonte confiável e auditável, conforme as normas brasileiras e internacionais. Além disso, o carimbo do tempo elimina as diferenças entre relógios, que poderiam gerar enganos, aumentando a segurança da certificação digital.

O carimbo do tempo também auxilia na verificação da validade de uma assinatura digital, mesmo que o certificado associado tenha expirado ou sido revogado, proporcionando recursos técnicos e legais para demonstrar que o documento foi assinado antes de qualquer expiração ou revogação do certificado.

## Conhecendo a nossa solução

O servidor TSA da Gosigner atua como um hub integrado com os principais fornecedores de autoridade de carimbo do tempo (nacionais e internacionais), facilitando o uso técnico e comercial para os clientes finais.

O TSA Cluster da Gosigner realiza automaticamente o balanceamento entre provedores, considerando três fatores essenciais: disponibilidade, tempo de resposta e custo. Dessa forma, os clientes obtêm um serviço otimizado e eficiente.

Além do balanceamento, o sistema possui um modo de "Failover" automático que, em caso de falha em alguma autoridade de carimbo do tempo, mantém o funcionamento contínuo e transparente para o cliente. Esse modo é ativado quando o servidor TSA não responde, responde de forma incorreta ou ultrapassa um tempo limite (ex.: 5 segundos), garantindo alta resiliência e disponibilidade.

Esses recursos asseguram o melhor custo-benefício e o mais alto SLA possível.

## Portal/Dashboard e Gestão

Ao utilizar a nossa solução, um acesso ao nosso portal será disponibilizado, permitindo o gerenciamento completo da solução.

Dentro da gama de possibilidades, destaca-se:&#x20;

* Dashboards diversos, Ex: Tempo médio de assinatura, quantidade de assinaturas, percentual de uso por usuário/aplicação;
* Gerenciamento de acessos (usuários vinculados ao contrato/domínio)
* Painel de status/Healthcheck&#x20;
* Registros de ativação de FailOver por provedor

## Cenários de uso e tipo de autenticação

### 1- Cenário: Usuário utilizando API pública autenticando com "usuário" + "senha"

Usuário utilizando API pública autenticando com "usuário" + "senha", permite configuraçāo seguindo os protocolos internacionais de TSQ (RFC 3161) que é compatível com aplicações finais de usuário que suportam carimbadora do tempo, exemplo: Ao assinar um PDF no Adobe Reader.

{% hint style="info" %}
Veja um exemplo [como configurar o Adobe Reader](/carimbo-do-tempo/configuracao-no-adobe-reader) para realizar assinaturas
{% endhint %}

### 2- Cenário: Servidor/Motor de assinaturas (Interno ou externo)

Consome diretamente o carimbo do tempo via API ou protocolos TSQ/TSR Time Stamp Query., podendo ter uma segregação de acessos por área/instância de consumo. (Ex: rateio por área da empresa, por exemplo)

{% hint style="info" %}
Nessa modalidade, será necessário configurar dentro do motor de assinaturas, não necessariamente haverá necessidade de adaptação (desenvolvimento)  \
\
URL do servidor de produção: <https://api.gosigner.com.br/tsr>

URL do servidor de homologação: <https://api-stage.gosigner.com.br/tsr\\>
\
Porta: 443\
Nome de usuário: username\@empresa (obter com o gestor comercial)\
Senha: Token de acesso (obter com o gestor comercial)
{% endhint %}

## Principais usos para o carimbo do tempo

### 1- Utilização direta para assinatura/carimbo em um PDF

Nessa modalidade, o carimbo do tempo é aplicado diretamente em documentos PDF, adicionando um selo temporal que comprova a existência do documento no momento da assinatura. Esse uso é ideal para documentos que precisam de uma marcação temporal visível e verificável, tornando o processo de assinatura mais seguro e de fácil verificação.

### 2- Utilização para ser estruturada dentro de uma assinatura CMS/PKCS#7 avulsa

O carimbo do tempo pode ser inserido dentro de uma estrutura de assinatura CMS/PKCS#7 avulsa, incorporando-se ao formato ASN.1 (bytes da assinatura original). Com isso, o carimbo passa a fazer parte da assinatura, garantindo a integridade e a validade temporal do conteúdo assinado, além de facilitar a auditoria e verificação em ambientes de assinatura digital mais complexos.

### 3- Utilização para ser estruturada dentro de uma assinatura para elevação de política XAdES/PAdES/CAdES&#x20;

O carimbo do tempo é utilizado para garantir a conformidade com políticas de assinatura avançadas, como XAdES, PAdES e CAdES, que exigem um nível adicional de segurança e longevidade da validade da assinatura. Nessa modalidade, o carimbo contribui para a conformidade com padrões internacionais, estendendo a validade jurídica da assinatura ao longo do tempo e agregando maior segurança na autenticidade do documento.

### Outros Links:

{% hint style="info" %}
Veja um exemplo [como configurar o Adobe Reader](/carimbo-do-tempo/configuracao-no-adobe-reader) para realizar assinaturas
{% endhint %}

{% hint style="info" %}
Veja um exemplo como utilizar o motor de assinaturas da GoSigner para realizar assinaturas usando políticas com carimbo do tempo

<https://docs.gocrypto.com.br/requisicao-de-assinatura#assinatura-cades-ad_rt-icp-brasil>

<https://docs.gocrypto.com.br/requisicao-de-assinatura#assinatura-pades-ad_rt-icp-brasil>
{% endhint %}


# Configuração no Adobe Reader

O Adobe Reader pode ser configurado para realizar assinaturas com carimbo do tempo, seguindo estas etapas:

### 1- Para configurar o serviço de carimbo do tempo, acesse:

{% hint style="info" %}
Editar -> Preferências -> Assinaturas (Painel de Categorias) -> Mais... (na subseção de Data/Hora em Documento).
{% endhint %}

<figure><img src="/files/ulsMzsZ5OSsqCGbbmkb8" alt=""><figcaption><p>A imagem acima mostra a janela para configurar o serviço de carimbo do tempo.</p></figcaption></figure>

### 2- Em seguida, clique no botão **"Novo"** para abrir a janela de configurações (conforme ilustrado). Na janela, preencha os campos conforme abaixo:

* **Nome**: Insira um nome de sua escolha para identificar o serviço.
* **URL do servidor**: Digite o endereço do serviço da GoSigner
* **Nome de usuário**: Insira o nome de usuário fornecido.
* **Senha**: Insira a senha fornecida.

{% hint style="warning" %}
URL do servidor de produção: <https://api.gosigner.com.br/tsr>

URL do servidor de homologação: <https://api-stage.gosigner.com.br/tsr>
{% endhint %}

<figure><img src="/files/14NQwiRmU04hpwo0gZCL" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/eUW1yIksHjtEwCsEoxXK" alt=""><figcaption></figcaption></figure>

Após preencher, clique em **OK** para salvar.

### 3- Finalmente, defina o carimbo do tempo criado como padrão:

* Clique no botão **"Definir Padrão"** localizado no canto superior direito da janela de Configurações do servidor.
* Confirme clicando em **OK** na janela de confirmação.


# Aparência e validação do carimbo

## Qual é a aparência que o carimbo fica no documento?&#x20;

Em documentos de texto, a assinatura gerada é normalmente dos tipos P7S ou P7B, com o carimbo do tempo incluído apenas nos metadados, sem exibição visual da assinatura ou do carimbo.

Já em documentos PDF, tanto o carimbo quanto a combinação de assinatura + carimbo podem ser exibidos visualmente. É possível utilizar uma imagem personalizada durante a assinatura, como o brasão da instituição, um QRCode de validação, número de protocolo, entre outros elementos relevantes para o contexto, proporcionando maior clareza e autenticidade visual.

## Como validar a assinatura + carimbo?

Atualmente os certificados emitidos na ICP Brasil constam como sendo confiáveis pela Adobe, pois fazem parte da [**AATL - Approved Trust List**.](https://helpx.adobe.com/br/acrobat/kb/approved-trust-list1.html)No próprio **AdobeReader** ou outro leitor de PDF que suporte assinaturas de documento, é possível validar/verificar.&#x20;

Também é possível, usar diretamente o Gov.BR ITI ([Instituto Nacional de Tecnologia da Informação](https://www.gov.br/iti/pt-br)), disponibiliza um validador gratuito, para utilizar basta acessar <https://validar.iti.gov.br/>, caso esteja acessando o site do validador pelo celular é possível usar o padrão de QRCode (inserido na assinatura visual), ou submeter o arquivo via upload para validação.

### Como uma assinatura GoSigner/API fica dentro do validador do ITI? Nesse exemplo seguimos o padrão PAdES AD\_RT:

<figure><img src="/files/fNQZlkwJt7EJvMNxm7uM" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/UX2BIpQCSEBKEyXkjLA5" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Neste exemplo, ao usar um certificado ICP-Brasil da empresa ou instituição GOSigner junto com o carimbo, obtém-se um selo digitalmente seguro.

Uma das opções é emitir um certificado de Pessoa Jurídica (PJ) para a instituição que fará uso do carimbo. Dessa forma, o documento fica assinado pela própria empresa (PJ) e carimbado por uma autoridade confiável e autorizada na ICP-Brasil.

Além dos elementos visuais no PDF, totalmente personalizáveis pela empresa que está assinando, as informações nos metadados — onde GOSIGNER aparece no resultado da validação — também refletirão os dados da empresa signatária.
{% endhint %}


