Benutzer-Werkzeuge

Webseiten-Werkzeuge


prog:apex_mail_acl

Oracle Apex 5.0 Mail Versandt mit SSL -Hinterlegen einer ACL's in 11g und 12c und Hinterlegen von SSL Zertifkaten

11.2016

Um einen Mail Server zu hinterlegen, an den „INTERNAL“ Workspace anmelden und dort die Daten des Mail Server eingeben.

Menüpunkt oben „Manage Instance“, in „Manage Instance“ „Instance Settings“ wählen, Reiter „Email auswählen“

 Apex Instance Mail Settings

Nach dem Eintragen der Mail Server Konfiguration, kann über den „Password vergessen“ Dialog beim Login in Apex mit einem existierenden normalen User (NICHT den Admin User des Internal Workspaces nehmen!) getestet werden, ob der Mail Versandt funktioniert.

Nach dem Anfordern eines neuen Passworts per Mail, wieder an den „INTERNAL“ Workspace anmelden , Menüpunkt „Monitor Activity“, Auf „Monitor Activity“ „Mail Log“ auswählen und prüfen, ob die Mail versandt wurde.

Wenn hier nichts zu finden ist über „Manage Instance“ „Mail Queue“ die Mail Queue prüfen.

In der Apex Mail Queue sollte keine Mails mehr stehen, falls doch ist meist das Problem die fehlende / falsche ACL: Access Control List.

 Apex Mail Queue ACL fehler

Der Fehler ist meist ein:

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

Je nach DB Version 11g oder 12c muss nun das Rechte das Netzwerk der Datenbank zu verwenden an Apex gegranted werden.

Die ACL nun für den Mail Server passend (Server Name/IP Adresse + Port ) anlegen und mit „Send all Mail“ prüfen ob es dann auch klappt. (siehe weiter unten für die jeweilige DB die ACL Routinen als Beispiel).

Diese Rechte setzen und mit „Force send All Mail“ einen erneuten Versandt antriggern.

Mit einer aktiven TLS/SSL Mail Konfiguration erhalten ich allerdings gleich mal den nächsten Fehler:

ORA-29024: Certificate validation failure
Hier darauf achten, das NUR und NUR die „Root Certifikat Chain“ in der Wallet sein darf! NICHT das eigentliche Zertifikat der Gegenstelle!

Mailversandt per TLS/SSL - "ORA-29024: Certificate validation failure" beheben

Hier muss nun eine Oracle Wallet in der mit dem Root Zertifikaten des Mail Servers hinterlegt werden

Siehe dazu:

Also eine Oracle Wallet anlegen, zum Beispiel in „D:\oracle\wallet\ und in den Apex „Instance Settings“ in der Wallet Section hinterlegen.

Das Zertifikat des Mail Servers darf NICHT in der Wallet hinterlegt werden, wir brauchen aber die „Root Chain“ hinter diesem Zertifikat!

Zertifikat auslesen mit Python

Siehe dazu https://support.google.com/a/answer/6180220

Die beschriebene Python Lösung funktioniert allerdings mit Python 3.4 nicht, daher so abgefragt:

#see https://support.google.com/a/answer/6180220
 
import smtplib
import ssl
 
connection = smtplib.SMTP() 
connection.connect('mail.your-server.de')
connection._host = 'mail.your-server.de'
connection.ehlo()
connection.starttls()
 
print( ssl.DER_cert_to_PEM_cert(connection.sock.getpeercert(binary_form=True)))

Nach einigen Ausprobieren mit den Zertifikaten habe ich dann erkennen müssen, das wir das aber nur brauchen, um die Zertifikat Kette rückwärts zu analysieren!

Auslesen mit openssl unter Linux

openssl s_client -showcerts -mail.your-server.de:456 </dev/null 2>/dev/null|openssl x509 -outform PEM > mymail.pem

Zertifikat hinterlegen

Jetzt das eigentliche Zertifikat NICHT im Wallet hinterlegen,

Nur die Root Chain Zertifikate entwender als Text in der Wallet als „Geschütztes Zertifkat“ hinterlegt:

 Oracle Wallet Zertifikat hinterlegen

Wallet Location in Apex hinterlegen

Die Wallet Location und das Passwort wird in Apex hinterlegt, Apex „Instance Settings“ Reiter „Wallet“

 Wallet in Apex 5 Settings hinterlegen

Auf den gesetzen Hacken bei „Check to confirm that you wish to change the wallet password“ achten!

Fehlersuche

Klappt aber nicht so wie gewünscht …. immer noch der gleiche Fehler.

Wie kann nun der Fehler analysiert werden????

Password nicht hinterlegt

Die Apex Parameter prüfen, ob das Password auch wirklich hinterlegt ist:

CONNECT / AS sysdba
 
SELECT  APEX_INSTANCE_ADMIN.GET_PARAMETER('WALLET_PATH') AS WALLET_PATH
       , APEX_INSTANCE_ADMIN.GET_PARAMETER('WALLET_PWD') AS WALLET_PWD
 FROM DUAL
 /

