Pages

Friday 12 October 2012

Κλήση του ΓΓΠΣ (gsis) HTTPS (SSL) web service, μη φυσικών προσώπων, με Oracle Apex

Τα παρακάτω βήματα έγιναν με επιτυχία σε Oracle 11g (11.2.0.2.0) database , σε Oracle linux , με APEX 4.1.0.00.32  (έτοιμο configuration της βάσης στο Virtual machine του vbox : "Oracle developer days"):

Προφανώς πρέπει να επιβεβαιώσουμε, πρώτα, ότι ο server που έχει τη βάση και το APEX επικοινωνεί με το internet και το https url του web service χωρίς πρόβλημα καλώντας από browser το:
https://www.gsis.gr/wsnp/RgWsBasStoixN_version2.wsdl

Σύνδεση στο apex στο internal workspace (default user: admin):     http://localhost:8888/apex/f?p=4550:1

Δημιουργήστε ένα νέο workspace π.χ dev1 (δημιουργώντας, με το wizard, και τον αντίστοιχο database user e.g. gsis)

Δίνουμε τα κατάλληλα δικαιώματα στη βάση και το χρήστη για να επικοινωνούν με τον έξω κόσμο.

    BEGIN
      DBMS_NETWORK_ACL_ADMIN.CREATE_ACL('local-access-users.xml',
                 'ACL that lets power users to connect to everywhere',   'GSIS', TRUE, 'connect');
      DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('local-access-users.xml','*');

     COMMIT; --μην το ξεχνάτε
    end;

    BEGIN
      DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl       => 'local-access-users.xml',
                                           principal => 'APEX_040100',
                                           is_grant  => true,
                                           privilege => 'resolve');
      COMMIT;
    END;
    /

    BEGIN
      DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE(acl       => 'local-access-users.xml',
                                           principal => 'APEX_040100',
                                           is_grant  => true,
                                           privilege => 'connect');
       commit;
    END;
    /

Δοκιμάζουμε την επικοινωνία του apex με ένα απλό http web service:
    Επιλέγουμε στο apex το application που δημιουργήσαμε νωρίτερα
    Επιλέγουμε το application και πατήστε Shared Components
    Επιλέγουμε Web Service References
    Πατάμε Create
    Based on WSDL -> Next
    search a UDDI registry to find the WSDL? : ΝΟ   -> Next
    WSDL Location: http://www.oracle-base.com/webservices/server.php?wsdl -> Create reference (για το συγκεκριμένο δε χρειάζεται να φτιάξετε ξεχωριστή φόρμα/report)
    Επιλέγουμε ξανά Web Service References . Προσοχή , επιλέξτε report view για να δείτε τη λίστα με τα service references.
    Στο Reference που μόλις δημιουργήσαμε , πατάμε το εικονίδιο στη στήλη "Test"
    Select operation "ws_add" -> Δώστε τους αριθμούς -> Πατήστε "Τεστ " και δείτε την απάντηση του web service

