Friday, August 27, 2010

Oracle UTL_HTTP i ACL a la 11g

Tenia un bug molt xungo a l'Oracle en el que obtenia el següent missatge d'error:

ORA-24247: network access denied by access control list (ACL)


Després d'investigar una miqueta veia que es produïa en obrir una connexió HTTP fent servir el package UTL_HTTP. I això funcionava perfectament a la 10g. El més fort és que fent servir un procediment anònim funcionava i amb un procedure no.

Això funciona:
declare
l_http_req utl_http.req;
begin
l_http_req := utl_http.begin_request ('http://alapamui.blogspot.com/', 'POST');
utl_http.end_request(l_http_req);
end;
/

Això no funciona:
create or replace procedure test_http is
l_http_req utl_http.req;
begin
l_http_req := utl_http.begin_request ('http://alapamui.blogspot.com/', 'POST');
utl_http.end_request(l_http_req);
end;
/

begin
test_http;
end;
/

Investigant una miqueta més, resulta que a la 10g un usuari amb permisos per executar UTL_HTTP podia accedir a qualsevol URL, però a la 11g han incorporat un mecanisme més fi basat en ACL (Access Control Lists).

A la web de ORACLE-BASE hi ha una explicació de com funcionen els accessos a xarxa a la 11g. En el meu cas he tingut prou amb el següent:

BEGIN
DBMS_NETWORK_ACL_ADMIN.create_acl (
acl => 'alapamui.xml',
description => 'Alapamui ACL',
principal => 'ALAPAMUI',
is_grant => TRUE,
privilege => 'connect',
start_date => SYSTIMESTAMP,
end_date => NULL);

COMMIT;
END;
/

BEGIN
DBMS_NETWORK_ACL_ADMIN.assign_acl (
acl => 'alapamui.xml',
host => 'alapamui.blogspot.com',
lower_port => NULL,
upper_port => NULL);

COMMIT;
END;
/
Si el que cal és accedir a una pàgina per HTTPS, cal configurar també els certificats a l'Oracle o obtindreu un error com el següent:

ORA-29024: Certificate validation failure


Els certificats a l'Oracle s'enregistren en una cosa que li diuen Wallet. Si no disposeu de l'Oracle Wallet Manager podeu enregistrar els certificats fent servir la comanda orapki.

No comments: