==== Oracle SQL*Net - SSL - Secure Sockets Layer - für SQL*Net aktivieren =====
Ziel ist es, eine SQL*Net Verbindung zur Datenbank über das [[http://de.wikipedia.org/wiki/Transport_Layer_Security|SSL 3.1 (Bzw. das TLS 1.0 Protokoll)]] auf einem Windows System für einen 11g R2 Datenbank einzurichten.
Übersicht genereller Ablauf:
* Eine Wallet auf dem Client und dem Server mit dem Programm "orapki" erstellen
* Root Zertifikat für je für Client und Server erzeugen
* Zertifikate zwischen Client und Server Wallet jeweils austauschen
* "sqlnet.ora" Listener Konfiguration auf der Server Seite
* "sqlnet.ora" Client Konfiguration
* Test und Debuggen
Im Anschluss wird das Zertifkat kann auch das Zertifikat im Store im Microsoft Betriebsystem abgelegt werden (How To Configure SSL for Client Authentication And Encryption Using Microsoft Certificate Store (MCS) (Doc ID 2188562.1))
----
===Lizenz===
**11g**
Siehe Lizenz Dokument => https://docs.oracle.com/cd/E11882_01/license.112/e47877.pdf
Laut diesen Dokument ist für die SSL Konfiguration benötigte Wallet keine Bestandteil von ASO mehr.
Für SSL Verschlüsselung bei Datenbank Links wird auch die ASO Option nicht mehr benötigt.
Folgender Satz (Auf Seite 23 ) sagt dann wohl aus das die ASO Optionen nicht benötigt wird:
..
Network encryption (native network encryption and SSL/TLS) and strong authentication services (Kerberos, PKI, and RADIUS) are no longer part of Oracle Advanced Security and are available in all licensed editions of all supported releases of the Oracle database
..
**12c**
Siehe => https://docs.oracle.com/database/121/DBLIC/editions.htm#DBLIC109
Laut diesen Dokument ist die SSL Verschlüsselung in allen Editionen der Datenbank im Standard enthalten.
----
====Eine Wallet auf dem Client und dem Server mit "orapki" erstellen und konfigurieren====
=== Auf dem Server die Server Wallet konfigurieren===
Die Konfiguration erfolgt in einer Dos Shell, leider gibt es mit den Übergabe Parametern in einer Powershell ein kleines Problem.
Verzeichnis für die Wallet anlegen:
mkdir d:\oracle\server_wallet
Wallet anlegen:
d:\oracle\wallet
REM Oracle Umgebung und Pfade setzen!
set ORACLE_HOME=D:\oracle\product\11.2.0.3\dbhome_1
set PATH=%ORACLE_HOME%\bin;%PATH%
orapki wallet create -wallet d:\oracle\server_wallet -auto_login -pwd SSLConfig2015Server
D:\oracle>dir /b d:\oracle\server_wallet
cwallet.sso
ewallet.p12
Da nur unser eigenes und das vom Client verwendet werden soll. die bestehenden Zertifikate entfernen:
orapki wallet remove -wallet d:\oracle\server_wallet -trusted_cert_all -pwd SSLConfig2015Server
orapki wallet display -wallet D:\oracle\server_wallet
Ein selbstsigniertes Zertifikat mit einer Gültigikeit von 5 Jahren anlegen
Beschreibung des Zertifikates:
- CN => Common Name des Zertifkates (bei einer Website wäre das die Domain, hier frei wählbar, z.b. der DB Server Name)
- OU => Organizational Unit (Abteilung)
- O => Organization (Firma)
- C => Country (Land)
- L => Locality(Stadt)
- S => State (Bundesland)
orapki wallet add -wallet d:\oracle\server_wallet -dn "CN=gpi_dbserver01,O=gpiconsult;OU=DBA_Department,C=DE,S=Bavaria,L=Munich" -keysize 1024 -self_signed -validity 1825 -pwd SSLConfig2015Server
!In der Powershell gibt es ein Problem mit der Übergabe der Parameter für den "dn" Parameter!
Anzeigen lassen:
orapki wallet display -wallet D:\oracle\server_wallet
..
Requested Certificates:
User Certificates:
Subject: CN=gpi_dbserver01,O=gpiconsult,OU=DBA_Department,C=DE,ST=Bavaria,L=Munich
Trusted Certificates:
Subject: CN=gpi_dbserver01,O=gpiconsult,OU=DBA_Department,C=DE,ST=Bavaria,L=Munich
..
Root Zertifikat exportieren (wird später dann wieder in die Client Wallet importiert:
orapki wallet export -wallet d:\oracle\server_wallet -dn "CN=gpi_dbserver01,O=gpiconsult,OU=DBA_Department,C=DE,ST=Bavaria,L=Munich" -cert d:\oracle\server_wallet\gpi_dbserver01.cert -pwd SSLConfig2015Server
===Client konfigurieren===
Nun auf dem Client eine eigene Wallet anlegen und dort auch das Zertifikat des Servers importieren:
REM anlegen
mkdir d:\oracle\client_wallet
cd d:\oracle\client_wallet
orapki wallet create -wallet d:\oracle\client_wallet -auto_login -pwd SSLConfig2015Client
dir
..
01.05.2015 17:59 3.589 cwallet.sso
01.05.2015 17:59 3.512 ewallet.p12
..
REM Alle default Zertifikate entfernen
orapki wallet remove -wallet d:\oracle\client_wallet -trusted_cert_all -pwd SSLConfig2015Client
REM Neues Zertifikat für den client anlegen
orapki wallet add -wallet d:\oracle\client_wallet -dn "CN=gpi_dbaclient,O=gpiconsult,OU=DBA_Department,C=DE,ST=Bavaria,L=Munich" -keysize 1024 -self_signed -validity 1825 -pwd SSLConfig2015Client
orapki wallet display -wallet D:\oracle\client_wallet
..
Requested Certificates:
User Certificates:
Subject: CN=gpi_dbaclient,O=gpiconsult,OU=DBA_Department,C=DE,ST=Bavaria,L=Munich
Trusted Certificates:
Subject: CN=gpi_dbaclient,O=gpiconsult,OU=DBA_Department,C=DE,ST=Bavaria,L=Munich
..
REM Client Zertifikat exportieren
orapki wallet export -wallet d:\oracle\client_wallet -dn "CN=gpi_dbaclient,O=gpiconsult,OU=DBA_Department,C=DE,ST=Bavaria,L=Munich" -cert d:\oracle\client_wallet\gpi_client.cert -pwd SSLConfig2015Client
Das Server Zertifikat nun auf in die Client Wallet importieren:
orapki wallet add -wallet d:\oracle\client_wallet -trusted_cert -cert d:\oracle\server_wallet\gpi_dbserver01.cert -pwd SSLConfig2015Client
REM pürfen
orapki wallet display -wallet D:\oracle\client_wallet
..
User Certificates:
User Certificates:
Subject: CN=gpi_dbaclient,O=gpiconsult,OU=DBA_Department,C=DE,ST=Bavaria,L=Munich
Trusted Certificates:
Subject: CN=gpi_dbserver01,O=gpiconsult,OU=DBA_Department,C=DE,ST=Bavaria,L=Munich
Subject: CN=gpi_dbaclient,O=gpiconsult,OU=DBA_Department,C=DE,ST=Bavaria,L=Munich
...
Das Client Zertifikat nun auf in die Server Wallet importieren:
orapki wallet add -wallet d:\oracle\server_wallet -trusted_cert -cert d:\oracle\client_wallet\gpi_client.cert -pwd SSLConfig2015Server
REM prüfen
orapki wallet display -wallet D:\oracle\server_wallet
..
Requested Certificates:
User Certificates:
Subject: CN=gpi_dbserver01,O=gpiconsult,OU=DBA_Department,C=DE,ST=Bavaria,L=Munich
Trusted Certificates:
Subject: CN=gpi_dbserver01,O=gpiconsult,OU=DBA_Department,C=DE,ST=Bavaria,L=Munich
Subject: CN=gpi_dbaclient,O=gpiconsult,OU=DBA_Department,C=DE,ST=Bavaria,L=Munich
...
==== Den Oracle Listener konfigurieren ====
Überprüfen welche "sqlnet.ora" und listener.ora in Verwendung ist:
lsnrctl status LISTENER
..
Parameterdatei des Listener D:\oracle\product\11.2.0.3\dbhome_1\network\admin\listener.ora
...
Port für die SSL Kommunikation und Pfad zur Wallet angeben, dazu die Parameter Datei "listener.ora" öffnen, SSL Listener Port definieren und Pfad zur Wallet hinterlegen:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.1)(PORT = 1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = 10.10.10.1)(PORT = 1522))
)
)
..
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = D:\oracle\server_wallet)
)
)
..
Serverseitige "sqlnet.ora" anpassen (liegt parallel zur "listener.ora"!):
SQLNET.AUTHENTICATION_SERVICES= (NTS,BEQ,TCPS)
#use the TLS 1.0 (SSL 3.1)
SSL_VERSION = 1.0
SSL_CLIENT_AUTHENTICATION = TRUE
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = D:\oracle\wallet)
)
)
In einer administrativen Session den Listener neu starten bzw. die Konfiguration neu einlesen:
# Oracle Umgebung setzen
lsnrctl reload
==== Client konfigurieren ====
"sqlnet.ora" des Clients lokalisieren:
tnsping oragpi
...
Parameterdateien benutzt:
D:\oracle\TNS_ADMIN\sqlnet.ora
...
sqlnet.ora anpassen:
SQLNET.AUTHENTICATION_SERVICES= (NTS,BEQ, TCPS)
SSL_CLIENT_AUTHENTICATION = TRUE
#use the TLS 1.0 (SSL 3.1)
SSL_VERSION = 1.0
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = D:\oracle\client_wallet)
)
)
Tnsnames Eintrag für SSL Port in der tnsnames.ora eintragen:
oragpiSSL=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCPS)(HOST = 10.10.10.1)(PORT = 1522))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = GPI)
)
)
Wallet über den Oracle Wallet Manager prüfen:
Aufrufen unter Windows mit:
D:\oracle\product\11.2.0.3\dbhome_1\bin\launch.exe "D:\oracle\product\11.2.0.3\dbhome_1\bin" owm.cl
Pfad zur Wallet angeben und mit Password öffnen und überprüfen:
{{ :dba:oracle_ssl_wallet_manager_v01.png?400 | Oracle Wallet Manager}}
==== Test ====
Tnsping Test:
tnsping oragpiSSL
...
Verbindungsversuch mit (DESCRIPTION = (ADDRESS = (PROTOCOL = TCPS)(HOST = 10.10.10.1)(PORT = 1522)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME
= GPI)))
OK (30 ms)
An der DB anmelden und das Protokoll überpürfen:
sqlplus system@oragpiSSL
select SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') as connect_protocol from dual;
CONNECT_PROTOCOL
-------------------
tcps
=== SSL überprüfen ===
Zwar nicht dafür vorgesehen, ein paar Erkenntnisse können aber gewonnen werden
SSLyze - Fast and full-featured SSL scanner => https://github.com/nabla-c0d3/sslyze
D:\tools\sslyze> .\sslyze.exe --regular 10.10.10.1:1522
..
SCAN RESULTS FOR 10.10.10.1:1522 - 10.10.10.1:1522
--------------------------------------------------
Unhandled exception when processing --reneg:
nassl.SslClient.ClientCertificateRequested - Server requested a client certificate issued by one of the following CAs: '/L=Munich/ST=Bavaria/C=DE/OU=D
BA_Department/O=gpiconsult/CN=gpi_dbaclient', '/L=Munich/ST=Bavaria/C=DE/OU=DBA_Department/O=gpiconsult/CN=gpi_dbserver01'.
* Deflate Compression:
OK - Compression disabled
* OpenSSL Heartbleed:
OK - Not vulnerable to Heartbleed
* Certificate - Content:
SHA1 Fingerprint: 52f628163195f7089d7c131ce9753cd3b93d7473
Common Name: gpi_dbserver01
Issuer: gpi_dbserver01
Serial Number: 00
Not Before: May 2 13:01:00 2015 GMT
Not After: Apr 30 13:01:00 2020 GMT
Signature Algorithm: md5WithRSAEncryption
Key Size: 1024 bit
Exponent: 65537 (0x10001)
* Certificate - Trust:
Hostname Validation: FAILED - Certificate does NOT match 10.10.10.1
"Mozilla NSS - 08/2014" CA Store: FAILED - Certificate is NOT Trusted: self signed certificate
"Microsoft - 08/2014" CA Store: FAILED - Certificate is NOT Trusted: self signed certificate
"Apple - OS X 10.9.4" CA Store: FAILED - Certificate is NOT Trusted: self signed certificate
"Java 6 - Update 65" CA Store: FAILED - Certificate is NOT Trusted: self signed certificate
Certificate Chain Received: ['gpi_dbserver01']
....
==Openssl verwenden==
Mit zum Beispiel Cygwin und openssl mit **"openssl s_client -connect 10.10.10.1:1522"** die SSL Konfiguration abfragen:
$ openssl s_client -connect 10.10.10.1:1522
CONNECTED(00000003)
depth=0 L = Munich, ST = Bavaria, C = DE, OU = DBA_Department, O = gpiconsult, C N = gpi_dbserver01
verify error:num=18:self signed certificate
verify return:1
depth=0 L = Munich, ST = Bavaria, C = DE, OU = DBA_Department, O = gpiconsult, C N = gpi_dbserver01
verify return:1
2283200:error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate: s3_pkt.c:1293:SSL alert number 42
2283200:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c: 184:
---
Certificate chain
0 s:/L=Munich/ST=Bavaria/C=DE/OU=DBA_Department/O=gpiconsult/CN=gpi_dbserver01
i:/L=Munich/ST=Bavaria/C=DE/OU=DBA_Department/O=gpiconsult/CN=gpi_dbserver01
---
Server certificate
-----BEGIN CERTIFICATE-----
MIICXTCCAcYCAQAwDQYJKoZIhvcNAQEEBQAwdzEPMA0GA1UEBxMGTXVuaWNoMRAw
DgYDVQQIEwdCYXZhcmlhMQswCQYDVQQGEwJERTEXMBUGA1UECwwOREJBX0RlcGFy
dG1lbnQxEzARBgNVBAoTCmdwaWNvbnN1bHQxFzAVBgNVBAMMDmdwaV9kYnNlcnZl
cjAxMB4XDTE1MDUwMjEzMDEwMFoXDTIwMDQzMDEzMDEwMFowdzEPMA0GA1UEBxMG
TXVuaWNoMRAwDgYDVQQIEwdCYXZhcmlhMQswCQYDVQQGEwJERTEXMBUGA1UECwwO
REJBX0RlcGFydG1lbnQxEzARBgNVBAoTCmdwaWNvbnN1bHQxFzAVBgNVBAMMDmdw
aV9kYnNlcnZlcjAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCsCUkpb1YY
G+2qOzVk/cPdltuLTHV3SBr8VttfhnikzvkQeqyaYBs6xVfhUGLv3yl48Zr+xzhl
rV30mhbevribOywvbACelhAkr8WaujFhUpYGxd7fXD5CgBjb4C+v2rLjbK7wGZKI
u2icnD9XxtcryENqo5MmlUx3uL5i0WF1vQIDAQABMA0GCSqGSIb3DQEBBAUAA4GB
AE2LlIBd7MK6x/oJQbJwzFSOiAlyqWP04+72IIGa6xEPNsF9iuLSCVMuIJPT0ViJ
6LIx0Bxq9YdA9ezL4KSJaQLrkgUwPWUK8b2XEkZYcL2AfyLFA8GEzgTIYIB7Hrxz
A+0S1NWh5aPmyqdaiJ/fCWDYknMMLyEZ7YPfjcosHi8O
-----END CERTIFICATE-----
subject=/L=Munich/ST=Bavaria/C=DE/OU=DBA_Department/O=gpiconsult/CN=gpi_dbserver 01
issuer=/L=Munich/ST=Bavaria/C=DE/OU=DBA_Department/O=gpiconsult/CN=gpi_dbserver0 1
---
Acceptable client certificate CA names
/L=Munich/ST=Bavaria/C=DE/OU=DBA_Department/O=gpiconsult/CN=gpi_dbserver01
/L=Munich/ST=Bavaria/C=DE/OU=DBA_Department/O=gpiconsult/CN=gpi_dbaclient
---
SSL handshake has read 952 bytes and written 210 bytes
---
New, TLSv1/SSLv3, Cipher is AES256-SHA
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : AES256-SHA
Session-ID:
Session-ID-ctx:
Master-Key: 021CDA7443650F220AE391FEAAF3F8016C5EB5B8E22882BDCCCC1BD111D39516 16C5CB0C305DB8CD63EBE33CB54AC538
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1431974375
Timeout : 300 (sec)
Verify return code: 18 (self signed certificate)
---
====Fehlersuche====
Trace einschalten siehe [[dba:sqlnet_trace|Übersicht SQL*Net Probleme]]
==TNS-12560 TNS: Fehler bei Protokolladapter==
Auf den richtigen Wert für das TNS Protokoll achten => 1.0 TNS 0 = SSL!
Parameter SSL_VERSION in der sqlnet.ora!
==ORA-28759: Fehler beim Öffnen von Datei==
Wallet nicht gefunden, Wallet Pfad in der sqlnet.ora überprüfen, Leserechte prüfen
==ORA-29024: Zertifikatvalidierung nicht erfolgreich==
Zertifikat des Listeners auf dem Server ist nicht auf dem Client hinterlegt!
==ORA-28864: SSL-Verbindung ordnungsgemäß getrennt==
Allte Wallet war noch in der listner.ora konfiguriert, damit passten die Zertifikate nicht. Pfade anpassen und Listener neu starten.
==ORA-12541 No Listener ==
see => Client Connections Using TCPS Through a Firewall Fail with ORA-12541 (Doc ID 180424.1)
Firewall überprüfen!
==ORA-12696: Doppelte Verschl³sselung aktiviert, Anmeldung nicht zulõssig==
Parameter für Symetrische Verschlüsselung waren aktiv!
siehe => [[dba:sql_net_security|Das SQL*Net Protokoll mit einer symmetrischen Verschlüsselung wie DES / AES oder RC4 schützen]]
Die Checksum Parameter können allerdings verwendet werden.
===SQL in Trace aber immer noch erkennbar!===
Die SSL Option verschlüsselt auf einem tieferen Protokollebene als die symmetrische Verschlüsselung, daher bleiben die SQL Statements bei einem Trace mit Level 16 sichtbar!
----
==== Quellen ====
Dokumentation:
* http://docs.oracle.com/cd/B10501_01/network.920/a96573/asossl.htm
Support:
* Oracle Support Document 1240824.1 (The Impact of the Sqlnet Settings on Database Security (sqlnet.ora Security Parameters and Wallet Location)
* How to Enable the Usage of TLS 1.0 (SSL 3.1) in SSL Authentication/Encryption? (Doc ID 1521031.1
* Configuring SSL for Client Authentication and Encryption With Self Signed Certificates On Both Ends Using orapki (Doc ID 401251.1)
* How To Configure SSL for Client Authentication And Encryption Using Microsoft Certificate Store (MCS) (Doc ID 2188562.1)
JDBC
* End To End Examples of using SSL With Oracle's JDBC THIN Driver (Doc ID 762286.1)
* Minimal Configuration for encryption-only SSL using JDBC/thin (Doc ID 1124286.1)
Dataguard:
* How To Enable SSL Encryption For Data Guard Redo Transport? (Doc ID 1143443.1)
Mehr dazu auch im Netz:
* http://www.orafaq.com/wiki/Network_Encryption
* http://oracle-base.com/articles/10g/secure-external-password-store-10gr2.php
* http://www.em-dba.com/emblog04.html
* https://spotonoracle.wordpress.com/2014/08/25/defeating-ora-12696-double-encryption-turned-on-tricking-the-envs/
Über TLS Verschlüsselung:
* Technische Richtlinie TR-02102-2 - Kryptographische Verfahren: Empfehlungen und Schlüssellängen Teil 2 – Verwendung von Transport Layer Security (TLS)
* https://www.bsi.bund.de/SharedDocs/Downloads/DE/BSI/Publikationen/TechnischeRichtlinien/TR02102/BSI-TR-02102-2_pdf.pdf?__blob=publicationFile