Como configurar Oracle Wallet para consumo de APIs HTTPS

Tags: oracle http api

O Oracle Wallet é um repositório seguro de certificados digitais e chaves criptográficas. Ele permite que o Oracle Database se comunique com serviços externos via HTTPS, validando os certificados SSL/TLS apresentados pelos servidores remotos.

Esse processo é necessário quando se utiliza pacotes como UTL_HTTP, UTL_SMTP ou DBMS_LDAP em conexões seguras (HTTPS), especialmente para consumir APIs públicas como ViaCEP, ReceitaWS, SEFAZ, entre outras.

Este FAQ apresenta passo a passo como configurar o Oracle Wallet, importar certificados confiáveis e executar chamadas seguras a APIs externas utilizando PL/SQL.


1. Verificar as variáveis de ambiente do Oracle

Essas variáveis definem onde estão instalados o Oracle Database (ORACLE_HOME) e a base (ORACLE_BASE). Isso ajuda a localizar o local correto para criar a wallet.

echo $ORACLE_HOME
echo $ORACLE_BASE

2. Criar diretório do Oracle Wallet

Crie uma pasta para armazenar os arquivos da wallet (normalmente dentro de $ORACLE_BASE/admin/).

cd $ORACLE_BASE/admin/orcl
mkdir wallet
cd wallet

3. Baixar os certificados HTTPS da API desejada

Esse comando se conecta à API e extrai toda a cadeia de certificados, salvando no arquivo fullchain.pem.

echo | openssl s_client -connect viacep.com.br:443 -showcerts > fullchain.pem

4. Dividir os certificados em arquivos individuais

Separa o fullchain.pem em xx01, xx02, xx03...

csplit -sz fullchain.pem '/-----BEGIN CERTIFICATE-----/' '{*}'

5. Classificar os certificados

Use os comandos abaixo para identificar cada um dos arquivos e classificá-los como:

  • Certificado do site (subject = domínio): não precisa importar

  • Certificados intermediários (subject <> issuer): importar

  • Certificado raiz (subject = issuer): importar

openssl x509 -in xx01 -noout -subject -issuer
openssl x509 -in xx02 -noout -subject -issuer
openssl x509 -in xx03 -noout -subject -issuer
openssl x509 -in xx04 -noout -subject -issuer

6. Renomear os arquivos identificados

Renomeie os arquivos para facilitar o uso:

rm xx00
mv xx01 site.crt
mv xx02 intermediate1.crt
mv xx03 intermediate2.crt
mv xx04 root.crt

7. Criar o Oracle Wallet com senha e auto login

orapki wallet create -wallet /oracle/admin/orcl/wallet -pwd Supinf12! -auto_login

8. Importar certificados confiáveis no Wallet

orapki wallet add -wallet /oracle/admin/orcl/wallet -trusted_cert -cert intermediate1.crt -pwd Supinf12!
orapki wallet add -wallet /oracle/admin/orcl/wallet -trusted_cert -cert intermediate2.crt -pwd Supinf12!
orapki wallet add -wallet /oracle/admin/orcl/wallet -trusted_cert -cert root.crt -pwd Supinf12!

9. Verificar os certificados adicionados

orapki wallet display -wallet /oracle/admin/orcl/wallet

10. Configurar o arquivo sqlnet.ora

Edite:

vi $ORACLE_HOME/network/admin/sqlnet.ora

Adicione:

WALLET_LOCATION =
  (SOURCE =
    (METHOD = FILE)
    (METHOD_DATA =
      (DIRECTORY = /oracle/admin/orcl/wallet)
    )
  )
SSL_CLIENT_AUTHENTICATION = FALSE

11. Conceder permissão para o banco acessar a API (ACL)

BEGIN
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
    host => 'viacep.com.br',
    ace  => xs$ace_type(
      privilege_list => xs$name_list('connect'),
      principal_name => 'NOME_DO_USUARIO',
      principal_type => xs_acl.ptype_db
    )
  );
END;
/

12. Garantir que o usuário pode usar o pacote UTL_HTTP

GRANT EXECUTE ON UTL_HTTP TO NOME_DO_USUARIO;

13. Exemplo completo de chamada HTTPS com PL/SQL

DECLARE
  req   UTL_HTTP.req;
  resp  UTL_HTTP.resp;
  value VARCHAR2(32767);
BEGIN
  UTL_HTTP.SET_WALLET('file:/oracle/admin/orcl/wallet', 'Supinf12!');
  req := UTL_HTTP.BEGIN_REQUEST('https://viacep.com.br/ws/01001000/json/');
  UTL_HTTP.SET_HEADER(req, 'User-Agent', 'Mozilla/5.0');
  resp := UTL_HTTP.GET_RESPONSE(req);

  LOOP
    UTL_HTTP.READ_LINE(resp, value, TRUE);
    DBMS_OUTPUT.PUT_LINE(value);
  END LOOP;

  UTL_HTTP.END_RESPONSE(resp);
EXCEPTION
  WHEN UTL_HTTP.END_OF_BODY THEN
    UTL_HTTP.END_RESPONSE(resp);
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Erro: ' || SQLERRM);
    UTL_HTTP.END_RESPONSE(resp);
END;
/








































VOLTAR

Outros Artigos

Nenhum artigo relacionado.