مسعود سلطانی راد
مسعود سلطانی راد
خواندن ۴ دقیقه·۱ سال پیش

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


منبع مستند


oracle databaseخدمات نگهداری اوراکلمشاوره اوراکلخدمات پشتیبانی اوراکلمسعود سلطانی راد
چند سالی هست در حوزه داده ها ( نگهداری و تحلیل آنها) فعالیت دارم و همیشه سعی کردم آموخته هایم رو به اشتراک بگذارم soltanirad@artarad.ir www.artarad.ir
شاید از این پست‌ها خوشتان بیاید