Requisitos adicionais de integração - RIB
A integração com o Assinador Web do Registro de Imóveis do Brasil - RIB possui alguns requisitos adicionais não mencionados no restante dessa documentação.
Metadados obrigatórios
Ao criar sessões de assinatura, é necessário fornecer os seguintes metadados obrigatórios:
cartorio: Nome do cartório emitente (esse valor é exibido na página de validação do documento)cns: CNS (Código Nacional de Serventia) do cartório emitente
O CNS pode ser informado em qualquer uma das formas abaixo:
1234(apenas dígitos)001234(com zeros à esquerda)00.123-4(formatação completa)
Em .NET:
var response = await restPkiService.CreateSignatureSessionAsync(new CreateSignatureSessionRequest() {
...
}, documentMetadata: new NameValueCollection {
["cartorio"] = "XXº Oficial de Registro de Imóveis do Município - UF",
["cns"] = "123456",
});
Em PHP:
$request = new CreateSignatureSessionRequest();
...
$request->documentMetadata = [
"cartorio" => "XXº Oficial de Registro de Imóveis do Município - UF",
"cns" => "123456"
];
Em Java:
CreateSignatureSessionRequest request = new CreateSignatureSessionRequest();
...
List<String> firstElement = new ArrayList<>();
firstElement.add("XXº Oficial de Registro de Imóveis do Município - UF");
request.putDocumentMetadataItem("cartorio", firstElement);
List<String> secondElement = new ArrayList<>();
secondElement.add("123456");
request.putDocumentMetadataItem("cns", secondElement);
Caso esteja chamando a API diretamente:
POST {endpoint}/api/signature-sessions
{
...,
"documentMetadata": {
"cartorio": ["XXº Oficial de Registro de Imóveis do Município - UF"],
"cns": ["123456"]
}
}
Além dos metadados mencionados acima, todo documento no Assinador Web tem também o metadado validade, no formato aaaa-mm-dd, por exemplo 2021-04-01
(1º de abril de 2021). Esse metadado é automaticamente atribuído aos documentos contando 30 dias a partir da data de assinatura e não pode ser especificado
na criação da sessão.
Alocação de chaves de validação de documento
A chave de validação do documento, às vezes chamada de "hash" no contexto dos processos do RIB, é o código alfanumérico que consta na margem do documento e que permite que este seja consultado posteriormente:

No momento da assinatura do documento, o usuário tem a opção de informar a chave de validação que aquele documento deve ter, ao invés de o sistema gerar uma nova chave aleatória:

Deve ser possível aos registros de imóveis, através das centrais de serviços, alocar chaves de validação para uso posterior. Para isso, a sua central deve chamar a API de alocação de chaves de documentos. Nessa chamada, é necessário passar os mesmos metadados obrigatórios descritos acima:
Em .NET:
// Alocar uma chave
var documentKey = await restPkiService.AllocateDocumentKeyAsync(new NameValueCollection {
["cartorio"] = "XXº Oficial de Registro de Imóveis do Município - UF",
["cns"] = "123456",
});
// Alocar N chaves
var documentKeys = await restPkiService.AllocateDocumentKeysAsync(10, new NameValueCollection {
["cartorio"] = "XXº Oficial de Registro de Imóveis do Município - UF",
["cns"] = "123456",
});
Em PHP:
$defaultDocumentMetadata = [
"cartorio" => "XXº Oficial de Registro de Imóveis do Município - UF",
"cns" => "123456"
];
// Alocar uma chave
$documentKey = $service->allocateDocumentKey($defaultDocumentMetadata);
// Alocar N chaves
$documentKeys = $service->allocateDocumentKeys(10, $defaultDocumentMetadata);
Em Java:
Map<String, List<String>> defaultDocumentMetadata = new HashMap();
List<String> firstElement = new ArrayList<>();
firstElement.add("XXº Oficial de Registro de Imóveis do Município - UF");
defaultDocumentMetadata.put("cartorio", firstElement);
List<String> secondElement = new ArrayList<>();
secondElement.add("123456");
defaultDocumentMetadata.put("cns", secondElement);
// Alocar uma chave
DocumentKeyModel service.allocateDocumentKey(defaultDocumentMetadata);
// Alocar N chaves
DocumentKeyModel service.allocateDocumentKeys(10, defaultDocumentMetadata);
Caso esteja chamando a API diretamente:
// Alocar uma chave
POST {endpoint}/api/document-keys
{
"provisionalMetadata": {
"cartorio": ["XXº Oficial de Registro de Imóveis do Município - UF"],
"cns": ["123456"]
}
}
// Alocar N chaves
POST {endpoint}/api/document-keys/batch
{
"count": 10,
"provisionalMetadata": {
"cartorio": ["XXº Oficial de Registro de Imóveis do Município - UF"],
"cns": ["123456"]
}
}
O parâmetro provisionalMetadata na alocação de chaves serve para informar qual é o cartório responsável por submeter o documento correspondente
a uma determinada chave, permitindo ao sistema exibir essa informação caso a chave seja usada na consulta de documentos:

