Configuration of TCP/IP with SSL and TLS for Database Connections

สิ่งที่ต้องเตรียม

  1. Oracle Database Server ในตัวอย่างนี้ใช้ Oracle database บน Oracle Enterprise Linux 7
  2. Oracle Database Client  ในตัวอย่างใช้ Windows Server 2008 R2

เริ่ม

  • ฝั่ง Server
  • เข้าระบบด้วยบัญชีผู้ใช้ oracle หรือบัญชีที่เป็นเจ้าของ Oracle Database
  • เปิด terminal สร้าง Oracle Wallet ด้วยคำสั่ง
    • mkdir -p /u01/app/oracle/wallet

  • ต่อด้วย
    • orapki wallet create -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 -auto_login_local

    • โดย -pwd WalletPasswd123 ตัว WalletPasswd123 คือรหัสผ่านที่ใช้ป้องกันการเข้าถึงข้อมูลต่างๆ ใน wallet กฎการตั้งมีอยู่คือ ยาวอย่างน้อย 8 ตัวอักษร ไม่จำกัดความยาว จำเป็นต้องตั้งให้ตัวเลขผสมตัวอักษร
  • สร้าง Certificate และใส่เข้าไปใน wallet ด้วยคำสั่ง
    • orapki wallet add -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 \
      -dn "CN=`hostname`" -keysize 1024 -self_signed -validity 3650

  • ตรวจสอบด้วยคำสั่ง
    • orapki wallet display -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123

  • ได้ผลลัพธ์ประมาณ
    • Oracle PKI Tool : Version 12.1.0.2
      Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved.

      Requested Certificates:
      User Certificates:
      Subject: CN=reis.psu.ac.th
      Trusted Certificates:
      Subject: CN=reis.psu.ac.th

  • Export Certificate เพื่อนำไปใช้กับเครื่อง Oracle Client ด้วยคำสั่ง
    • orapki wallet export -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 \
      -dn "CN=`hostname`" -cert /tmp/server-certificate.crt

  • ตรวจสอบแฟ้มที่ export ไปด้วยคำสั่ง
    • cat /tmp/server-certificate.crt

  • ได้ผลลัพธ์ประมาณว่า
    • -----BEGIN CERTIFICATE-----
      MIIBoTCCAQoCAQAwDQYJKoZIhvcNAQEEBQAwGTEXMBUGA1UEAxMOcmVpcy5wc3UuYWMudGgwHhcN
      MTgwMTA5MDcyNTA2WhcNMjgwMTA3MDcyNTA2WjAZMRcwFQYDVQQDEw5yZWlzLnBzdS5hYy50aDCB
      nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAj4x2/NviDaTlXuEJt0kZARY5fHiT2SiVX+a18hai
      I0stoUhKKefjOCgB85iuqjIk0rvcGXI0KXkbenTy2t40A+qGxB04mBhCLKaKeIe67BZKR6Zyw1dd
      oaesoaWChC01b+IW1X5WWtC53UxpIZQ4Zktj41sLGUnarIr9+9HFwncCAwEAATANBgkqhkiG9w0B
      AQQFAAOBgQAqSCF2Y8uyM4rSQHUC8MKEl3Ia3NJKnigMOUzDc2fP7grSaoeuQ4NvIntTD+s+IT5Y
      EpLVND4kSHFTwGRq0Py/ig8ybXZCXfHtvNZh7ZGziL/sYt5/8xYi/tOBKwVanBTUaseKIMovtmd7
      UyoOKrX8YBoFsB3UPRLudmFsksXRXw==
      -----END CERTIFICATE-----

  • ฝั่ง Client
  • เข้าระบบด้วยบัญชีผู้ใช้ administrator
  • เปิด cmd แล้วสร้าง wallet ด้วยคำสั่ง
    • mkdir c:\app\oracle\wallet

