Oracle CloudでAPIキーを登録する方法として、大きく2つあります。
- OCIコンソールでAPIキー・ペアを生成し、秘密キーのダウンロードを実行する。
- opensslを実行して、手元でキー・ペアを生成し、公開キーをAPIキーとして登録する。
APIキーの追加はユーザーの詳細のリソースより、APIキーを開いて実施します。
APIキーの追加をクリックしてダイアログを開き、APIキー・ペアの生成を選択します。秘密キーのダウンロードをクリックすると、クリデンシャルの作成時に指定する秘密キーが、ファイルとしてダウンロードされます。
ダウンロードされた秘密キーを見ると、ヘッダーとフッターがBEGIN PRIVATE KEYとEND PRIVATE KEYであることが確認できます。このファイル・フォーマットはPKCS#8です。
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCUH6zriPt/Oa/1
...
[中略]
....
645WM5ZXhQIEeNU7WFhe9Q==
-----END PRIVATE KEY-----
マニュアルでは、以下のコマンドを実行してAPIキーに使うキー・ペアを生成しています。
openssl genrsa -out ~/.oci/oci_api_key.pem 2048
生成されたファイルを見ると、ヘッダーとフッターがBEGIN RSA PRIVATE KEYとEND RSA PRIVATE KEYであることが確認できます。このファイル・フォーマットはPKCS#1です。
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAt2juWKiGzd43+Fc3qRfZE4rmgVfR4fmyvlz1Ep+JqY8wUWzU
...
[中略]
...
ui1D93DenZRMJe5SQO4YzWHZobSr0DCR7cqTcsWmwNdZEOK2I725bA==
-----END RSA PRIVATE KEY-----
どちらの方法で作成した秘密キーでも、問題なくクリデンシャルは作れていました。
これらの秘密キーの情報を使って作成するクリデンシャルとして、DBMS_CLOUD.CREATE_CREDENTIALを使って作成するものと、Oracle APEXのWeb資格証明として作成するものがあります。
結論をからいうと、秘密キーとしてPKCS#1とPKCS#8のどちらのフォーマットでクリデンシャル/Web資格証明を作っても問題ありません。
確認のために、オブジェクト・ストレージにJSONファイルを配置し、それを読み取ってみました。JSONファイルは以下のパスよりアクセスします。
クリデンシャルを与えずにアクセスすると、BucketNotFoundが発生します。
{"code": "BucketNotFound","message": "Either the bucket named 'data' does not exist in the namespace 'ネームスペース' or you are not authorized to access it"}
APEXでのWeb資格証明の作成
APEXでは、ワークスペース・ユーティリティのWeb資格証明(または各アプリケーションの共有コンポーネントのWeb資格証明)よりクリデンシャルを作成します。
Web資格証明の名前をMY_DATA_CRED8とし、OCI秘密キーにファイル・フォーマットがPKCS#8のデータを与えます。OCIユーザーID、OCIテナンシIDおよびOCI公開キー・フィンガープリントは、APIキーを作成した際に表示される構成情報に含まれています。
ここで使用したPKCS#8の秘密キーをPKCS#1にフォーマット変換します。PKCS#8のデータをpkcs8.pemに書き込み、opensslの以下のコマンドを実行します。
openssl rsa -in pkcs8.pem -outform PEM -out pkcs1.pem
生成したPKCS#1の秘密キーを使って、PKCS#8のときと同様にWeb資格証明を作成します。名前はMY_DATA_CRED1とします。OCI秘密キー以外は同じ値を設定します。
PKCS#1からPKCS#8を生成する場合は、以下のコマンドを使用します。
openssl pkcs8 -topk8 -nocrypt -in pkcs1.pem -outform PEM -out pkcs8.pem
RESTデータ・ソースの確認
APEXアプリケーションの共有コンポーネントより、RESTデータ・ソースを作成します。
作成済のRESTデータ・ソースが一覧されます。作成をクリックします。
RESTデータ・ソースの作成として最初からを選択し、次へ進みます。
RESTデータ・ソース・タイプとして簡易HTTPを選択し、名前はF1レース-PKCS#8、URLエンドポイントとして、オブジェクト・ストレージ上のJSONファイルへのパスを指定します。
次へ進みます。
リモート・サーバー、ベースURLおよびサービスURLパスは自動的に決まるので、そのまま変更しません。
次へ進みます。
ページ区切りタイプとして、ページ区切りなしを選択します。
次へ進みます。
検出を実行します。
JSONファイルの内容が表示されます。これで資格証明のMY_DATA_CRED8が有効であることが確認できました。
RESTデータ・ソースの作成をクリックして、確認作業は終了です。
同様の手順で、資格証明としてMY_DATA_CRED1を使ったRESTデータ・ソースF1レース-PKCS#1を作成します。
こちらも問題なく作成できます。
APEX_WEB_SERVICE.MAKE_REST_REQUESTの確認
APEX_WEB_SERVICE.MAKE_REST_REQUESTを呼び出す以下のコードを実行し、JSONファイルが取得できるか確認します。p_credential_static_idにWeb資格証明の静的IDを指定します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
declare | |
l_clob clob; | |
begin | |
l_clob := apex_web_service.make_rest_request( | |
p_url => 'https://objectstorage.us-ashburn-1.oraclecloud.com/n/ネームスペース/b/data/o/f1-races-2022.json' | |
, p_http_method => 'GET' | |
, p_credential_static_id => 'MY_DATA_CRED8' | |
); | |
dbms_output.put_line(l_clob); | |
end; |
SQLワークショップのSQLコマンドから実行します。
資格証明のMY_DATA_PKCS8、MY_DATA_PKCS1の両方で、JSONファイルが取得できることが確認できます。
OCIのクリデンシャルの作成
DBMS_CLOUD.CREATE_CREDENTIALを呼び出す以下のスクリプトを実行し、Oracle CloudのAPIで使用できるクリデンシャルを作成します。引数のuser_ocid、tenancy_ocid、fingerprintに与える値は、はAPIキーを作成した際に表示された構成情報に含まれています。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
declare | |
C_RSA_KEY constant varchar2(4000) := q'~ | |
*** 秘密キーの貼り付け *** | |
~'; | |
l_oneline_key varchar2(4000); | |
begin | |
-- 一行にする。 | |
l_oneline_key := regexp_replace( | |
C_RSA_KEY | |
,'(-+((BEGIN|END) (RSA )?(PUBLIC|PRIVATE) KEY)-+\s?|\s)' | |
, ''); | |
dbms_cloud.create_credential( | |
credential_name => 'MY_DATA_CRED8' | |
, user_ocid => '構成ファイルのuser=で指定されているOCID' | |
, tenancy_ocid => '構成ファイルのtenancy=で指定されているOCID' | |
, private_key => l_oneline_key | |
, fingerprint => '構成ファイルのfingerprint=で指定されている値' | |
); | |
end; | |
/ |
秘密キーがPKCS#8のクリデンシャルMY_DATA_CRED8を作成します。APEXのワークスペース・スキーマに、パッケージDBMS_CLOUDの実行権限が割り当てられている必要があります。
同様の手順で、秘密キーがPKCS#1のクリデンシャルMY_DATA_CRED1を作成します。
作成されたクリデンシャルを確認します。
select credential_name, enabled from user_credentials where credential_name like 'MY_DATA%'
APEXのWeb資格証明とは保存先が異なるため、名前が同じでも実体は異なります。
DBMS_CLOUD.SEND_REQUESTの確認
DBMS_CLOUD.SEND_REQUESTを使って確認します。以下のコードを実行します。APEXのワークスペース・スキーマには、パッケージDBMS_CLOUDに加えて、DBMS_CLOUD_TYPESの実行権限が必要です。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
declare | |
l_resp dbms_cloud_types.resp; | |
l_clob clob; | |
l_status_code pls_integer; | |
begin | |
l_resp := dbms_cloud.send_request( | |
credential_name => 'MY_DATA_CRED8' | |
, uri => 'https://objectstorage.us-ashburn-1.oraclecloud.com/n/ネームスペース/b/data/o/f1-races-2022.json' | |
, method => 'GET' | |
); | |
l_status_code := dbms_cloud.get_response_status_code(l_resp); | |
dbms_output.put_line('Status Code: ' || l_status_code); | |
l_clob := dbms_cloud.get_response_text(l_resp); | |
dbms_output.put_line(l_clob); | |
end; |
クリデンシャルMY_DATA_CRED8およびMY_DATA_CRED1の両方で、JSONファイルの取得に成功します。
PL/SQL SDKの確認
OCIのオブジェクト・ストレージPL/SQL SDKを使用します。APEXのワークスペース・スキーマに以下の権限が与えらられているのが前提です。
grant execute on dbms_cloud_oci_obs_object_storage_get_object_response_t to apexdev;
grant execute on dbms_cloud_oci_obs_object_storage to apexdev;
確認のために、以下のコードを実行します。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
declare | |
l_response dbms_cloud_oci_obs_object_storage_get_object_response_t; | |
l_status_code number; | |
plsql_sdk_error exception; | |
begin | |
l_response := dbms_cloud_oci_obs_object_storage.get_object( | |
namespace_name => 'ネームスペース' | |
,bucket_name => 'data' | |
,object_name => 'f1-races-2022.json' | |
,region => 'us-ashburn-1' | |
,credential_name => 'MY_DATA_CRED8' | |
); | |
l_status_code := l_response.status_code; | |
if l_status_code != 200 then | |
raise plsql_sdk_error; | |
end if; | |
dbms_output.put_line(to_clob(l_response.response_body)); | |
end; |
クリデンシャルMY_DATA_CRED8およびMY_DATA_CRED1の両方で、JSONファイルの取得に成功します。
以上で、クリデンシャルの秘密キーのフォーマットが、PKCS#1とPKCS#8のどちらでも問題なく使用できることが確認できました。
完