Logo Oracle Deutschland   Deutschsprachige APEX und PL/SQL Community

Application Express und HTTPS: Nie wieder "Certificate Validation Error"

Erscheinungsmonat APEX-Version Datenbankversion
Juni 2017 alle alle

Die Artikelreihe zum Thema "Application Express und REST Services" pausiert für eine Ausgabe - dafür schieben wir einen Tipp ein, der zumindest mit dem Thema verwandt ist. Es geht HTTPS(!)-Requests einer APEX-Anwendung. Zunächst funktioniert ein solcher ganz genauso wie ein HTTP-Aufruf - man verwendet einfach die HTTPS-URL. Zum Testen nehmen wir die HTTPS-URL des USGS (US Geological Survey), die bereits im ersten Community Tipp zum Thema REST Services und Application Express ein Thema war.

select apex_web_service.make_rest_request(
    p_url         => 'https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_day.geojson', 
    p_http_method => 'GET' ) from dual;

Der erste Versuch schlägt jedoch fast immer fehl ...

Fehlerbericht -
ORA-29273: HTTP-Anforderung nicht erfolgreich
ORA-29024: Zertifikatvalidierung nicht erfolgreich
ORA-06512: in "SYS.UTL_HTTP", Zeile 380

Blogs und Diskussionsforen sind voll von Fragen, was bei dieser Fehlermeldung ("Certificate Validation Error") zu tun ist - in diesem Tipp erfahren Sie es: Die Fehlermeldung besagt, dass die Datenbank das SSL-Zertifikat, mit dem sich der Webserver ausgewiesen hat, nicht validieren konnte. Für diese Validierung muss ein Oracle Wallet eingerichtet und dann in Application Express konfiguriert werden. Vorab jedoch ein paar einfache, erklärende Worte zum Thema SSL-Zertifikate (die Erklärungen sind sicherlich nicht vollständig, für das Verständnis dieses Tipps sollten sie jedoch hinreichend sein):

Wenn Sie eine HTTPS-Verbindung zu einem Server aufbauen, weist dieser sich mit einem SSL-Zertifikat aus. Ein solches Zertifikat funktioniert wie eine Art Personalausweis: es weist aus, dass der Server, der auf die Anfrage antwortet, tatsächlich der ist, den man mit der URL angesprochen hat.

Nun stellt sich natürlich die Frage, ob ein solcher "Ausweis" auch echt ist - und diese Echtheit wird von der Certificate Authority zertifiziert: das SSL-Zertifikat des Webservers wird mit einem Zertifikat der CA "unterschrieben". Das Zertifikat der CA kann nun wiederum von einer weiteren CA "unterschrieben" werden - womit das nächste Zertifikat ins Spiel kommt. Diese Kette (Certificate Chain) kann auch noch länger werden; irgendwo muss aber ein Ende sein - und das ist ein CA-Zertifikat, dem einfach vertraut wird, auch wenn es nicht "unterschrieben" ist (Trusted Certificate).

In einem Web-Browser wie Firefox, Chrome oder anderen sind alle gängigen CA-Zertifikate vorinstalliert - so kann man bequem im Internet surfen. Die Oracle-Datenbank verwaltet solche Zertifikate in einem Wallet - dieses muss jedoch zuerst erzeugt werden, es ist zu Beginn leer und die nötigen CA-Certifikate müssen hinzugefügt werden.

Um ein Wallet zu konfigurieren, brauchen Sie Zugang zum Dateisystem des Datenbankservers - auf Ihrem persönlichen Entwicklungsrechner ist das normalerweise kein Problem; auf der Produktionsdatenbank braucht es die Hilfe des Datenbankadministrators. Loggen Sie sich also auf dem Datenbankserver ein und erzeugen Sie das Wallet mit dem Utility orapki (welches Teil der Datenbank-Software ist).

$ orapki
Oracle PKI Tool : Version 12.2.0.1.0
Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.

orapki [crl|wallet|cert|help] <-nologo> <-jsafe>

Erzeugen Sie ein (vorerst leeres) Wallet wie folgt.

$ orapki wallet create -wallet https_wallet -pwd ****** -auto_login
Oracle PKI Tool : Version 12.2.0.1.0
Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.

Operation is successfully completed.

Nun sollte in dem Verzeichnis, in dem Sie orapki gestartet haben, ein Unterverzeichnis namens https_wallet vorhanden sein.

$ ls 
https_wallet 
$ ls https_wallet/
cwallet.sso  cwallet.sso.lck  ewallet.p12  ewallet.p12.lck

Navigieren Sie nun mit einem Webbrowser (hier wurde der Firefox verwendet) zu der HTTPS-Adresse, die Sie mit APEX_WEB_SERVICE oder UTL_HTTP ansprechen möchten. Die Zertifikate können Sie ansehen, indem Sie das kleine Schloß, welches links neben der Adressleiste zu sehen ist, anklicken. Klicken Sie sich dann, wie in den folgenden Abbildungen gezeigt, bis zu den Informationen zum SSL-Zertifikat durch.