สร้าง Certificate ด้วยคำสั่ง

    • orapki wallet add -wallet "c:\app\oracle\wallet" -pwd WalletPasswd123 -dn "CN=%computername%" -keysize 1024 -self_signed -validity 3650

    • โดย WalletPasswd123 คือพาสเวิร์ดที่ใช้ล็อค wallet ไม่จำเป็นต้องเหมือนกับของ Server
  • ตรวจสอบด้วยคำสั่ง
    • orapki wallet display -wallet "c:\app\oracle\wallet" -pwd WalletPasswd123

  • ได้ผลลัพธ์ประมาณว่า
    • Oracle PKI Tool : Version 12.2.0.1.0
      Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.

      Requested Certificates:
      User Certificates:
      Subject: CN=ENERAZAN
      Trusted Certificates:
      Subject: CN=ENERAZAN

  • Export Certificate เพื่อนำไปใช้กับเครื่อง Oracle Database Server ด้วยคำสั่ง
    • orapki wallet export -wallet "c:\app\oracle\wallet" -pwd WalletPasswd123 -dn "CN=%computername%" -cert c:\client-certificate.crt

  • ตรวจสอบแฟ้มที่ export ไปด้วยคำสั่ง
    • more c:\client-certificate.crt
  • ได้ผลลัพธ์ประมาณว่า
    • -----BEGIN CERTIFICATE-----MIIBmTCCAQICAQAwDQYJKoZIhvcNAQEEBQAwEzERMA8GA1UEAxMIRU5FUkFaQU4wIhgPMDE1NTAxMDkwNzMzNDlaGA8wMTQ1MDEwNzA3MzM0OVowEzERMA8GA1UEAxMIRU5FUkFaQU4wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJHEEnB4kiI82QVyt0/GlrILF9dwd/jVRlgCQkLmLrpF6RKrIUntzvygyVhtTybeaShH751gYvtl1NFxDUWkBnfS5u2DN6ATP2WpNQgGM/skPWZOxoewy6OeeFsDPNUJTsI8+F5DIwtNhZcdQtBexZ/D3ALkSboR87t2Vy8OJpD7AgMBAAEwDQYJKoZIhvcNAQEEBQADgYEAV7xLLslRn2srS4A4Ks1KiuUWI/ackyNK7UiWgWD/by5Vx4Zw+0x3hdLzQllDR2O5Nef9it5WyYWrDQ47RadqMEVVfTGuAqQn47n/t+v24ljwm2yZ36Tj2lDVaFbE/ZtRyzPKgIwUy6RIt9XVX39vXFJVaENCHzZ0R3hs2bx1K3o=-----END CERTIFICATE-----

  • ทำการส่งไฟล์ certificate แลกกันระหว่าง Server กับ Client โดยใช้วิธีการที่ชื่นชอบของแต่คน เมื่อแลกไฟล์กันเสร็จแล้ว
  • ฝั่ง Server import certificate ด้วยคำสั่ง
    • orapki wallet add -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 \ -trusted_cert -cert /tmp/client-certificate.crt

  • สามารถตรวจสอบด้วยคำสั่ง
    • orapki wallet display -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123

  • ได้ผลลัพธ์ประมาณ
    • Oracle PKI Tool : Version 12.1.0.2
      Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved.

      Requested Certificates:
      User Certificates:
      Subject: CN=reis.psu.ac.th
      Trusted Certificates:
      Subject: CN=ENERAZAN
      Subject: CN=reis.psu.ac.th

  • ฝั่ง Client import certificatae ด้วยคำสั่ง
    • orapki wallet add -wallet "c:\app\oracle\wallet" -pwd WalletPasswd123 -trusted_cert -cert c:\server-certificate.crt

  • สามารถตรวจสอบด้วยคำสั่ง
    • orapki wallet display -wallet “c:\app\oracle\wallet” -pwd WalletPasswd123
  • ได้ผลลัพธ์ประมาณว่า
    • Oracle PKI Tool : Version 12.2.0.1.0
      Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.

      Requested Certificates:
      User Certificates:
      Subject: CN=ENERAZAN
      Trusted Certificates:
      Subject: CN=reis.psu.ac.th
      Subject: CN=ENERAZAN

  • ฝั่ง Server แก้ไขแฟ้ม $ORACLE_HOME/network/admin/sqlnet.ora ด้วย editor ที่ชื่นชอบ
    • เพิ่มคำสั่งต่อไปนี้
    • WALLET_LOCATION =
      (SOURCE =
      (METHOD = FILE)
      (METHOD_DATA =
      (DIRECTORY = /u01/app/oracle/wallet)
      )
      )

      SQLNET.AUTHENTICATION_SERVICES = (TCPS,NTS,BEQ)
      SSL_CLIENT_AUTHENTICATION = FALSE
      SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA)