Beim ersten Mal war das Passwort leer, erst wenn in der Apex Admin Maske der Hacken für das Passwort gesetzt wird, wird auch mit diesen Befehlt das Passwort angezeigt!

Security BUG? Das Password wird in Klarschrift angezeigt!

Der nächste Fehler ist nun ein „ORA-28759: failure to open file“

Wallet aus der DB mit UTL_HTTP Aufrufen:

DECLARE
    lo_req  UTL_HTTP.req;
    lo_resp UTL_HTTP.resp;
 BEGIN
    UTL_HTTP.SET_WALLET ('file:D:\oracle\wallet','mywalletpwd');
    lo_req := UTL_HTTP.begin_request('https://www.pipperr.de/');
    lo_resp := UTL_HTTP.get_response(lo_req);
    dbms_output.put_line(lo_resp.status_code);
   UTL_HTTP.end_response(lo_resp);
END;
 
ERROR at line 1:
ORA-29273: HTTP request failed
ORA-28759: failure TO OPEN file

Als nächstes prüfen, ob die Lese Rechte auf der Wallet zum User der DB passen unter dem die Oracle Instance läuft!

Unter Windows läuft ja der Oracle Prozess unter einen anderen User, in meine Fall unter „oracle_admin“, das Wallet wurde aber unter meinen User anlegt, dann klappt das nicht!

Rechte für oracle_admin vergeben, und schon kann das Wallet gelesen werden!

ORA-29024: Certificate validation failure

Nun kann die Wallet geöffnet werden, es klappt allerdings immer noch nicht, jetzt aber ein anderer Fehler:

SELECT UTL_HTTP.REQUEST('https://www.pipperr.de',NULL,'file:D:\oracle\wallet','mywalletpwd') FROM DUAL;
 
ORA-29273: HTTP request failed
ORA-29024: Certificate validation failure

Test Case erzeugt einen „ORA-29024: Certificate validation failure“ siehe dazu unter 12c auch UTL_HTTP Fails With ORA-29024 After Importing WebServer's Certificate into the Oracle Wallet (Doc ID 1682823.1), obwohl meine Websithe TLS 1.2 anbietet.

siehe auch https://oracle-base.com/articles/misc/utl_http-and-ssl

Teste jetzt mal mit Google Mail, erhalten aber wieder einen Zertifikatsfehler obwohl das Zertifikat hinterlegt ist:

DECLARE
	c UTL_SMTP.connection;
BEGIN
	c := UTL_SMTP.open_connection(
		  host => 'smtp.gmail.com'
		, port => 465
		, wallet_path => 'file:D:\oracle\wallet'
		, wallet_password => 'mywalletpwd'
		, secure_connection_before_smtp => TRUE);
	UTL_SMTP.starttls(c);
END;
/
ERROR AT line 1:
ORA-29024: Certificate validation failure

Wallet per Kommandozeile auslesen:

orapki wallet display -wallet D:\oracle\wallet\
..
Subject:        CN=smtp.gmail.com,O=Google Inc,L=Mountain View,ST=California,C=US

Zertifikat ist da!

Es könnte aber auch daran liegen das die ganze Kette eines Zertifikates abgebildet werden muss, also Root CA usw. auch importieren!

Root CA Zertifikate importieren

Als erstes Google ausprobiert und alle 3 Zertifikaten nacheinander in die Wallet geladen, mit UTL_HTTP testet, das funktioniert!

Mit pipperr.de ist es aber immer noch der gleiche Fehler ….

Es stimmt also etwas mit den Zertifikaten nicht!

Im nächsten Schritt alle Zertifikate aus der Wallet entfernt und mit Chrome die Zertifikate als pb7 und inkl. der ganzen Kette exportiert.

Den Export per Kommando Zeile eingefügt:

orapki wallet add -wallet d:\oracle\wallet -trusted_cert -cert D:\wiki\apex\pipperr.de.p7b -pwd mywalletpwd

Wieder getestet, leider immer noch kein Erfolg.

Im nächsten Schritt NUR die beiden Root Zertifikate in der Wallet belassen, die Wallet speichern UND in SQL*Plus NEUE Session starten!

Es geht !!!!!

Nur die Root CA Zertifikate dürfen importiert werden! Nicht das eigentliche Zertifikat der Gegenstelle verwenden!

Die Suche nach diesem Problem hat mich einen ganzen Nachmittag gekostet … was für ein Mist……

Support:



ACL einrichten in 12g

Auf den richtigen Port achten, bin mir ist SSL/TLS unter dem Port 465 zu ereichen.

    BEGIN
        DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
            host => '<my_mailserver_ip>'
            ,  lower_port => 465
            ,  upper_port => 465
            ,ace  => xs$ace_type(privilege_list => xs$name_list('connect'),
                               principal_name => 'apex_050000',
                               principal_type => xs_acl.ptype_db));
    END;
    /