SSL-Informationen im Browser betrachten: Beispiel Firefox - 1
SSL-Informationen im Browser betrachten: Beispiel Firefox - 2
SSL-Informationen im Browser betrachten: Beispiel Firefox - 3
SSL-Informationen im Browser betrachten: Beispiel Firefox - 4

Abbildung 1: SSL-Informationen im Browser betrachten: Beispiel Firefox

Im letzten Dialog sehen Sie oben die Certificate Chain. Das Zertifikat von earthquake.usgs.gov wurde unterschrieben mit einem Zertifikat von Symantec; dessen Zertifikat wurde wiederum unterschrieben von der Verisign Class 3 Public Primary Certification Authority. Letzterer vertraut der Firefox Browser, es wird also nicht mehr geprüft, von wem dieses Zertifikat unterschrieben wurde.

Um die Seite earthquake.usgs.gov also mit APEX_WEB_SERVICE oder UTL_HTTP aufrufen zu können, muss das Zertifikat der Verisign Class 3 Public Primary Certification Authority in das Oracle Wallet als Trusted Certificate geladen werden. Mit dem Firefox-Browser können Sie das Zertifikat auch gleich in eine Datei zu exportieren. Klicken Sie dazu einfach im Dialog mit der Certificate Chain das oberste Zertifikat der Verisign Class 3 Public Primary Certification Authority, und dann unten links auf die Schaltfläche Exportieren. Legen Sie die Datei (VeriSignClass3PublicPrimaryCertificationAuthority-G5.crt) dann auf ihrem lokalen Rechner ab und transportieren Sie sie auf den Datenbankserver, wo Sie das Wallet mit dem Utility orapki bearbeiten.

CA Zertifikat auf die lokale Festplatte herunterladen - am Beispiel Firefox - 1
CA Zertifikat auf die lokale Festplatte herunterladen - am Beispiel Firefox - 2

Abbildung 2: CA Zertifikat auf die lokale Festplatte herunterladen - am Beispiel Firefox

Nun können Sie das Zertifikat mit orapki in Ihr Wallet einfügen.

$ orapki wallet add -wallet https_wallet 
                    -cert VeriSignClass3PublicPrimaryCertificationAuthority-G5.crt 
                    -trusted_cert 
                    -pwd ******
Oracle PKI Tool : Version 12.2.0.1.0
Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.

Operation is successfully completed.

Nun sollte die Datenbank in der Lage sein, dass SSL-Zertifikat von earthquake.usgs.gov zu validieren. Bevor wir das Wallet zentral in APEX konfigurieren und damit für alle verfügbar machen, lohnt sich jedoch noch ein kurzer Test in SQL*Plus: Beim Aufruf von APEX_WEB_SERVICE.MAKE_REST_REQUEST können Sie den Pfad zu einem Wallet als Parameter P_WALLET_PATH angeben.

select apex_web_service.make_rest_request(
    p_url         => 'https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_day.geojson', 
    p_http_method => 'GET',
    p_wallet_path => 'file:///path/to/directory/https_wallet' ) from dual;