แก้ไขแฟ้ม $ORACLE_HOME/network/admin/listener.ora

    • เพิ่มข้อความส่วนที่เป็นตัวหนาตามตำแหน่งต่อไปนี้
    • LISTENER =
      (DESCRIPTION_LIST =
      (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = reis.psu.ac.th)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCPS)(HOST = reis.psu.ac.th)(PORT = 2484))
      )
      )

      SSL_CLIENT_AUTHENTICATION = FALSE

      WALLET_LOCATION =
      (SOURCE =
      (METHOD = FILE)
      (METHOD_DATA =
      (DIRECTORY = /u01/app/oracle/wallet)
      )
      )

  • restart listener ด้วยคำสั่ง
    • lsnrctl stop
    • lsnrctl start
  • ฝั่ง Client แก้ไขแฟ้ม C:\app\client\Administrator\product\12.2.0\client_1\network\admin\sqlnet.ora โดยเพิ่มข้อความต่อไปนี้
    • WALLET_LOCATION =
      (SOURCE =
      (METHOD = FILE)
      (METHOD_DATA =
      (DIRECTORY = c:\app\oracle\wallet)
      )
      )

      SQLNET.AUTHENTICATION_SERVICES = (TCPS,NTS)
      SSL_CLIENT_AUTHENTICATION = FALSE
      SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA)

  • แก้ไขแฟ้ม C:\app\client\Administrator\product\12.2.0\client_1\network\admin\tnsnames.ora เพิ่มข้อความต่อไปนี้
    • REIS_SSL =
      (DESCRIPTION =
      (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCPS)(HOST = reis.psu.ac.th)(PORT = 2484))
      )
      (CONNECT_DATA =
      (SERVICE_NAME = reis.psu.ac.th)
      )
      )

  • ทดสอบใช้งาน
  • ที่ Client พิมพ์คำสั่ง
    • sqlplus scott/tiger@reis_ssl
  • ได้ผลลัพธ์ประมาณว่า
    • SQL*Plus: Release 12.2.0.1.0 Production on Wed Feb 7 16:54:05 2018
      Copyright (c) 1982, 2016, Oracle. All rights reserved.

      Last Successful login time: Wed Feb 07 2018 16:52:50 +07:00

      Connected to:
      Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 – 64bit Production
      With the Partitioning, OLAP, Advanced Analytics and Real Application Testing opt
      ions

      SQL>

  • หรือต่อด้วย SQL Developer ต้องตั้งค่าการเชื่อมต่อเป็นดังภาพ
  • จากภาพเลือก Connection Type เป็น Advanced และใช้ช่อง Custom JDBC URL ใส่เป็น jdbc:oracle:oci:/@reis_ssl
  • เนื่องจากไม่สามารถเชื่อมต่อผ่าน tns ได้ ดังภาพ
  • วิธีเซ็ตค่าแบบนี้ใช้ได้กับ Oracle Database 10G R2 เป็นต้นมา
  • จบขอให้สนุก

ที่มา:
https://oracle-base.com/articles/misc/configure-tcpip-with-ssl-and-tls-for-database-connections