Transport Layer Security (TLS) بدون client wallet در پایگاه داده Oracle 23c

در نسخه‌های قبلی، فراخوان‌های HTTPS از پایگاه داده نیاز به استفاده از client wallet داشت. از پایگاه داده Oracle 23c به بعد، می توانیم به جای آن از certificate سیستم عامل استفاده کنیم.سیستم‌های عامل معمولاً دارای یک certificate store هستند که حاوی Rootگواهی‌های certificate authorities محبوب است. این به سیستم عامل اجازه می دهد تا با استفاده از آن root certificates، اتصالات قابل اعتمادی به سایت ها برقرار کند. این certificate store با patches عملیاتی به روز نگه داشته می شوند. Oracle 23c به ما امکان می دهد به جای استفاده از client wallet ، از certificate store سیستم عامل استفاده کنیم، که بار مدیریت گواهی را از دوش ما بر می دارد.آموزش نصب و راه اندازی پایگاه داده Oracle 23cآزمون یک URL از سیستم عامل:ساده ترین راه برای آزمایش URL HTTPS استفاده از دستور curl از خط فرمان سیستم عامل است. اگر اتصال معتبر HTTPS امکان پذیر باشد، باید یک پاسخ "200 OK" دریافت کنیم. می بینیم که خوب کار می کند.$ curl -is https://oracle-base.com/sitemap.xml | grep HTTPHTTP/1.1 200 OK$این بدان معناست که root certificate مورد نیاز در certificate store سیستم عامل موجود است.ساخت یک ACL (Access Control List):برای انجام فراخوانی پایگاه داده ما به یک لیست کنترل دسترسی (ACL) برای میزبان نیاز داریم. مثال زیر یک ACL برای میزبان "ARTARAD.IR" در پورت 443 ایجاد می کند. TESTUSER1 کاربری است که ما از آن تماس خواهیم گرفت.conn sys/SysPassword1@//localhost:1521/freepdb1 as sysdbabegin dbms_network_acl_admin.append_host_ace ( host => ‘ARTARAD.IR’, lower_port => 443, upper_port => 443, ace => xs$ace_type(privilege_list => xs$name_list('http'), principal_name => 'testuser1', principal_type => xs_acl.ptype_db)); end;/conn testuser1/testuser1@//localhost:1521/freepdb1آزمون یک CALLOUT پایگاه داده بدون Wallet:ما یک رویه با استفاده از بسته UTL_HTTP ایجاد می کنیم تا محتویات یک URL را برگردانیم.create or replace procedure show_html_from_url ( p_url in varchar2) 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); 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;/در نسخه‌های قبلی، تلاش برای استفاده از روش بدون باز کردن Wallet ، منجر به شکست اعتبار گواهینامه می‌شود. این مورد در Oracle 23c نیست، زیرا ما به طور پیش فرض از certificate store سیستم عامل استفاده می کنیم.set serveroutput on long 1000000exec show_html_from_url('https:// ARTARAD.IR/sitemap.xml');<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url>... output removed ... <url></urlset>PL/SQL procedure successfully completed.SQL>ما می توانستیم با استفاده از HTTPURITYPE به نتیجه مشابهی دست پیدا کنیم.set serveroutput on long 1000000select HTTPURITYPE.createuri('https://ARTARAD.IR/sitemap.xml').getclob();HTTPURITYPE.CREATEURI('HTTPS:// ARTARAD.IR/SITEMAP.XML').GETCLOB()--------------------------------------------------------------------------------<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url>... output removed ... <url></urlset>SQL<آزمون یک CALLOUT پایگاه داده با Wallet:ما همچنان می‌توانیم از کیف پولی حاوی root certificate مربوطه استفاده کنیم، اما وقتی به wallet ارجاع می‌دهیم، اولویت دارد. اگر wallet حاوی root certificate صحیح نباشد، تماس ناموفق خواهد بود. برای نشان دادن این موضوع، به جای root certificate، آدرسی که فراخوانی می‌کنیم، یک wallet جدید می‌سازیم که حاوی یک certificate امضا شده است.mkdir -p /u01/walletorapki wallet create -wallet /u01/wallet -pwd WalletPasswd123 -auto_loginorapki wallet add -wallet /u01/wallet -pwd WalletPasswd123 \ -dn "CN=`hostname`, OU=Example Department, O=Example Company, L=Birmingham, ST=West Midlands, C=GB" \ -keysize 1024 -self_signed -validity 365ما به یک sessionجدید متصل می شویم، wallet را باز می کنیم و سعی می کنیم procedure را برای callout اجرا کنیم. همانطور که انتظار می رود، این منجر به عدم اعتبار گواهینامه می شود.conn testuser1/testuser1@//localhost:1521/freepdb1set serveroutput on long 1000000exec utl_http.set_wallet('file:/u01/wallet', null);exec show_html_from_url('https://artarad.ir/sitemap.xml');*ERROR at line 1:ORA-29273: HTTP request failedORA-06512: at "TESTUSER1.SHOW_HTML_FROM_URL", line 26ORA-29024: Certificate validation failureORA-06512: at "SYS.UTL_HTTP", line 380ORA-06512: at "SYS.UTL_HTTP", line 1189ORA-06512: at "TESTUSER1.SHOW_HTML_FROM_URL", line 9ORA-06512: at line 1Help: https://docs.oracle.com/error-help/db/ora-29273/SQL>هنگامی که سعی می کنیم از HTTPURITYPE استفاده کنیم، همان خطا را دریافت می کنیم.conn testuser1/testuser1@//localhost:1521/freepdb1set serveroutput onexec utl_http.set_wallet('file:/u01/wallet', null);select HTTPURITYPE.createuri('https://artarad.ir/sitemap.xml').getclob();ERROR:ORA-29273: HTTP request failedORA-06512: at "SYS.HTTPURITYPE", line 38ORA-29024: Certificate validation failureORA-06512: at "SYS.UTL_HTTP", line 380ORA-06512: at "SYS.UTL_HTTP", line 1189ORA-06512: at "SYS.HTTPURITYPE", line 23Help: https://docs.oracle.com/error-help/db/ora-29273/SQL>گواهی صحیح را به wallet اضافه می کنیم.orapki wallet add -wallet /u01/wallet -trusted_cert -cert "/tmp/ISRG Root X1.crt" -pwd WalletPasswd123اکنون تست های قبلی مطابق انتظار عمل می کنند.conn testuser1/testuser1@//localhost:1521/freepdb1set serveroutput on long 1000000exec utl_http.set_wallet('file:/u01/wallet', null);exec show_html_from_url('https://artarad.ir/sitemap.xml');<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url>... output removed ... <url></urlset>PL/SQL procedure successfully completed.SQL>select HTTPURITYPE.createuri('https://artarad.ir/sitemap.xml').getclob();HTTPURITYPE.CREATEURI('HTTPS://artarad.ir/SITEMAP.XML').GETCLOB()--------------------------------------------------------------------------------<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url>... output removed ... <url></urlset>SQL>منبع مستند