APEX_WEB_SERVICE.MAKE_REST_REQUEST('HTTPS://EARTHQUAKE.USGS.GOV/EARTHQUAKES/FEED
--------------------------------------------------------------------------------
{"type":"FeatureCollection","metadata":{"generated":1496331042000,"url":"https:/
/earthquake.usgs.gov/earthquakes/feed/v1.0/summary/2.5_day.geojson","title":"USG
S Magnitude 2.5+ Earthquakes, Past Day","status":200,"api":"1.5.7","count":15},"
features":[{"type":"Feature","properties":{"mag":3.18,"place":"27km WSW of Westm
:

Wenn dieser Test erfolgreich ist, macht es Sinn, das Wallet in den Application Express Instance Settings einzurichten. Damit steht es für alle APEX-Workspaces zur Verfügung und es muss bei Verwendung von APEX_WEB_SERVICE oder anderen PL/SQL Paketen nicht mehr eigens angegeben werden.

Loggen Sie sich dazu als APEX-Administrator am Workspace INTERNAL ein und navigieren Sie zu den Instance Settings.

Workspace INTERNAL - Instance Settings

Abbildung 3: Workspace INTERNAL - Instance Settings

Navigieren Sie zum Abschnitt Wallet und tragen Sie bei Wallet Path den Pfad zum Verzeichnis https_wallet auf dem Datenbankserver ein; mit dem Präfix file://, genauso wie beim Test oben.

Das Verzeichnis "https_wallet" wird als Wallet Path in Application Express eingerichtet

Abbildung 4: Das Verzeichnis "https_wallet" wird als Wallet Path in Application Express eingerichtet

Wenn Sie, für andere HTTPS-Server, weitere CA-Zertifikate brauchen, fügen Sie diese einfach dem bestehenden Wallet hinzu - als Beispiel nehmen wir die Github API (api.github.com).

begin
    apex_web_service.g_request_headers( 1 ).name  := 'User-Agent';
    apex_web_service.g_request_headers( 1 ).value := 'Application Express';
end;
/

select apex_web_service.make_rest_request(
    p_url         => 'https://api.github.com/',
    p_http_method => 'GET' ) from dual;

Fehlerbericht -
ORA-29273: HTTP-Anforderung nicht erfolgreich
ORA-29024: Zertifikatvalidierung nicht erfolgreich

Gehen Sie nun wieder, wie bereits beschrieben vor: Öffnen Sie die Seite im Firefox Browser, lassen Sie sich die Zertifikatsinformationen anzeigen und exportieren Sie das CA Certifikat auf der obersten Ebene der Certificate Chain.

Root Zertifikat für Github.com exportieren

Abbildung 5: Root Zertifikat für Github.com exportieren

Die Datei DigiCertHighAssuranceEVRootCA.crt importieren Sie dann wieder in das schon existierende Wallet.

$ orapki wallet add -wallet https_wallet 
                    -cert /apex_install/DigiCertHighAssuranceEVRootCA.crt 
                    -trusted_cert 
                    -pwd ******
Oracle PKI Tool : Version 12.2.0.1.0
Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.

Operation is successfully completed.

Wenn Sie mit SQL*Plus testen, loggen Sie sich kurz ein und wieder aus - denn die Datenbank liest die Wallet-Dateien nur einmal pro Session.

begin
    apex_web_service.g_request_headers( 1 ).name  := 'User-Agent';
    apex_web_service.g_request_headers( 1 ).value := 'Application Express';
end;
/

select apex_web_service.make_rest_request(
    p_url         => 'https://api.github.com/',
    p_http_method => 'GET' ) as response from dual;


RESPONSE
--------------------------------------------------------------------------------
{"current_user_url":"https://api.github.com/user","current_user_authorizations_h

Auf diese Art und Weise lassen sich nahezu alle HTTPS-Server iom Intra- oder Internet ansprechen. Auch HTTPS-Server mit self-signed certificates, die auf Entwicklungs- oder Testsystemen gerne eingesetzt werden, sind so kein Problem mehr. Bei einem self-signed certificate ist keine Certificate Authority im Spiel - das Zertifikat unterschreibt sich quasi selbst. Wenn Sie eine solche Seite mit dem Browser (die folgenden Bildschirmfotos wurden mit Firefox gemacht) aufrufen, bekommen Sie eine Warnung angezeigt, etwa wie in Abbildung 6.

Der Browser warnt for Webseiten, die ein self-signed certificate verwenden

Abbildung 6: Der Browser warnt for Webseiten, die ein self-signed certificate verwenden

Klicken Sie auf die Schaltfläche Add Exception (bei anderen Browsern sollte es eine ähnliche geben). Daraufhin sollten Sie einen Dialog mit Details, wie in Abbildung 7, sehen.

Details zur Webseite mit dem self-signed certificate

Abbildung 7: Details zur Webseite mit dem self-signed certificate

Ein Klick auf Confirm Security Exception wäre die Anweisung an den Browser, diesem Zertifikat zu vertrauen und den Zugriff auf die Webseite fortzusetzen. Wir wollen aber mit der Datenbank und Application Express zugreifen. Also klicken Sie die Schaltfläche View, um zum Zertifikat selbst zu gelangen (Abbildung 8). Diesen Dialog kennen Sie schon: Mit der Schaltfläche Export laden Sie das Zertifikat auf Ihren Rechner herunter.

Das selbst unterschriebene Zertifikat kann von hier aus exportiert werden

Abbildung 8: Das selbst unterschriebene Zertifikat kann von hier aus exportiert werden

Danach fügen Sie die heruntergeladene Datei mit dem Werkzeug orapki zum bestehenden Wallet hinzu.

$ orapki wallet add -wallet https_wallet 
                    -cert /apex_install/serverwithselfsignedcert.crt 
                    -trusted_cert 
                    -pwd ******
Oracle PKI Tool : Version 12.2.0.1.0
Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.

Operation is successfully completed.

Diese Schritte müssen Sie für jeden Webserver mit einem selbst unterschriebenen Zertifikat, auf den Sie mit der Datenbank und Application Express zugreifen möchten, durchführen. Bei größeren Systemen empfiehlt es sich sicherlich, für die Verwaltung des Wallets einen definierten Prozess einzurichten, so dass ...

  • ... Entwickler wissen, wie Sie erreichen oder beantragen können, dass neue Zertifikate aufgenommen werden.
  • ... abgelaufene CA-Zertifikate entfernt und durch neue ersetzt werden.
  • ... das Wallet auf allen Datenbanken bereitgestellt und eingerichtet wird.

zurück zur Community-Seite