siehe auch https://docs.oracle.com/database/121/DBSEG/fine_grained_access.htm#DBSEG40012

Siehe dazu „Oracle Application Express Application Builder User's Guide → Managing Application Security“


ACL einrichten in 11g

ACL anlegen:

BEGIN
  dbms_network_acl_admin.create_acl (
      acl         => 'utl_mail.xml'
    , description => 'Allow mail to be send'
    , principal   => 'apex_050000'
    , is_grant    => TRUE
    , privilege   => 'connect'
    );
    COMMIT;
END;

Privileg hinzufügen:

--add privileges like the ‘resolve’ privilege:
BEGIN
 dbms_network_acl_admin.add_privilege (
   acl       => 'utl_mail.xml'
  , principal => 'apex_050000'
  , is_grant  => TRUE
  , privilege => 'resolve'
  );
  COMMIT;
END;

ACL Zuordnen auf den Name/IP Adresse des eigentlichen Mail Servers:

BEGIN
  dbms_network_acl_admin.assign_acl(
     acl  => 'utl_mail.xml'
   , host => '<my_smtp_sever>'
  );
  COMMIT;
END;


f

Relay für Localhost Konfiguration

Script um die ACL's zu überwachen

Siehe auch unter https://github.com/gpipperr/OraPowerShell/blob/master/Ora_SQLPlus_SQLcL_sql_scripts/acl.sql

--===============================================================================
-- GPI - Gunther Pippèrr
--http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_networkacl_adm.htm#CHDJFJFF
--http://www.oracle.com/webfolder/technetwork/de/community/dbadmin/tipps/acl/index.html
--http://www.oracleflash.com/36/Oracle-11g-Access-Control-List-for-External-Network-Services.html
--http://www.oracle-base.com/articles/11g/fine-grained-access-to-network-services-11gr1.php
--===============================================================================

set linesize 130 pagesize 300 

column acl       format a40 heading "ACL"
column host      format a30
column principal format a16
column privilege format a10
column is_grant  format a8
column lower_port format a12 heading "Lower Port"
column upper_port format a12 heading "Upper Port"

set lines 1000

select acl
     ,  host
     ,  to_char (lower_port) lower_port
     ,  to_char (upper_port) upper_port
  from DBA_NETWORK_ACLS
/

select acl
     ,  principal
     ,  privilege
     ,  is_grant
  from DBA_NETWORK_ACL_PRIVILEGES
/


-- from https://docs.oracle.com/database/121/ARPLS/d_networkacl_adm.htm#ARPLS67214
select host
       , lower_port
	   , upper_port
	   , ace_order
	   , principal
	   , principal_type
	   , grant_type
	   , inverted_principal
	   , privilege
	   , start_date
	   , end_date
  from (select aces.*,
dbms_network_acl_utility.contains_host('*',
                                                      host) precedence
          from dba_host_aces aces)
 where precedence is not null
 order by precedence desc,
          lower_port nulls last,
          upper_port nulls last,
          ace_order;
/
/*
 test entry:
 
 BEGIN
  DBMS_NETWORK_ACL_ADMIN.create_acl (
    acl          => 'my_test_acl.xml', 
    description  => 'A test of the ACL functionality',
    principal    => 'GPI',
    is_grant     => TRUE, 
    privilege    => 'connect');   
     
    DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(
        acl       => 'my_test_acl.xml',
      principal => 'GPI',
      is_grant  => true,
      privilege => 'resolve');
        
  COMMIT;
END;
/

begin
-- the I can all
 DBMS_NETWORK_ACL_ADMIN.assign_acl (
    acl         => 'my_test_acl.xml',
    host        => '*', 
    lower_port  => 1,
    upper_port  => 9999); 

-- ony one server     
 DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL(
    acl  => 'my_test_acl.xml',
   host => 'www-proxy.us.oracle.com');

COMMIT;

end;
/     

-- delete one acl
begin
 DBMS_NETWORK_ACL_ADMIN.UNASSIGN_ACL (
     acl         => 'localhost-permissions.xml',
    host        => 'pbupcb1.pbprd.lprz.com', 
    lower_port  => 9080,     
    upper_port  => 9080)
     ; 
end;
/        

declare
   l_url   varchar2 (50)
      := 'http://www.goggle.de;
  l_http_request   UTL_HTTP.req;
  l_http_response  UTL_HTTP.resp;
BEGIN
  -- Make a HTTP request and get the response.
  l_http_request  := UTL_HTTP.begin_request(l_url);
  l_http_response := UTL_HTTP.get_response(l_http_request);  
  UTL_HTTP.end_response(l_http_response);
END;
/


*/

.


Quellen

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
"Autor: Gunther Pipperr"
prog/apex_mail_acl.txt · Zuletzt geändert: 2019/10/27 10:23 von Gunther Pippèrr