==== 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