Wallet, Oracle
- Wallet Status
- orapki: Wallet Actions
- orapki: Cert Actions
- Wallet Config Sessions: Standard | RAC 12.1 | RAC 19c
- show_html_from_url()
Overview
An Oracle Wallet is a password-protected container used to store authentication and signing credentials including: private keys, certificates and trusted certificates needed by SSL.
Configuring a full blown Oracle Wallet with a Master Key as done for TDE requires the Wallet to be open before the database opens. If just using the Wallet for certs it can be implemented in a safer more concise way as shown in these instructions.
Wallet Essential Info
A Wallet generally consists of two types of files:
- Encryption wallet file (ewallet.p12).
- Auto-open wallet file (cwallet.sso).
Default Location: Standard Database
$ORACLE_BASE/admin/<global_db_name>/wallet Example: /u01/app/oracle/admin/oradb/wallet If this directory does not exist or ORACLE_BASE is not set, the default location is:
$ORACLE_HOME/admin/<global_db_name>/wallet
Default Location: RAC Database (node)
<oracle_home>/<global_db_name>/wallet 19c Example: /u01/app/oracle/product/19.3.0.0.0/dbhome_1/admin/oradb/wallet 12.1 Example: /u01/app/oracle/product/12.1.0.2/dbhome_1/admin/oradb/wallet
12.1 path is completely unusable though! See RAC 12.1 Usage Session for practical example. Use an NFS path for 12.1 RAC nodes.
Wallet Directory and Files
oracle> pwd /u01/app/oracle/admin/oradb/wallet oracle> ll -rw------- 1 oracle oinstall 2885 Mar 9 2016 cwallet.sso -rw-rw-rw- 1 oracle oinstall 0 Mar 9 2016 cwallet.sso.lck -rw------- 1 oracle asmadmin 2840 Mar 9 2016 ewallet.p12 -rw-rw-rw- 1 oracle oinstall 0 Mar 9 2016 ewallet.p12.lck
When specifying -auto_login
the file "cwallet.sso" is generated.
orapki wallet display -wallet /u01/app/oracle/admin/oradb/wallet Requested Certificates: User Certificates: Oracle Secret Store entries: ORACLE.SECURITY.DB.ENCRYPTION.AduttmuRJk+Xv7d2xQc7xEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ORACLE.SECURITY.DB.ENCRYPTION.MASTERKEY ORACLE.SECURITY.KB.ENCRYPTION. Trusted Certificates: Subject: CN=ny.abc.local
Change oradb with your ORACLE_SID.
Wallet Status: SQL
COL wrl_type FORMAT a12 COL wrl_parameter FORMAT a35 COL status FORMAT a15 COL wallet_type FORMAT a15 SELECT wrl_type,wrl_parameter,status,wallet_type FROM v$encryption_wallet;
For RAC: SELECT inst_id,wrl_type,wrl_parameter,status,wallet_type FROM gv$encryption_wallet;
Unconfigured Example WRL_TYPE WRL_PARAMETER STATUS WALLET_TYPE WALLET_OR FULLY_BAC CON_ID -------- ---------------------------------- ------------- ----------- ------- --------- ------ FILE /u01/app/oracle/admin/oradb/wallet NOT_AVAILABLE UNKNOWN SINGLE UNDEFINED 0 Configured Example: Master Key Not Created (but wallet and certs created) WRL_TYPE WRL_PARAMETER STATUS WALLET_TYPE WALLET_OR FULLY_BAC CON_ID -------- ---------------------------------- ------------------ ----------- ------- --------- ------ FILE /u01/app/oracle/admin/oradb/wallet OPEN_NO_MASTER_KEY UNKNOWN SINGLE UNDEFINED 0 Configured Example: Master Key Created WRL_TYPE WRL_PARAMETER STATUS WALLET_TYPE WALLET_OR FULLY_BAC CON_ID -------- ---------------------------------- ------------- ----------- ------- --------- ------ FILE /u01/app/oracle/admin/oradb/wallet OPEN PASSWORD SINGLE NO 0
If changes made make sure to open a new SQLPLus session to see acccurate\current values.
orapki: Wallet Actions
Change as required for your environment.
-- Create Wallet orapki wallet create -wallet <FullPath> -pwd <password> -auto_login -- Delete Wallet orapki wallet delete -wallet <FullPath> -trusted_cert_all -pwd <password> You may need to use the Oracle Wallet Manager: 1. Run: owm & 2. From menu choose: Wallet 🠊 Open. 2. Select Yes to use your path: /u01/app/oracle/admin/oradb/wallet 3. From menu choose: Wallet 🠊 Delete (enter password) 4. Clean up any files as needed in /u01/app/oracle/admin/oradb/wallet. Note above is NOT using any environment vars. Does not work with them! After you bounce database v$encryption_wallet NOT_AVAILABLE will show. -- Change Wallet Password orapki wallet change_pwd -wallet <FullPath> If you are using a wallet with auto login enabled, you must regenerate the auto login wallet after changing the password. orapki wallet create -wallet <FullPath> -auto_login
Do NOT use environment vars for the <FullPath>.
orapki: Cert Actions
-- Add Cert orapki wallet add -wallet <FullPath>/<MyCert.cer> -trusted_cert -cert "<MyCert.cer>" -pwd <password> -- Remove Cert orapki wallet remove -wallet <FullPath>/<MyCert.cer> -trusted_cert -cert "<MyCert.cer>" -pwd <password> -- Display Cert orapki cert display -cert <FullPath>/<MyCert.cer>
- Do NOT use environment vars for the <FullPath>.
- View complete cert via: orapki cert display -cert <Path>/redhat.cer -complete
Wallet Config Session: Standard DB
Create show_html_from_url()
Script here.
Test Non-SSL URL
SET SERVEROUTPUT ON EXEC show_html_from_url('http://oracledba.help/');
Note the HTML is displayed.
Test SSL URL
SET SERVEROUTPUT ON EXEC show_html_from_url('https://www.redhat.com/'); ORA-29273: HTTP request failed ORA-29024: Certificate validation failure ORA-06512: at "SYS.SHOW_HTML_FROM_URL", line 33
Note Oracle errors displayed (expected at this point).
New Database Baseline (No Wallet Configured Yet)
COL wrl_type FORMAT a12 COL wrl_parameter FORMAT a35 COL status FORMAT a15 COL wallet_type FORMAT a15 SELECT wrl_type,wrl_parameter,status,wallet_type FROM v$encryption_wallet; WRL_TYPE WRL_PARAMETER STATUS WALLET_TYPE ------------ ----------------------------------- ---------------- ----------- FILE /u01/app/oracle/admin/oradb/wallet NOT_AVAILABLE UNKNOWN
Note: default wallet dir: /u01/app/oracle/admin/$ORACLE_SID/wallet
Create Wallet
orapki wallet create -wallet /u01/app/oracle/admin/oradb/wallet -pwd MyStrongPw! -auto_login Using -auto_login allows you to use NULL when accessing URL via utl_http.request(). -- Note Wallet Dir Created cd /u01/app/oracle/admin/$ORACLE_SID/wallet ls -l -rw------- 1 oracle oinstall 120 Feb 10 10:02 cwallet.sso -rw-rw-rw- 1 oracle oinstall 0 Feb 10 10:02 cwallet.sso.lck -rw------- 1 oracle oinstall 75 Feb 10 10:02 ewallet.p12 -rw-rw-rw- 1 oracle oinstall 0 Feb 10 10:02 ewallet.p12.lck -- Note v$encryption_wallet Status SELECT wrl_type,wrl_parameter,status,wallet_type FROM v$encryption_wallet; WRL_TYPE WRL_PARAMETER STATUS WALLET_TYPE ------------ ----------------------------------- ---------------- ----------- FILE /u01/app/oracle/admin/oradb/wallet OPEN_NO_MASTER_KEY UNKNOWN
Get Cert
🠊🠊🠊 This must be done from the Oracle database server itself. 🠈🠈🠈
Using FireFox: 1. Go to: https://www.redhat.com 2. Click Lock icon 🠊 Show connection Details 🠊 More Information 3. [View Certificate] 🠊 Details 4. Select item at top of Certificate Hierachy (ex: DigiCert High Assurance EV Root CA). 5. Select [Export] 6. Save to your wallet dir: /u01/app/oracle/admin/oradb/wallet/redhat.cer [X.509 Certificate (PEM)] should already be selected. 7. [Save] 🠊 [Close]
Add Cert
orapki wallet add -wallet /u01/app/oracle/admin/oradb/wallet -trusted_cert -cert "/u01/app/oracle/admin/oradb/wallet/redhat.cer" -pwd MyStrongPw! orapki cert display -cert /u01/app/oracle/admin/oradb/wallet/redhat.cer Subject: CN=DigiCert High Assurance EV Root CA,OU=www.digicert.com... Issuer: CN=DigiCert High Assurance EV Root CA,OU=www.digicert.com... Valid Until: Sun Nov 09 19:00:00 EST 2031
Test Cert
SET SERVEROUTPUT ON EXEC UTL_HTTP.set_wallet('file:/u01/app/oracle/admin/oradb/wallet', 'MyStrongPw!'); EXEC show_html_from_url('https://www.redhat.com/'); -- If -AutoLogin Used COL https FORMAT a150 SELECT utl_http.request('https://www.redhat.com/', NULL, 'file:/u01/app/oracle/admin/oradb/wallet',NULL ) as "HTTPS" from dual; -- If -AutoLogin Not Used SELECT utl_http.request('https://www.redhat.com/', NULL, 'file:/u01/app/oracle/admin/oradb/wallet','MyStrongPw!' ) as "HTTPS" from dual;
Note the HTML from secure site (https) is now displayed.
Wallet Config Session: RAC 19c DB
19c RAC Wallet Default Path
/u01/app/oracle/product/19.3.0.0.0/dbhome_1/admin/oradb/wallet
Get Baseline gv$encryption_wallet (no wallet configured)
COL inst_id FORMAT 999 HEAD 'Inst' COL wrl_type FORMAT a12 COL wrl_parameter FORMAT a35 COL status FORMAT a15 COL wallet_type FORMAT a15 SELECT inst_id,wrl_type,wrl_parameter,status,wallet_type FROM gv$encryption_wallet;
Create Wallet (On All Nodes)
orapki wallet create -wallet /u01/app/oracle/product/19.3.0.0.0/dbhome_1/admin/oradb/wallet
-pwd MyStrongPw! -auto_login
Operation is successfully completed.
QC (via gv$encryption_wallet)
Inst WRL_TYPE WRL_PARAMETER STATUS WALLET_TYPE ---- ------------ ----------------------------------- --------------- --------------- 2 FILE /u01/app/oracle/product/19.3.0.0.0/ OPEN_NO_MASTER_ UNKNOWN dbhome_1/admin/oradb/wallet KEY 1 FILE /u01/app/oracle/product/19.3.0.0.0/ OPEN_NO_MASTER_ UNKNOWN dbhome_1/admin/oradb/wallet KEY
Export or Copy Cert (On All Nodes)
Copy or Export To: /u01/app/oracle/product/19.3.0.0.0/dbhome_1/admin/oradb/wallet/redhat.cer ls -l /u01/app/oracle/product/19.3.0.0.0/dbhome_1/admin/oradb/wallet/redhat.cer
Add Cert (On All Nodes)
orapki wallet add -wallet /u01/app/oracle/product/19.3.0.0.0/dbhome_1/admin/oradb/wallet
-trusted_cert
-cert "/u01/app/oracle/product/19.3.0.0.0/dbhome_1/admin/oradb/wallet/redhat.cer"
-pwd MyStrongPw!
Operation is successfully completed.
orapki cert display
-cert /u01/app/oracle/product/19.3.0.0.0/dbhome_1/admin/oradb/wallet/redhat.cer
Test (From All Nodes and RAC SCAN)
SET SERVEROUTPUT ON EXEC UTL_HTTP.set_wallet('file:/u01/app/oracle/product/19.3.0.0.0/dbhome_1/admin/oradb/wallet', 'MyStrongPw!'); EXEC show_html_from_url('https://www.redhat.com/'); COL https FORMAT a150 SELECT utl_http.request ('https://www.redhat.com/', NULL, 'file:/u01/app/oracle/product/19.3.0.0.0/dbhome_1/admin/oradb/wallet',NULL) as "HTTPS" from dual;
Wallet Config Session: RAC 12.1 DB
Reguardless of what is on the Internet, I have only been able to get a 12.1 Wallet based cert working from an NFS mounted volume in RAC environments. Myriad attempts to create local and\or in ASM did not work for me.
As a result, the example here uses an NFS mounted volume (/u03) from all nodes. The Wallet path works great with correctly mounted NFS volumes.
In 19c you can simply create it on each node generally as you would non-RAC. See 19c RAC Config Session.
NFS Client Config (from Node 1)
su - mkdir -p /u03/admin/wallets/oradb cd /u03 chown oracle:oinstall /u03/admin chown oracle:oinstall /u03/admin/wallets chown oracle:oinstall /u03/admin/wallets/oradb su - oracle touch /u03/admin/wallets/oradb/test.txt
sqlnet.ora (on all nodes)
Configure sqlnet.ora with your NFS path as shown here.
Configure Wallet (from Node1)
su - oracle
cp /media/sf_sw/xfer/redhat.cer /u03/admin/wallets/oradb/
orapki wallet create -wallet /u03/admin/wallets/oradb -pwd MyStrongPw! -auto_login
orapki wallet add -wallet /u03/admin/wallets/oradb -trusted_cert
-cert "/u03/admin/wallets/oradb/redhat.cer" -pwd MyStrongPw!
orapki cert display -cert /u03/admin/wallets/oradb/redhat.cer
QC (on all nodes)
SET SERVEROUTPUT ON SELECT utl_http.request('https://www.redhat.com/', NULL,'file:/u03/admin/wallets/oradb','MyStrongPw!') as "HTTPS" from dual; -- Oracle Wallet Mgr owm & Open /u03/admin/wallets/oradb -- orapki orapki wallet display -wallet /u03/admin/wallets/oradb -- gv$encryption_wallet COL inst_id FORMAT 999 HEAD 'Inst' COL wrl_type FORMAT a12 COL wrl_parameter FORMAT a35 COL status FORMAT a15 COL wallet_type FORMAT a15 SELECT inst_id,wrl_type,wrl_parameter,status,wallet_type FROM gv$encryption_wallet; Inst WRL_TYPE WRL_PARAMETER STATUS WALLET_TYPE ---- ------------ ----------------------------------- --------------- --------------- 2 FILE /u03/admin/wallets/oradb/ CLOSED UNKNOWN 1 FILE /u03/admin/wallets/oradb/ CLOSED UNKNOWN
Error: If NFS Volume Not Mounted
ERROR at line 1: ORA-29273: HTTP request failed ORA-28759: failure to open file ORA-06512: at "SYS.UTL_HTTP", line 1491 ORA-06512: at line 1
show_html_from_url()
CREATE OR REPLACE PROCEDURE show_html_from_url ( p_url IN VARCHAR2, p_username IN VARCHAR2 DEFAULT NULL, p_password IN VARCHAR2 DEFAULT NULL ) AS l_http_request UTL_HTTP.req; l_http_response UTL_HTTP.resp; l_text VARCHAR2(32767); BEGIN -- Make a HTTP request and get the response. l_http_request := UTL_HTTP.begin_request(p_url); -- Use basic authentication if required. IF p_username IS NOT NULL and p_password IS NOT NULL THEN UTL_HTTP.set_authentication(l_http_request, p_username, p_password); END IF; l_http_response := UTL_HTTP.get_response(l_http_request); -- Loop through the response. BEGIN LOOP UTL_HTTP.read_text(l_http_response, l_text, 32766); DBMS_OUTPUT.put_line (l_text); END LOOP; EXCEPTION WHEN UTL_HTTP.end_of_body THEN UTL_HTTP.end_response(l_http_response); END; EXCEPTION WHEN OTHERS THEN UTL_HTTP.end_response(l_http_response); RAISE; END show_html_from_url; /
Create Master Key
alter system set encryption key identified by "MyStrongPw!"; Note files in dir updated: /u01/app/oracle/admin/oradb/wallet -- Note v$encryption_wallet Status SELECT wrl_type,wrl_parameter,status,wallet_type FROM v$encryption_wallet; WRL_TYPE WRL_PARAMETER STATUS WALLET_TYPE ------------ ----------------------------------- ---------------- --------- FILE /u01/app/oracle/admin/oradb/wallet OPEN PASSWORD
sqlnet.ora
If you do not use the default Wallet path you must make the following
sqlnet.ora entry that has the full path to your wallet directory.
ENCRYPTION_WALLET_LOCATION= (SOURCE= (METHOD=FILE) (METHOD_DATA= (DIRECTORY=/u03/admin/wallets/oradb) ) )
- Change /u03/admin/wallets/oradb as required for your environment.
- Do not include any environment variables, i.e. use the full path.
- Ensure there is no forward slash at the end of the DIRECTORY value.
Neglecting to do this will reult in the folowing error:
ORA-28368: cannot auto-create wallet when setting the key.
Oracle Wallet Manager (OWM)
To run, logged in as the oracle user execute: oracle> $ORACLE_HOME/bin/owm
You can use the Oracle Wallet Manager (OWM) to perform the following tasks:
- Creating wallets.
- Generating certificate requests.
- Opening wallets to access PKI-based services.
- Saving credentials to hardware security modules.
- Upload\download wallets to an LDAP directory.
- Importing third-party PKCS #12 -format wallets.
References
- Quick TDE Setup and FAQ (Doc ID 1251597.1).
- morganslibrary
- How to Remove Trusted Certificate From Oracle Wallet (Doc ID 2257925.1).
- oraclenext.com
- Fails To Open / Create The Wallet: ORA-28353 (Doc ID 395252.1)
- Certs Usage
- Oracle 19c Docs Page
- Burleson
- Docs: 1 | 2 | 3
- To disable TDE go here.
The encryption wallet is the one recommended for TDE. It needs to be opened manually after database startup and prior to TDE encrypted data being accessed. Because data is encrypted in REDO logs, UNDO and TEMP tablespaces, the TDE master encryption key needs to be available to the database before it is opened. For TDE Wallet requirements go here.