Manual de Integração com VIDaaS - Certificado em Nuvem
v1.6
- 1 1. Introdução
- 2 2. Cadastro de Aplicação
- 3 3. Uso da API
- 3.1 3.1. Autorização e Autenticação
- 3.2 3.2. Assinaturas digitais em documentos com o “Signature”
- 3.3 3.3 Serviço para encontrar um titular mediante informação de CPF ou CNPJ (“user-discovery”).
- 3.4 3.4 Extração da chave pública com o “Public Certificate”
- 4 4. Observações sobre o modelo de negócios
- 5 5. Postman: Exemplos de chamadas aos Endpoints
1. Introdução
Informações de contato e URIs.
1.1. Contato
Em caso de dúvidas ou dificuldades na integração você pode entrar em contato conosco abrindo um chamado em: https://valid-sa.atlassian.net/servicedesk/customer/portal/4/group/115/create/51 ou pelo email produtos.certificadora@valid.com.
Inclua em seu email os dados abaixo:
1.1. URIs base do Valid PSC
Produção: https://certificado.vidaas.com.br
Homologação: https://hml-certificado.vidaas.com.br
2. Cadastro de Aplicação
Para utilizar os serviços de autorização e assinatura é obrigatório cadastrar sua aplicação junto ao Valid PSC, este serviço para cadastro é realizado uma única vez. Abaixo a descrição do serviço para cadastro de aplicação. Para obtenção de autorização e assinatura é obrigatório cadastrar sua aplicação junto ao Valid PSC, este serviço para cadastro é realizado uma única vez. Abaixo a descrição do serviço para cadastro de aplicação.
Solicitação de cadastro:
Path : <URI-base>/v0/oauth/application
Verbo HTTP: POST
Cabeçalho:
Content-type: application/json
Accept: application/json
Corpo da requisição no formato "application/json;charset=UTF-8"
name: obrigatório, nome/descrição da aplicação;
comments: obrigatório, observações gerais de uso da aplicação;
redirect_uris: obrigatório, URI’s autorizadas para redirecionamento (para serviços de código de autorização);
email: obrigatório, e-mail para suporte em caso de indisponibilidade, mudança de versão, entre outros.
Exemplo de requisição:
{
"name": "App Demo",
"comments": "App Demo Observação",
"redirect_uris": ["https://valid.com.br"],
"email": "demo@valid.com"
}
Exemplo de resposta:
{
"status": "success",
"message": "New Client Application registered with Sucess",
"client_id": "4c9fb552-0387-4e5f-8727-6676fa88dce1",
"client_secret": "Ny2n3hq67gQEFvH7"
}
Observação:
Os parâmetros de retorno “client_id” e “client_secret” devem ser armazenadas na sua aplicação que serão parâmetros nas chamadas de outros serviços para autorização e assinatura.
O parâmetro “redirect_uris“ é utilizado para armazenar todas as URIs que poderão ser utilizadas posteriormente pela aplicação no redirecionamento do usuário após a assinatura ser realizada.
3. Uso da API
Os próximos tópicos descrevem como utilizar a API para realizar autenticações e assinaturas digitais.
3.1. Autorização e Autenticação
Serviço para obter do titular a autorização de uso da sua chave privada, com solicitação de fatores de autenticação através de QR Code ou notificação enviada para o celular do titular (Push).
Em ambos os casos, o usuário digitará a senha de seu certificado e se a senha for digitada corretamente, a sua aplicação receberá a autorização de acordo com o escopo solicitado.
Recomendamos que implemente os dois médotos (QR Code e Notificação) na sua aplicação, permitindo que o próprio usuário escolha o método de autenticação. Isso melhora a experiência do usuário e aumenta a disponibilidade do serviço.
3.1.1. Solicitação de autorização por QR Code
Através de um link, uma página com QR Code é disponibilizada para que o usuário faça a autorização. Após realizada essa autorização, a página redireciona para a uri pré-definida.
A página com o QR Code ficará aguardando por 2 minutos o titular da chave privada autenticar com o aplicativo ViDaas.
a) Jornada do usuário autorizando o uso da chave privada via leitura de QR Code no app Vidaas
b) Resposta da Requisição de Código de Autorização (Receive Code)
Ao autorizar o uso pelo titular, o Valid PSC emite um código de autorização com tempo de validade curto e retorna para aplicação cliente com uma URI de redirecionamento contendo parâmetros no componente http query, usando o formato "application/x-www- form-urlencoded":
Caso o titular não autorize o uso, o Valid PSC aguardará o tempo de expiração do QRCODE e irá exibir a mensagem conforme imagem abaixo:
c) Endpoint
Abaixo os parâmetros necessários para utilização deste método:
Path : <URI-base>/v0/oauth/authorize
Verbo HTTP: GET
Parâmetros da requisição no formato "Query Params"
client_id: obrigatório, deve conter a identificação da aplicação;
code_challenge: obrigatório, ver RFC 7636. Utilizado para assegurar integridade com a solicitação da autorização e com a geração do access_token que será visto adiante. Utiliza OAuth com PKCE para geração do par code challenge e code verifier. Caso precise, fazendo uma busca na internet, pode-se encontrar geradores online dessas chaves;
code_challenge_method: obrigatório, valor “S256” (ver RFC 7636);
response_type: obrigatório, valor "code".
scope: opcional, se não informado será considerado "single_signature" (preferencialmente deve ser informado o tipo do escopo desejado porque o valor padrão pode mudar). Possíveis valores para o parâmetro:
single_signature: token que permite a assinatura de apenas um conteúdo (hash), sendo invalidado após a sua utilização;
multi_signature: token que permite a assinatura de multiplos hashes em uma única requisição, sendo invalidado após a sua utilização;
signature_session: token de sessão OAuth que permite várias assinaturas em várias chamadas a API, desde que o token esteja dentro do prazo de validade ou que não tenha sido revogado pela aplicação ou pelo usuário.
authentication_session: token de sessão oAuth apenas para autenticação e que não permite uso da chave privada do usuário.
login_hint: deixar em branco.
lifetime: opcional, indica o tempo de vida desejado para o token a ser gerado. Inteiro, em segundos. O valor máximo varia com o tipo de certificado:
Pessoa Física: até 7 dias;
Pessoa Jurídica: até 30 dias;
Nota: Neste caso é importante conhecer a rotina do seu usuário. Alguns parceiros utilizam esse parâmetro de forma em que o usuário final escolhe por quanto tempo poderá ficar sem precisar inserir a senha novamente.
Sugestão: A duração da sessão pode ser implementada de acordo com a rotina do usuário, por exemplo, um médico que realiza um plantão de doze horas deveria ter uma sessão de 43200 s.
redirect_uri: obrigatório, deve conter uma uri informada anteriormente na criação da aplicação.
state: opcional.
Exemplo de requisição:
PATH_BASE/oauth/authorize?client_id=4c9fb552-0387-4e5f-8727-6676fa88dce1&code_challenge=E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM&code_challenge_method=S256&response_type=code&scope=signature_session&login_hint=12345678901&lifetime=900&redirect_uri=http://valid.com.br
Exemplo de resposta:
3.1.2. Solicitação por notificação no celular (Push)
Nesse método, o signatário receberá uma notificação em seu celular, solicitando a assinatura pelo aplicativo VIDaaS:
a) Jornada do usuário: Usuário fornecendo a autorização através da notificação
b) Endpoint
Path : <URI-base>/v0/oauth/authorize
Verbo HTTP: GET
Parâmetros da requisição no formato "Query Params"
client_id: obrigatório, deve conter a identificação da aplicação;
code_challenge: obrigatório, ver RFC 7636. Utilizado para assegurar integridade com a solicitação da autorização e com a geração do access_token que será visto adiante. Utiliza OAuth com PKCE para geração do par code challenge e code verifier. Caso precise, fazendo uma busca na internet, pode-se encontrar geradores online dessas chaves;
code_challenge_method: obrigatório, valor “S256” (ver RFC 7636);
response_type: obrigatório, valor "code".
scope: opcional, se não informado, será considerado "single_signature" (preferencialmente deve ser informado o tipo do escopo desejado porque o valor padrão pode mudar). Possíveis valores para o parâmetro:
single_signature: token que permite a assinatura de apenas um conteúdo (hash), sendo invalidado após a sua utilização;
multi_signature: token que permite a assinatura de multiplos hashes em uma única requisição, sendo invalidado após a sua utilização;
signature_session: token de sessão OAuth que permite várias assinaturas em várias chamadas a API, desde que o token esteja dentro do prazo de validade ou que não tenha sido revogado pela aplicação ou pelo usuário;
authentication_session: token de sessão oAuth apenas para autenticação e que não permite uso da chave privada do usuário.
login_hint: obrigatório, informar CPF ou CNPJ do titular a que se destina a requisição.
lifetime: opcional, indica o tempo de vida desejado para o token a ser gerado. Inteiro, em segundos;
redirect_uri: informar apenas o valor “push://” no parâmetro.
Exemplo de requisição:
Exemplo de resposta com PUSH:
c) Importante! Realizando uma autenticação através do “authentications” ao solicitar autorização por push
Esse método deve ser utilizado somente para casos de solicitação por notificação (Push) e permite saber se o titular realizou a “assinatura” que lhe foi solicitada.
Por se tratar de uma operação assíncrona, esse método deve ser chamado recorrentemente até que retorne o conteúdo com o “autorizationToken”.
Importante informar que a “recorrência“ deve ocorrer “com intervalo de tempo de no mínimo 1 segundo“. Chamadas menores do que esse intervalo estarão sujeitas ao bloqueio da aplicação.
Path : <URI-base>/valid/api/v1/trusted-services/authentications
Verbo HTTP: GET
Parâmetros da requisição no formato "Query Params"
◦ code: obrigatório, deve conter código retornado pelo método authorize
Exemplo de solicitação de status da autenticação:
Exemplo de resposta:
3.1.3 Obter a chave para autenticação de documentos com o “token”
Retorna o “access_token”.
Path : <URI-base>/v0/oauth/token
Verbo HTTP: POST
Parâmetros da requisição no formato "application/x-www-form-urlencoded"
grant_type: obrigatório, valor "authorization_code";
client_id: obrigatório, deve conter a identificação da aplicação;
client_secret: obrigatório, deve conter o segredo associado à aplicação;
code_verifier: obrigatório, informar a chave que corresponde ao code_challenge enviado na Requisição de Código de Autorização (ver RFC 7636).
code: obrigatório, deve conter código de autorização retornado do Serviço Código de Autorização;
Observações:
Para o método Authorize QR Code deve-se alterar o campo "code" pelo "code" retornado.
Para o método Authorize PUSH deve-se alterar o campo "code" pelo "authorizationToken" retornado no Authentications.
Exemplo de requisição:
Exemplo de resposta:
3.2. Assinaturas digitais em documentos com o “Signature”
Utilizado para realizar assinaturas digitais em documentos de no máximo 7 MB.
Path: <URI-base>/v0/oauth/signature
Verbo HTTP: POST
Parâmetros da requisição no formato "raw"
Content-type: application/json;
Accept : application/json;
Authorization: Bearer access_token (obtido anteriormente);
Parâmetros: formato "application/json;charset=UTF-8" :
certificate_alias: opcional, identificador do certificado correspondente à chave utilizada na assinatura.
hashes: conjunto com valores referentes a documentos a serem assinados. Cada elemento do conjunto conterá:
id: identificador do conteúdo a ser assinado;
alias: forma legível do identificador do conteúdo;
hash: conteúdo a ser assinado, deve ser convertido inicialmente em SHA256 e posteriormente em base64;
hash_algorithm: Object Identifier (OID) do algoritimo de hash. Por exemplo, para SHA256 utilize o OID 2.16.840.1.101.3.4.2.1;;
signature_format: formato da assinatura, por exemplo:
RAW: resultado direto (em base64) da operação RSA sobre o hash informado na requisição.
CMS: PKCS#7 detached contendo os seguintes atributos assinados:
- contentType
- signingTime (hora do PSC)
- messageDigest (hash informado pela aplicação na requisição)
- signingCertificateV2 (certificado do assinante);
padding_method: opcional,
pdf_signature_page: opcional, acrescenta página no PDF mostrando a assinatura digital, podendo ter o valor "true" ou "false", por padrão é definido o valor "false",
base64_content: opcional, conteúdo em base64 a ser assinado. Por exemplo Texto ou PDF a ser assinado em base64.
Observações:
A aplicação suporta os seguintes “signature_format”: RAW_DATA, CMS, CAdES_AD_RT, CAdES_AD_RB, PAdES_AD_RT, PAdES_AD_RB, RAW_DIGESTED_DATA.
A aplicação suporta os seguintes “padding_method”: NONE, PKCS1V1_5, PSS. Método usado para complementar o tamanho de 256 bytes do dado a ser assinado. O mais utilizado é o PKCS1V1_5.
Exemplo de requisição:
Exemplo de resposta:
Por questão de ilustração, neste exemplo, não é passado o documento para assinatura, somente seu hash. Porém, se o parâmetro base64_content for informado, o retorno será o documento assinado em base64 e para decodificar, é necessário retirar as quebras de linha “\r\n” antes.
3.3 Serviço para encontrar um titular mediante informação de CPF ou CNPJ (“user-discovery”).
Antes de chamar a aplicação para autenticação, você pode verificar se um CPF ou CNPJ existe no Valid PSC e listar os certificados disponíveis para ele.
Solicitação do serviço:
Path: <URI-base>/v0/oauth/user-discovery
Verbo HTTP: POST
Corpo da requisição no formato "application/json;charset=UTF-8"
client_id: obrigatório, deve conter a identificação da aplicação;
client_secret: obrigatório, deve conter o segredo associado à aplicação;
user_cpf_cnpj: obrigatório, deve conter “CPF” para pessoa física ou “CNPJ” pessoa jurídica;
val_cpf_cnpj: obrigatório, deve conter o valor do cpf ou cnpj.
Exemplo de requisição:
Exemplos de respostas:
2.1 - Status S
2.2 - Status N
Observação 1
Status de retorno indicando “S” para resultado positivo ou “N” caso não exista certificado válido para o CPF pesquisado.
Observação 2:
O endpoint retorna apenas certificados válidos?
Sim. No entanto, serão considerados válidos certificados que estejam com sua validade normativa dentro do prazo.
Certificados válidos mas que não tenham renovado a sua licença comercial, também serão tratados como certificados válidos.
3.4 Extração da chave pública com o “Public Certificate”
Utilizado para extração da chave pública em base64 do signatário de um documento.
Para utilização dessa função deve-se utilizar o “certificate_alias” gerado no Sinature e do “access_token” gerado no endpoit Token.
Path : <URI-base>/v0/oauth/certificate-discovery
Verbo HTTP: GET
Parâmetros da requisição no formato "Query Params"
◦ token (authorizathion bearer): obrigatório, deve conter código retornado do Serviço de Token.
◦ certificate_alias: obrigatório, deve conter código retornado do Serviço de Assinatura (Signature).
Exemplo de resposta:
4. Observações sobre o modelo de negócios
a) O que é a licença comercial ou “Direito de uso”?
Quando um certificado A3 em nuvem é emitido, ele é criado com validade normativa de 5 anos. No entanto, comercialmente o usuário terá adquirido um período menor, de 1 ano em geral. Quando este prazo de licença comercial, ou, “Direito de uso” tiver acabado, ele poderá adquirir licenças adicionais, ampliando o direito de utilização, sem que precise realizar o processo e validação.
b) Todos os usuários podem ser bloqueados?
Não! Não são todos os usuários que podem ser bloqueados. Existe possibilidade de implementação de solução corporativa para que a renovação seja transparente ao usuário final.
c) Como o usuário saberá que não possui direito de uso ao certificado.?
Desde que seja um usuário proveniente do varejo. O usuário terá alterações visuais na interface do aplicativo, receberá notificações e email para comunicar a proximidade do vencimento do direito de uso.
Imagem 7: Fluxo de telas para a Renovação do direito de uso
5. Postman: Exemplos de chamadas aos Endpoints
Projeto Postman com as chamadas aos endpoints.
Valid Certificadora Ltda