Geração de chave de API para uso do utilitário
Os registros de imóveis terão à sua disposição um utilitário de linha de comando para assinar documentos a partir de suas aplicações desktop. O uso desse utilitário requer uma chave de API.
Deve ser possível aos registros de imóveis, através das centrais de serviços, gerar chaves de API para uso do utilitário. Para isso, a sua central deve implementar uma lógica semelhante à seguinte:
- Verifique no banco de dados se já foi criada uma application no Assinador Web para o cartório em questão
- Caso não tenha sido, crie uma application especificando:
- roles:
Worker - defaultDocumentMetadata: CNS e nome do cartório (conforme regras descritas acima)
- roles:
- Armazene o
applicationIdresultante no banco de dados associado ao cartório - Crie uma application key passando o
applicationIddo cartório e informe o resultado ao usuário
Exemplo em .NET:
var cartorio = ... // entidade de cartório no sistema da central
if (cartorio.AssinadorWebAppId == null) {
var metadata = new NameValueCollection {
["cns"] = cartorio.Cns,
["cartorio"] = cartorio.Nome,
};
var app = await restPkiService.CreateApplicationAsync($"CENTRAL-{cartorio.Cns}", new[] { Roles.Worker }, metadata);
cartorio.AssinadorWebAppId = app.Id;
Save();
}
var appKey = await restPkiService.CreateApplicationKeyAsync(cartorio.AssinadorWebAppId.Value, description: $"Gerada por {User.Name}");
return appKey.Key;
Alguns pontos importantes:
- O parâmetro
$"CENTRAL-{cartorio.Cns}"é o nome da aplicação. Esses nomes precisam ser únicos no Assinador Web, independentemente da central. Por isso a sugestão de usar o CNS prefixado com um identificador que remeta ao nome da central (por exemplo,OE-para o caso do Ofício Eletrônico) - Por motivo de segurança, o Assinador Web não armazena a chave de API gerada (apenas o hash dela). As centrais devem fazer o mesmo, ou seja, a cada vez que um cartório pede uma chave de API gera-se uma nova chave (mas não uma nova aplicação)
- O campo
descriptionna chamada aoCreateApplicationKeyAsyncé opcional e pode ser usado para registrar o usuário que disparou a geração da chave
Em PHP:
$cartorio = ... // entidade de cartório no sistema da central
if($cartorio->assinadorWebAppId == null){
$name = "CENTRAL-" . $cartorio->cns;
$roles = [Roles::WORKER];
$metadata = [
"cartorio" => $cartorio->nome,
"cns" => $cartorio->cns
];
$app = $service->createApplication($name, $roles, $metadata);
$cartorio->assinadorWebAppId = $app->id;
}
$appKey = $service->createApplicationKey($appKey->id, null, "Gerada por " . $user->name);
return $appKey->key;
Em Java:
if(cartorio.getAssinadorWebAppId() == null){
String name = "CENTRAL-" + cartorio.getCns();
List<Roles> roles = new ArrayList<>();
roles.add(Roles.fromValue("Worker"));
Map<String, List<String>> metadata = new HashMap();
List<String> firstElement = new ArrayList<>();
firstElement.add(cartorio.getNome());
metadata.put("cartorio", firstElement);
List<String> secondElement = new ArrayList<>();
secondElement.add(cartorio.getCns());
metadata.put("cns", secondElement);
ApplicationModel app = service.createApplication(name, roles, metadata);
cartorio.setAssinadorWebAppId(app.getId());
}
CreateApplicationApiKeyResponse appKey = service.createApplicationKey(app.getId(), null, "Gerada por " + user.getName());
return appKey.getKey();
Caso esteja chamando a API diretamente, as chamadas são:
// Criar aplicação (uma vez por cartório)
POST {endpoint}/api/applications
{
"name": "CENTRAL-123456",
"authorizationData": {
"roles": ["Worker"]
},
"rootAuthorizationData": {
"roles": []
}
}
// Envio dos metadados associados à aplicação do cartório
POST {endpoint}/api/applications/default-document-metadata
{
"cartorio": ["XXº Oficial de Registro de Imóveis do Município - UF"],
"cns": ["123456"]
}
// Criação da chave de API
POST {endpoint}/api/applications/{id}/api-keys
{
"description": "Gerada por FULANO DE TAL"
}