Como utilizar conexiones HTTPS en Oracle 11g, 12c, con Oracle Wallet

Hola Amig@s,

Si por un casual necesitamos conectarnos a una dirección https desde Oracle, por SQL o PL/SQL por ejemplo, no nos valdrá la conexión normal. Oracle necesita utilizar certificados que se instalan en la Oracle Wallet y que luego se llaman a la hora de establecer la conexión con el host remoto. Esto normalmente se utiliza con Web Services (SOAP y REST).

Pasos para realizar una conexión HTTPS:

1-Crear una ACL al puerto 443:

begin
  dbms_network_acl_admin.create_acl (
    acl         => 'utl_http.xml',
    description => 'HTTP Access',
    principal   => 'USUARIO', >> cambiar por el usuario correcto.
    is_grant    => TRUE,
    privilege   => 'connect',
    start_date  => null,
    end_date    => null
  );

  dbms_network_acl_admin.add_privilege (
    acl        => 'utl_http.xml',
    principal  => 'USUARIO', >> cambiar por el usuario correcto.
    is_grant   => TRUE,
    privilege  => 'resolve',
    start_date => null,
    end_date   => null
  );

  dbms_network_acl_admin.assign_acl (
    acl        => 'utl_http.xml',
    host       => '*.google.com',
    lower_port => 443,
    upper_port => 443
  );
  commit;
end;

2-Crear un directorio donde se almacenará los certificados (wallet):

mkdir e:\oracle\wallet

3-Asociar el directorio al Oracle Wallet (donde se almacenará los certificados (wallet)):

orapki wallet create -wallet e:\oracle\wallet -pwd WalletPasswd123 -auto_login

4-Descargarnos el certificado raíz:

Para trabajar con Oracle Wallet tendremos que descargarnos el certificado raíz. Por ejemplo, para google, tecleamos google.com en la barra de tareas, hacemos clic sobre el icono de (seguro o secure) si estamos en chrome, luego en detalles, luego en el botón Ver Certificado (view certificate), luego en la pestaña Ruta del certificado o Certification Path, hacemos clic sobre el primer registro superior, pinchamos en el botón Ver Certificado, luego pinchamos en Detalle y abajo en el botón de Copiar a fichero.. lo exportamos seleccionando como tipo de certificado el de X.509 Codificado base 64 .CER, luego siguiente, indicamos una ruta donde dejarlo, por ejemplo c:\google.cer y finalizamos la exportación.

4-Asociar el certificado google.cer a la wallet:

Abrimos una consola y nos cambiamos a la ruta donde generamos el certificado que en este ejemplo era c:\
c:
cd\

Ahora ejecutamos el comando que asocia el certificado al directorio (wallet) creado anteriormente:

orapki wallet add -wallet e:\oracle\wallet -trusted_cert -cert "google.cer" -pwd WalletPasswd123

Si todo ha ido bien, no veremos ningún mensaje de respuesta, solo la ejecución del orapki.

5-Ahora que ya tenemos nuestra wallet con un certificado válido para el sitio al que queremos conectarnos, procederemos a probar la conexión HTTPS. Cuando se llama a la conexión UTL_HTTP tendremos que definirle que la conexión requerirá utilizar una wallet (colocar antes del begin request).

EXEC UTL_HTTP.set_wallet('file:e:\oracle\wallet', 'WalletPasswd123');

Ejemplo:

DECLARE
    lo_req  UTL_HTTP.req;
    lo_resp UTL_HTTP.resp;
  BEGIN
    UTL_HTTP.SET_WALLET ('file:e:\oracle\wallet','WalletPasswd123');
    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;

Respuesta:

<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en"><head><meta content="Google.com...

E voila!

Nota: Si estamos detrás de un proxy, deberemos indicar también que será necesario un proxy a través del comando:

UTL_HTTP.SET_PROXY('IPDELPROXY:PUERTO');

También será necesario crear una ACL para el propio proxy:

BEGIN
  DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(acl  => 'utl_http.xml',
                                    host => 'IPDELPROXYSINPUERTO');
END;

Nota: En caso de recibir un certificado en formato p12, primero hay que importarlo, luego exportarlo como pfx y por último para poder importar el fichero en la Oracle Wallet, lo convertiremos a extensión CER con el siguiente comando desde powershell:

Get-PfxCertificate -FilePath .\nombrecertificado.pfx | Export-Certificate -FilePath nuevocertificado.der -Type CERT

Espero que les haya resultado útil.
Salu2.
Share on Google Plus
    Blogger Comment

1 comentarios:

Jeffrey dijo...

buenas, en alguna ocasión lo conectaste con cloudflare de por medio?