Επειδή το web service της ΓΓΠΣ χρειάζεται https, θα πρέπει να ρυθμίσουμε το apex να χρησιμοποιεί το oracle wallet ακολουθώντας τα παρακάτω βήματα:

    Δημιουργία wallet και self-signed πιστοποιητικών για τον server srv01, χρησιμοποιώντας τον oracle wallet manager από το home της βάσης ως εξής:
    owm
    Δημιουργία wallet και αποθήκευση στο  /home/oracle/pzwallet
    Έστω password: wallpass1
    Κατεβάζουμε το CA's Certificate file from  https://www.gsis.gr/wsnp/RgWsBasStoixN_version2.wsdl χρησιμοποιώντας τον firefox browser και αποθηκεύοντάς το ως x509 certificate with chain (PKCS#7):
        click the button to the left of the URL -> More information. On the Security tab, click view certificate, go to the details tab, click export
        αποθήκευση στο αρχείο:
            /home/oracle/pzwallet/gsis_with_chain.cert
   Προσοχή: για τη σωστή επικοινωνία το wallet, θα πρέπει να περιέχει όλη την αλυσίδα πιστοποιητικών της σελίδας που θα καλέσουμε
    Import της αλυσίδας πιστοποιητικών:
        Ανοίγετε το wallet που δημιουργήσατε παραπάνω στο /home/oracle/pzwallet
        Right click : Trusted Certificates -> Import Trusted Certificate -> Select the file gsis_with_chain.cert
        Αποθήκευση
    Θα πρέπει να έχουν προστεθεί 3 trusted certificates στο wallet
    Τα ίδια βήματα θα πρέπει να κάνουμε και για τα certificates από το url https://www1.gsis.gr/wsgsis/RgWsBasStoixN/RgWsBasStoixNSoapHttpPort
        Τα αποθηκεύουμε σε 2 αρχεία στο /home/oracle/pz_wallet/: 
            VeriSignClass3InternationalServerCA-G3_pkcs7 και www1.gsis.gr_single_pkcs7
        Import τα δύο αυτά πιστοποιητικά στο wallet  (μπορεί να χρειαστεί να κλείσετε και να ξανανοίξετε το wallet)
        Αποθήκευση

    Ένας πρώτος έλεγχος που θα πρέπει να επιστρέψει το xml του web service:
        select utl_http.request('https://www.gsis.gr/wsnp/RgWsBasStoixN_version2.wsdl', NULL,'file:/home/oracle/pzwallet','wallpass1') from dual; 

Ρύθμιση του wallet στο apex:

    Login στο internal workspace
    Manage service -> Instance settings
    Wallet path: file:/home/oracle/pzwallet
    password: wallpass1
    Apply
    Επανεκκίνηση βάσης (όχι απαραίτητο)

Δημιουργία self signed πιστοποιητικού:
$ORACLE_HOME/bin/orapki wallet add -wallet /home/oracle/pzwallet -dn "CN=localhost.localdomain,C=GR" -keysize 1024 -self_signed -validity 3650 -pwd wallpass1          

Δημιουργούμε το αντίστοιχο web reference στο apex :
    Επιλέγουμε στο apex το application που δημιουργήσαμε νωρίτερα  και πατάμε Shared Components
    Επιλέγουμε Web Service References
    Πατάμε Create
    Based on WSDL -> Next
    search a UDDI registry to find the WSDL? : ΝΟ   -> Next
    WSDL Location: https://www.gsis.gr/wsnp/RgWsBasStoixN_version2.wsdl -> Create reference (για το συγκεκριμένο δε χρειάζεται να φτιάξετε ξεχωριστή φόρμα/report)
    Επιλέγουμε ξανά Web Service References . Προσοχή , επιλέξτε report view για να δείτε τη λίστα με τα service references.
    Στο Reference που μόλις δημιουργήσαμε , πατάμε το εικονίδιο στη στήλη "Test"
    Select operation "rgWsBasStoixNVersionInfo" -> Πατήστε "Τεστ " και δείτε την απάντηση του web service              

Προσοχή: το πιο συχνό λάθος που θα συναντήσετε καλώντας το web service από το APEX είναι:
The WSDL document was unretrievable because either the URL you supplied was invalid, your environment requires a valid proxy server address for HTTP requests and you have not defined one for this application, or a wallet needs to be configured for this instance of Application Express for HTTPS requests
Στο 99% των περιπτώσεων , ο λόγος είναι είτε ότι δεν έχουν δοθεί τα κατάλληλα δικαιώματα (με τις εντολές: DBMS_NETWORK_ACL_ADMIN.CREATE_ACL) είτε το wallet δεν έχει φτιαχτεί σωστά (π.χ. με τα κατάλληλα certificates)

          
Αναφορές:

http://www.oracle-base.com/articles/misc/utl_http-and-ssl.php
http://www.oracle-base.com/articles/11g/fine-grained-access-to-network-services-11gr1.php
https://forums.oracle.com/forums/thread.jspa?threadID=2383087