本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用憑證和 Oracle 錢包設定 UTL_HTTP 存取
Amazon RDS 支援在適用於 Oracle 資料庫執行個體的 RDS 上進行輸出網路存取。若要將資料庫執行個體連線至網路,您可以使用下列 PL/SQL 套件:
完成下列任務,就可以設定 UTL_HTTP.REQUEST
,搭配執行 SSL 交握期間需要用戶端身分驗證憑證的網站使用。您也可以修改 Oracle 錢包產生命令和 DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE
程序,為網站 UTL_HTTP
存取設定密碼身分驗證。如需詳細資訊,請參閱 Oracle 資料庫說明文件中的 DBMS_NETWORK_ACL_ADMIN
注意
您可以針對 UTL_SMTP
調整下列任務,允許透過 SSL/TLS (包括 Amazon Simple Email Service
主題
設定 UTL_HTTP 存取時的考量事項
在設定存取權之前,請考慮下列事項:
-
您可以將 SMTP 與郵件選項搭配使用。如需詳細資訊,請參閱Oracle UTL_MAIL。
-
遠端主機的網域名稱伺服器 (DNS) 名稱可以是以下任何項目:
-
可公開解析。
-
Amazon RDS 資料庫執行個體的端點。
-
可透過自訂 DNS 伺服器解析。如需更多詳細資訊,請參閱 設定自訂DNS伺服器。
-
相同 VPC 或對等 VPC 中 Amazon EC2 執行個體的私有 DNS 的名稱。在此情況下,請確定名稱可透過自訂 DNS 伺服器解析。或者,若要使用 Amazon 提供的 DNS,您可以在 VPC 設定中啟用
enableDnsSupport
屬性,並為 VPC 對等連接啟用 DNS 解析支援。如需詳細資訊,請參閱 VPC 中的 DNS 支援和修改 VPC 對等連接。 -
如要安全連線到遠端 SSL/TLS 資來源,建議您建立並上傳自訂的 Oracle 錢包。通過使用 Amazon S3 與 Amazon RDS for Oracle 的功能整合,您可以將 Amazon S3 中的錢包下載到 Oracle 資料庫執行個體中。有關 Oracle Amazon S3 整合的詳細資訊,請參閱 Amazon S3 整合。
-
-
若 Oracle SSL 選項已為個別執行個體進行設定,則您可以透過 SSL/TLS 端點來建立 Oracle 資料庫執行個體之間的資料庫連結。無需進一步設定。如需詳細資訊,請參閱Oracle Secure Sockets Layer。
步驟 1:取得網站的根憑證
若要讓 RDS for Oracle 資料庫執行個體與網站建立安全連線,請新增根 CA 憑證。Amazon RDS 使用根憑證將網站憑證簽入 Oracle 錢包。
您可以透過多種方式取得根憑證。例如,您可以執行下列動作:
-
使用 Web 伺服器造訪受憑證保護的網站。
-
下載用於簽署的根憑證。
若使用 AWS 服務,通常可以在 Amazon Trust Services 儲存庫
步驟 2:建立 Oracle 錢包
建立同時包含 Web 伺服器憑證和用戶端身分驗證憑證的 Oracle 錢包。RDS Oracle 執行個體使用 Web 伺服器憑證與網站建立安全連線。網站需要用戶端憑證用於驗證 Oracle 資料庫使用者。
您可能希望設定安全連線,而不透過用戶端憑證進行身分驗證。在此情況下,可以略過以下程序中的 Java 金鑰存放區步驟。
建立 Oracle 錢包
-
將根憑證和用戶端憑證放在單一目錄中,然後變更為此目錄中。
-
將 .p12 用戶端憑證轉換為 Java 金鑰存放區。
注意
如果您不透過用戶端憑證進行身分驗證,可略過此步驟。
下列範例將名為
client_certificate.p12
的用戶端憑證轉換為client_keystore.jks
Java 金鑰存放區。這樣金鑰存放區就包含在 Oracle 錢包中。金鑰存放區密碼為P12PASSWORD
。orapki wallet pkcs12_to_jks -wallet ./
client_certificate.p12
-jksKeyStoreLoc ./client_keystore.jks
-jksKeyStorepwdP12PASSWORD
-
為 Oracle 錢包建立與憑證目錄不同的目錄。
下列範例會建立
/tmp/wallet
目錄。mkdir -p
/tmp/wallet
-
在錢包目錄中建立 Oracle 錢包。
下列範例會將 Oracle 錢包密碼設定為
P12PASSWORD
,此密碼與上一步中 Java 金鑰存放區使用的密碼相同。使用相同的密碼很方便,但沒有必要。-auto_login
參數會開啟自動登入功能,因此不需要每次存取時都指定一次密碼。注意
指定此處所顯示提示以外的密碼,作為安全最佳實務。
orapki wallet create -wallet
/tmp/wallet
-pwdP12PASSWORD
-auto_login -
將 Java 金鑰存放區新增到您的 Oracle 錢包。
注意
如果您不透過用戶端憑證進行身分驗證,可略過此步驟。
下列範例會將金鑰存放區
client_keystore.jks
新增到名為/tmp/wallet
的 Oracle 錢包。在此範例中,為 Java 金鑰存放區和 Oracle 錢包指定了相同的密碼。orapki wallet jks_to_pkcs12 -wallet
/tmp/wallet
-pwdP12PASSWORD
-keystore ./client_keystore.jks
-jkspwdP12PASSWORD
-
將目標網站的根憑證新增至 Oracle 錢包。
下列範例會新增名為
Root_CA.cer
的憑證。orapki wallet add -wallet
/tmp/wallet
-trusted_cert -cert ./Root_CA.cer
-pwdP12PASSWORD
-
新增任何中繼憑證。
下列範例會新增名為
Intermediate.cer
的憑證。若要載入所有中繼憑證,請視需要重複此步驟。orapki wallet add -wallet
/tmp/wallet
-trusted_cert -cert ./Intermediate.cer
-pwdP12PASSWORD
-
確認新建立的 Oracle 錢包含有所需的憑證。
orapki wallet display -wallet
/tmp/wallet
-pwdP12PASSWORD
步驟 3:將 Oracle 錢包下載到 RDS for Oracle 執行個體
在此步驟中,將 Oracle 錢包上傳到 Amazon S3,然後將錢包從 Amazon S3 下載到 RDS for Oracle 執行個體。
將 Oracle 錢包下載到 RDS for Oracle 資料庫執行個體
-
完成 Amazon S3 與 Oracle 整合的必要條件,然後新增
S3_INTEGRATION
選項至您的 Oracle 資料庫執行個體。確保選項的 IAM 角色可存取您使用的 Amazon S3 儲存貯體。如需詳細資訊,請參閱Amazon S3 整合。
-
以主要使用者身分登入資料庫執行個體,然後建立一個 Oracle 目錄來保存 Oracle 錢包。
下列範例會建立名為
WALLET_DIR
的 Oracle 目錄。EXEC rdsadmin.rdsadmin_util.create_directory('
WALLET_DIR
');如需詳細資訊,請參閱在主要資料儲存空間中建立和捨棄目錄。
-
將 Oracle 錢包上傳至您的 Amazon S3 儲存貯體。
您可以使用任何支援的上傳技術。
-
如要重新上傳 Oracle 錢包,請刪除現有錢包。否則,跳至下一步。
下列範例會移除名為
cwallet.sso
的現有錢包。EXEC UTL_FILE.FREMOVE ('
WALLET_DIR
','cwallet.sso
'); -
將 Oracle 錢包從您的 Amazon S3 儲存貯體下載至 Oracle 資料庫執行個體。
下列範例會將名為
cwallet.sso
的錢包,從 Amazon S3 儲存貯體my_s3_bucket
下載到資料庫執行個體目錄WALLET_DIR
。SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => '
my_s3_bucket
', p_s3_prefix => 'cwallet.sso
', p_directory_name => 'WALLET_DIR
') AS TASK_ID FROM DUAL; -
(選用) 下載受密碼保護的 Oracle 錢包。
只有在您想要求每次使用錢包都輸入密碼時,才需下載此錢包。下列範例會下載受密碼保護的錢包
ewallet.p12
。SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => '
my_s3_bucket
', p_s3_prefix => 'ewallet.p12
', p_directory_name => 'WALLET_DIR
') AS TASK_ID FROM DUAL; -
檢查您的資料庫任務。
下列範例中,將上述步驟傳回的任務 ID 替換為
dbtask-1234567890123-4567.log
。SELECT TEXT FROM TABLE(rdsadmin.rds_file_util.read_text_file('BDUMP','
dbtask-1234567890123-4567.log
')); -
檢查用於存放 Oracle 錢包的目錄內容。
SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => '
WALLET_DIR
'));如需詳細資訊,請參閱列出資料庫執行個體目錄中的檔案。
步驟 4:授予使用者使用 Oracle 錢包的許可
您可以建立新的資料庫使用者或設定現有使用者。無論哪種情況,都必須為使用者設定 Oracle 錢包的存取權,以建立安全連線和使用憑證進行用戶端身分驗證。
授予使用者使用 Oracle 錢包的許可
-
以主要使用者身分登入 RDS for Oracle 資料庫執行個體。
-
如果不想設定現有的資料庫使用者,請建立一個新使用者。否則,跳至下一步。
下列範例會建立名為
my-user
的資料庫使用者。CREATE USER
my-user
IDENTIFIED BYmy-user-pwd
; GRANT CONNECT TOmy-user
; -
向您的資料庫使用者授予許可,允許存取包含 Oracle 錢包的目錄。
下列範例會為
my-user
使用者授予目錄WALLET_DIR
的讀取存取權。GRANT READ ON DIRECTORY
WALLET_DIR
TOmy-user
; -
使用
UTL_HTTP
套件授予資料庫使用者許可。下列 PL/SQL 程式授予
UTL_HTTP
存取權給使用者my-user
。BEGIN rdsadmin.rdsadmin_util.grant_sys_object('UTL_HTTP', UPPER('
my-user
')); END; / -
使用
UTL_FILE
套件授予資料庫使用者許可。下列 PL/SQL 程式授予
UTL_FILE
存取權給使用者my-user
。BEGIN rdsadmin.rdsadmin_util.grant_sys_object('UTL_FILE', UPPER('
my-user
')); END; /
步驟 5:設定從資料庫執行個體存取網站的權限
在此步驟中,會對 Oracle 資料庫使用者進行設定,允許該使用者使用 UTL_HTTP
、您上傳的 Oracle 錢包和用戶端憑證連線至您的目標網站。如需詳細資訊,請參閱 Oracle 資料庫說明文件中的設定 Oracle 錢包的存取控制
設定從 RDS for Oracle 資料庫執行個體存取網站的權限
-
以主要使用者身分登入 RDS for Oracle 資料庫執行個體。
-
在安全連接埠上為使用者和目標網站建立主機存取控制項目 (ACE)。
下列範例會為
my-user
設定安全連接埠 443 上secret.encrypted-website.com
的存取權。BEGIN DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE( host => '
secret.encrypted-website.com
', lower_port => 443, upper_port => 443, ace => xs$ace_type(privilege_list => xs$name_list('http'), principal_name => 'my-user
', principal_type => xs_acl.ptype_db)); -- If the program unit results in PLS-00201, set -- the principal_type parameter to 2 as follows: -- principal_type => 2)); END; /重要
上述程式單元可能會導致以下錯誤:
PLS-00201: identifier 'XS_ACL' must be declared
。如果傳回此錯誤,請以下列行取代指定值principal_type
的行,然後重新執行程式單元:principal_type => 2));
如需 PL/SQL 套裝程式中常數的詳細資訊
XS_ACL
,請參閱 Oracle 資料庫說明文件中的「實際應用程式安全管理員和開發人員指南」。 如需詳細資訊,請參閱 Oracle 資料庫說明文件中的設定外部網路服務的存取控制
。 -
(選用) 為標準連接埠上的使用者和目標網站建立 ACE。
如果某些網頁是從標準 Web 伺服器連接埠 (80) 而不是安全連接埠 (443) 提供的,可能需要使用標準連接埠。
BEGIN DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE( host => '
secret.encrypted-website.com
', lower_port => 80, upper_port => 80, ace => xs$ace_type(privilege_list => xs$name_list('http'), principal_name => 'my-user
', principal_type => xs_acl.ptype_db)); -- If the program unit results in PLS-00201, set -- the principal_type parameter to 2 as follows: -- principal_type => 2)); END; / -
確認存取控制項目存在。
SET LINESIZE 150 COLUMN HOST FORMAT A40 COLUMN ACL FORMAT A50 SELECT HOST, LOWER_PORT, UPPER_PORT, ACL FROM DBA_NETWORK_ACLS ORDER BY HOST;
-
使用
UTL_HTTP
套件授予資料庫使用者許可。下列 PL/SQL 程式授予
UTL_HTTP
存取權給使用者my-user
。BEGIN rdsadmin.rdsadmin_util.grant_sys_object('UTL_HTTP', UPPER('
my-user
')); END; / -
確認相關的存取控制清單存在。
SET LINESIZE 150 COLUMN ACL FORMAT A50 COLUMN PRINCIPAL FORMAT A20 COLUMN PRIVILEGE FORMAT A10 SELECT ACL, PRINCIPAL, PRIVILEGE, IS_GRANT, TO_CHAR(START_DATE, 'DD-MON-YYYY') AS START_DATE, TO_CHAR(END_DATE, 'DD-MON-YYYY') AS END_DATE FROM DBA_NETWORK_ACL_PRIVILEGES ORDER BY ACL, PRINCIPAL, PRIVILEGE;
-
授予資料庫使用者許可,允許使用憑證進行用戶端身分驗證,並授予 Oracle 錢包進行連線的許可。
注意
如果您不透過用戶端憑證進行身分驗證,可略過此步驟。
DECLARE l_wallet_path all_directories.directory_path%type; BEGIN SELECT DIRECTORY_PATH INTO l_wallet_path FROM ALL_DIRECTORIES WHERE UPPER(DIRECTORY_NAME)='
WALLET_DIR
'; DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE( wallet_path => 'file:/' || l_wallet_path, ace => xs$ace_type(privilege_list => xs$name_list('use_client_certificates'), principal_name => 'my-user
', principal_type => xs_acl.ptype_db)); END; /
步驟 6:測試從資料庫執行個體連至網站的連線
在此步驟中,會對資料庫使用者進行設定,允許該使用者使用 UTL_HTTP
、您上傳的 Oracle 錢包和用戶端憑證連線至您的網站。
設定從 RDS for Oracle 資料庫執行個體存取網站的權限
-
以具有
UTL_HTTP
許可的資料庫使用者身分登入 RDS on Oracle 資料庫執行個體。 -
確認連至目標網站的連線可以解析主機地址。
下列範例會從
secret.encrypted-website.com
取得主機地址。SELECT UTL_INADDR.GET_HOST_ADDRESS(host => '
secret.encrypted-website.com
') FROM DUAL; -
測試失敗的連線。
以下查詢失敗,因為
UTL_HTTP
需要含有憑證的 Oracle 錢包的所在位置。SELECT UTL_HTTP.REQUEST('
secret.encrypted-website.com
') FROM DUAL; -
使用
UTL_HTTP.SET_WALLET
並從DUAL
中選取來測試網站存取情況。DECLARE l_wallet_path all_directories.directory_path%type; BEGIN SELECT DIRECTORY_PATH INTO l_wallet_path FROM ALL_DIRECTORIES WHERE UPPER(DIRECTORY_NAME)='
WALLET_DIR
'; UTL_HTTP.SET_WALLET('file:/' || l_wallet_path); END; / SELECT UTL_HTTP.REQUEST('secret.encrypted-website.com
') FROM DUAL; -
(選用) 將查詢儲存在變數中並使用
EXECUTE IMMEDIATE
來測試網站存取情況。DECLARE l_wallet_path all_directories.directory_path%type; v_webpage_sql VARCHAR2(1000); v_results VARCHAR2(32767); BEGIN SELECT DIRECTORY_PATH INTO l_wallet_path FROM ALL_DIRECTORIES WHERE UPPER(DIRECTORY_NAME)='
WALLET_DIR
'; v_webpage_sql := 'SELECT UTL_HTTP.REQUEST(''secret.encrypted-website.com
'', '''', ''file:/' ||l_wallet_path||''') FROM DUAL'; DBMS_OUTPUT.PUT_LINE(v_webpage_sql); EXECUTE IMMEDIATE v_webpage_sql INTO v_results; DBMS_OUTPUT.PUT_LINE(v_results); END; / -
(選用) 尋找 Oracle 錢包目錄的檔案系統位置。
SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => '
WALLET_DIR
'));使用上一個命令的輸出執行 HTTP 請求。例如,如果目錄為
rdsdbdata/userdirs/01
,請執行下列查詢。SELECT UTL_HTTP.REQUEST('
https://secret.encrypted-website.com/
', '', 'file://rdsdbdata/userdirs/01
') FROM DUAL;