Accesso alla Url tramite protocollo HTTPS usando il package UTL_HTTP

Cosa è UTL_HTTP?
E' un package oracle usato in query SQL o in PL/SQL che permette di accedere a dati in internet tramite protocollo http.

Da Oracle 9i Release 2, il pacchetto UTL_HTTP può accedere alle risorse di rete anche su HTTPS oltre che HTTP. 
Per abilitare l'accesso HTTPS dal pacchetto UTL_HTTP occorre installare un WALLET che permette di gestire i certificati.

Riferimento:
https://oracle-base.com/articles/misc/utl_http-and-ssl
https://doyensys.com/blogs/how-to-access-https-ssl-url-via-utl-http-using-the-orapki-wallet-command/

Installazione WALLET
1) Creare la directory contente il wallet
mkdir -p /u01/app/oracle/admin/SISV/wallet

2) Scaricare in locale i certificati. Ho scaricato per comodità sotto una cartella CRT.
mkdir -p /u01/app/oracle/admin/SISV/wallet/CRT

I certificati di Google sono due GTS Root R1.crt e GTS CA 1C3.crt da scaricare separatamete come singolo certificato e non come catena di certificato.


3) Creare il wallet usando una password (esempio svilAnag1022)
orapki wallet create -wallet /u01/app/oracle/admin/SISV/wallet -pwd <passwd> -auto_login

4) Aggiungere i certificati nel wallet.
orapki wallet add -wallet /u01/app/oracle/admin/SISV/wallet -trusted_cert -cert "/u01/app/oracle/admin/SISV/wallet/CERT/GTS CA 1C3.crt" -pwd <passwd>

orapki wallet add -wallet /u01/app/oracle/admin/SISV/wallet -trusted_cert -cert "/u01/app/oracle/admin/SISV/wallet/CERT/GTS Root R1.crt" -pwd <passwd>

Oppure usare l'utility grafica
cd /u01/app/oracle/product/11.2.0/dbhome_1/bin
./owm

5) Aggiungere la Wallet nell'ACL precedentemente creata.
Se ti tenta di contattare un secured web service (https) usando Oracle Wallet attraverso il pachetto di network UTL_HTTP riceviamo il seguente errore legato al mancata configurazone del wallet nell'Access Control List.

ORA-29259: end-of-input reached
oppure
ORA-29263: HTTP protocol error

SET SERVEROUTPUT ON
BEGIN
DBMS_NETWORK_ACL_ADMIN.ASSIGN_WALLET_ACL
(
ACL => '<name_of_the_XML_file>',
WALLET_PATH => 'file:<directory_path>'
);
EXCEPTION WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error occurred while assigning ACL to wallet: '|| SQLERRM);
END;
/

commit;

Nel mio esempio:

BEGIN
DBMS_NETWORK_ACL_ADMIN.ASSIGN_WALLET_ACL
(
ACL => '/sys/acls/sisv_adm2001_acl.xml',
WALLET_PATH => 'file:/u01/app/oracle/admin/SISV/wallet'
);
/
commit;

Se terminato con successo viene popolata la tabella
SQL> select * from DBA_WALLET_ACLS
 

TEST : Creare una procedura che effettua una richiesta htttps del sito google.

DECLARE
lo_req UTL_HTTP.req;
lo_resp UTL_HTTP.resp;
BEGIN
UTL_HTTP.SET_WALLET ('file:/u01/app/oracle/admin/SISV/wallet','<passwd>');
lo_req := UTL_HTTP.begin_request('https://www.google.com/');
lo_resp := UTL_HTTP.get_response(lo_req);
dbms_output.put_line(lo_resp.status_code);
UTL_HTTP.end_response(lo_resp);
END;
/


Effettuare una chiamata Https usando la procedura PL/sql creata prima
SQL> select utl_http.request('https://www.google.com', NULL,'file:/u01/app/oracle/admin/SISV/wallet', '<passwd>') from dual;


TEST: verifica di carimaneto di un file preso dal sito google attravero HTTPURITYPE

Ogni volta che effettuo un nuovo accesso a db, effettuare prima impostare il wallet 
SQL> exec UTL_HTTP.SET_WALLET ('file:/u01/app/oracle/admin/SISV/wallet','svilAnag1022');
e poi
SQL>  select HTTPURITYPE('https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png').getBlob() from dual;


Ulteriori informazioni:
Primary Note For SSL/TLS (Doc ID 2229775.1)
Without Proxy Server, UTL_HTTP Fails With "ORA-29259: End-of-input Reached" (Doc ID 2741079.1)

In aggiunta nella versione 11.2.0.4 quando si usa SYS.HTTPURITYPE con una url https si riceve un errore  (Doc ID 2072447.1) perchè  HTTPURITYPE non suppa  https URL.
Occorre applicare la Patch 14222612

L'errore persiste acnora con messaggio 
ORA-29273: richiesta HTTP non riuscita
ORA-06512: a "SYS.UTL_HTTP", line 1130
ORA-28759: apertura del file non riuscita
ORA-06512: a "SYS.HTTPURITYPE", line 84

L'errore non è legato ai certificati ma alla chiper suite come indicato nella nota Document 2402276.1 (che è più specifica per la 12)  la cipher suite preferita del sito "abbcbcbc.it" non è presente nella versione Oracle 11gr2 installata sui nostri server.
Instllare la Patch 31537677 - Oracle Database Patch Set Update 11.2.0.4.201020

Post popolari in questo blog

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione

Create e Drop Pluggable Database