در نسخههای قبلی، فراخوانهای 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 HTTP
HTTP/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 sysdba
begin
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 1000000
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>
ما می توانستیم با استفاده از HTTPURITYPE به نتیجه مشابهی دست پیدا کنیم.
set serveroutput on long 1000000
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<
آزمون یک CALLOUT پایگاه داده با Wallet:
ما همچنان میتوانیم از کیف پولی حاوی root certificate مربوطه استفاده کنیم، اما وقتی به wallet ارجاع میدهیم، اولویت دارد. اگر wallet حاوی root certificate صحیح نباشد، تماس ناموفق خواهد بود. برای نشان دادن این موضوع، به جای root certificate، آدرسی که فراخوانی میکنیم، یک wallet جدید میسازیم که حاوی یک certificate امضا شده است.
mkdir -p /u01/wallet
orapki wallet create -wallet /u01/wallet -pwd WalletPasswd123 -auto_login
orapki 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/freepdb1
set serveroutput on long 1000000
exec 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 failed
ORA-06512: at "TESTUSER1.SHOW_HTML_FROM_URL", line 26
ORA-29024: Certificate validation failure
ORA-06512: at "SYS.UTL_HTTP", line 380
ORA-06512: at "SYS.UTL_HTTP", line 1189
ORA-06512: at "TESTUSER1.SHOW_HTML_FROM_URL", line 9
ORA-06512: at line 1
Help: https://docs.oracle.com/error-help/db/ora-29273/
SQL>
هنگامی که سعی می کنیم از HTTPURITYPE استفاده کنیم، همان خطا را دریافت می کنیم.
conn testuser1/testuser1@//localhost:1521/freepdb1
set serveroutput on
exec utl_http.set_wallet('file:/u01/wallet', null);
select HTTPURITYPE.createuri('https://artarad.ir/sitemap.xml').getclob();
ERROR:
ORA-29273: HTTP request failed
ORA-06512: at "SYS.HTTPURITYPE", line 38
ORA-29024: Certificate validation failure
ORA-06512: at "SYS.UTL_HTTP", line 380
ORA-06512: at "SYS.UTL_HTTP", line 1189
ORA-06512: at "SYS.HTTPURITYPE", line 23
Help: 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/freepdb1
set serveroutput on long 1000000
exec 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>