گاهی اوقات نیاز است به دلایل امنیتی ارتباط بین دیتابیس و نرم افزار را رمز نگاری کرد . یکی از بهترین روشها استفاده از SSL در ارتباطات TNS و LISTENER است . در این مقاله به پیاده سازی این راهکار خواهیم پرداخت.
با دنبال کردن مراحل زیر میتوان ارتباط بین برنامه و دیتابیس را ایجاد کرد:
در این مستند فرض را بر این گرفته که server با نام ol7-121.localdomain بوده و client یک سیستم ویندوزی با نام "my-computer" میباشد و oracle client بر روی آن نصب میباشد.
ایجاد wallet بر روی سرور:
1- ساخت wallet بصورت auto_login بر روی سرور
$ mkdir -p /u01/app/oracle/wallet
$ orapki wallet create -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 -auto_login_local
2- ساخت certificate بصورت self-signed و load به wallet
$ orapki wallet add -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 -dn "CN=`hostname`" -keysize 1024 -self_signed -validity 3650
3- بررسی محتویات wallet
$ orapki wallet display -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123
4- خروجی گرفتن از certificate برای ورود به wallet در سمت client
$ orapki wallet export -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 -dn "CN=`hostname`" -cert /tmp/`hostname`-certificate.crt
5- بررسی محتویات certificate
$ cat /tmp/`hostname`-certificate.crt
-----BEGIN CERTIFICATE-----
MIIBqzCCARQCAQAwDQYJKoZIhvcNAQEEBQAwHjEcMBoGA1UEAxMTb2w3LTEyMS5sb2NhbGRvbWFpbjAeFw0xNTA2MjYxNDQyMDJaFw0yNTA2MjMxNDQyMDJaMB4xHDAaBgNVBAMTE29sNy0xMjEubG9jYWxkb21haW4wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJIrU1fGWAwMxRobFsS0UZBD1jFUwAvnH9blsynhrQrZSkwyMBWGPRFq5tufRpaifoNVVHSrjJm/nti62A6RXECAKsug9rHL8T11FOgP3R/+Itw2jLzwpdk7MbHMxpNHz6Y2IPCmBsJ5+625dRxugVKhLsIitAW5cUpT28bkrMl9AgMBAAEwDQYJKoZIhvcNAQEEBQADgYEABqQaP056WcPNgzSAOhJgTU/6D8uAFGCgUN57HoraXxgAN3HgmeGqhQfpb8tP+xeTF3ecqvWqJQHGdAJbuhRwpNR1rRovvlOxiv4gl0AplRzRuiygXfi6gst7KNmAdoxrTOcUQsqf/Ei9TaFl/N8E+88T2fK67JHgFa4QDs/XZWM=
-----END CERTIFICATE-----
$ایجاد wallet بر روی کلاینت :
در صورتیکه این مرحله بر روی ویندوز اجرا گردد نیاز به oracle client خواهیم داشت.
1- ایجاد wallet بصورت auto_login
d:\>mkdir -p d:\app\oracle\wallet
d:\>orapki wallet create -wallet "d:\app\oracle\wallet" -pwd WalletPasswd123 -auto_login
2- ساخت certificate بصورت self-signed و load به wallet
d:\>orapki wallet add -wallet "d:\app\oracle\wallet" -pwd WalletPasswd123 -dn "CN=%computername%" -keysize 1024 -self_signed -validity 3650
3- با دستور زیر wallet را میتوانید بررسی کنید. توجه کنید که مقدار cn که با نام کامپیوتر برابر است باید در قسمت user و trusted certificate وجود داشته باشد.
d:\>orapki wallet display -wallet "d:\app\oracle\wallet" -pwd WalletPasswd123
Oracle PKI Tool : Version 11.2.0.3.0 - Production
Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved.
Requested Certificates:
User Certificates:
Subject: CN=my-computer
Trusted Certificates:
Subject: OU=Class 2 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US
Subject: OU=Secure Server Certification Authority,O=RSA Data Security\, Inc.,C=US
Subject: CN=GTE CyberTrust Global Root,OU=GTE CyberTrust Solutions\, Inc.,O=GTE Corporation,C=US
Subject: CN=my-computer
Subject: OU=Class 3 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US
Subject: OU=Class 1 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US
4- خروجی گرفتن از certificate برای ورود به wallet در سمت Server
d:\>orapki wallet export -wallet "d:\app\oracle\wallet" -pwd WalletPasswd123 -dn "CN=%computername%" -cert d:\%computername%-certificate.crt
5- بررسی certificate
d:\>more d:\%computername%-certificate.crt
تبادل certificate ها :
1- در ابتدا certificate خروجی گرفته شده در سمت server را در درایو C بر روی clientکپی کرده و برعکس ، certificate خروجی گرفته شده در سمت client را بر روی /tmp از server کپی میکنیم.
در ابتدا بر روی کلاینت دستور زیر را اجرا میکنیم:
d:\>orapki wallet add -wallet "d:\app\oracle\wallet" -pwd WalletPasswd123 -trusted_cert -cert d:\ol7-121.localdomain-certificate.crt
در اینجا بجای d:\ol7-121.localdomain-certificate.crt میبایست مسیر و نام certificate کپی شده از روی سرور جایگزین گردد.
2- در این قسمت wallet بر روی client را بررسی میکنیم:
d:\>orapki wallet display -wallet "d:\app\oracle\wallet" -pwd WalletPasswd123
میبایست نام سرور در قسمت Trusted Certificates اضافه شده باشد.
Requested Certificates:
User Certificates:
Subject: CN=my-computer
Trusted Certificates:
Subject: OU=Secure Server Certification Authority,O=RSA Data Security\, Inc.,C=US
Subject: OU=Class 2 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US
Subject: CN=my-computer
Subject: OU=Class 3 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US
Subject: OU=Class 1 Public Primary Certification Authority,O=VeriSign\, Inc.,C=US
Subject: CN=ol7-121.localdomain
Subject: CN=GTE CyberTrust Global Root,OU=GTE CyberTrust Solutions\, Inc.,O=GTE Corporation,C=US
3- بر روی سرور دستور زیر را اجرا میکنیم:
$ orapki wallet add -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123 -trusted_cert -cert /tmp/my-computer-certificate.crt
در این قسمت به جای نام my-computer-certificate.crt ، نام certificate کپی شده از client را قرار میدهیم.
با استفاده از دستور زیر بررسی میکنیم که نام client در لیست Trusted Certificates اضافه شده باشد:
$ orapki wallet display -wallet "/u01/app/oracle/wallet" -pwd WalletPasswd123
تغییرات فایلهای شبکه ای سرور
1- تغییر فایلهای سرور:
در ابتدا خطهای زیر در فایل $ORACLE_HOME/network/admin/sqlnet.ora افاضه کنید و یا در صورت نیاز تغییر دهید:
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /u01/app/oracle/wallet)
)
)
SQLNET.AUTHENTICATION_SERVICES = (TCPS,NTS,BEQ)
SSL_CLIENT_AUTHENTICATION = TRUE
SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA)
SSL_VERSION = 1.0
سپس فایل $ORACLE_HOME/network/admin/listener.ora را بصورت زیر تغییر دهید:
SSL_CLIENT_AUTHENTICATION = TRUE
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = /u01/app/oracle/wallet)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = ol7-121.localdomain)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCPS)(HOST = ol7-121.localdomain)(PORT = 2484))
)
)
ADR_BASE_LISTENER = /u01/app/oracle
توجه داشته باشید در صورتی که ارتباط فقط باید با TCPS برقرار باشد ، خط TCP را حذف کنید.
سپس دستورات زیر را برای اعمال تغییرات انجام دهید:
$ lsnrctl stop
$ lsnrctl start
2- تغییر فایلهای client:
فایل $ORACLE_HOME/network/admin/sqlnet.ora را در کلاینت اضافه کنید (توجه داشته باشید شما برای این مرحله میبایست oracle client را نصب داشته باشید).
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = D:\app\oracle\wallet)
)
)
SSL_VERSION=1.0
SQLNET.AUTHENTICATION_SERVICES = (TCPS,NTS)
SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA)
SSL_CLIENT_AUTHENTICATION = TRUE
همچنین خطوط زیر را به فایل $ORACLE_HOME/network/admin/tnsnames.ora اضافه کنید:
pdb1_ssl=
(DESCRIPTION=
(ADDRESS=
(PROTOCOL=TCPS)
(HOST=ol7-121.localdomain)
(PORT=2484)
)
(CONNECT_DATA=
(SERVER=dedicated)
(SERVICE_NAME=pdb1)
)
)
در این قسمت میبایست pdb1_ssl را با نام دلخواه و pdb1 و ol7-121.localdomain را با توجه به نام سرور و نام سرویس در سرور تغییر دهید.
تست ارتباط:
برای تست ارتباط میتوان به صورت زیر عمل نمود:
c:\>sqlplus test/test@pdb1_ssl
SQL*Plus: Release 11.2.0.3.0 Production on Fri Jun 26 16:23:28 2015
Copyright (c) 1982, 2011, Oracle. All rights reserved.
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 options
SQL>
به جای test باید کاربر موجود در سرور و پسورد قرار داده شود.
منبع :
https://oracle-base.com/articles/misc/configure-tcpip-with-ssl-and-tls-for-database-connections
I've loaded your blog in 3 different web browsers and I must say this blog loads a lot faster then most.
Can you recommend a good hosting provider at a fair price?
Thanks a lot, I appreciate it!