表題の件を試してみました。その作業ログです。
miyacleさんのこちらの記事を参考にさせてもらっています。ありがとうございます。
最初に鍵長が2048ビットの秘密鍵を作成します。作成されるファイル名はprivate.pemです。
% openssl genrsa -out private.pem 2048
Generating RSA private key, 2048 bit long modulus
.............+++
..............................................................................................................................................+++
e is 65537 (0x10001)
%
% openssl req -new -days 365 -key private.pem -out cert.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:**
State or Province Name (full name) []:******
Locality Name (eg, city) []:******
Organization Name (eg, company) []: *******
Organizational Unit Name (eg, section) []:*******
Common Name (eg, fully qualified host name) []:****.*****.***
Email Address []:*****.******@****.***
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:****
%
Country Name以下はそれぞれ適当に設定します。サーバー証明書に使うわけではないので、それほど厳密でなくても問題ありません。
% openssl x509 -in cert.csr -out cert.crt -req -signkey private.pem -days 365
Signature ok
subject=/C=**/ST=*****/L=********/O=******/OU=****/CN=****.******.****/emailAddress=****.********@*****.****
Getting Private key
%
これで署名に使う証明書や鍵のデータの準備はできました。
apex_web_service.make_rest_request_bファンクションを呼び出して、証明書ファイルを直接BLOBとして取り込みます。それをdbms_user_certs.add_certificateにて、スキーマに登録します。印刷されるGUIDは後で使用するので覚えておきます。(ALL_CERTIFICATESビューを検索して見つけることもできます。)
create or replace procedure sign_bc_household_expenses (p_expense_id in number) as -- sign row l_inst_id binary_integer; l_chain_id binary_integer; l_sequence_no binary_integer; l_row_data blob; -- RSA sign l_raw raw(2000); prvkey varchar2(2000) := '一行にしたprivate.pemの内容'; sign_raw raw(2000); sType PLS_INTEGER := DBMS_CRYPTO.SIGN_SHA512_RSA; kType PLS_INTEGER := DBMS_CRYPTO.KEY_TYPE_RSA; cert_guid raw(16) := hextoraw('証明書のGUID'); begin -- sign row select orabctab_inst_id$, orabctab_chain_id$, orabctab_seq_num$ into l_inst_id, l_chain_id, l_sequence_no from bc_household_expenses where expense_id = p_expense_id; dbms_blockchain_table.get_bytes_for_row_signature( 'APEXDEV', 'BC_HOUSEHOLD_EXPENSES', l_inst_id, l_chain_id, l_sequence_no, 1, l_row_data ); l_raw := dbms_lob.substr(l_row_data, dbms_lob.getlength(l_row_data)); sign_raw := dbms_crypto.sign ( src => l_raw, prv_key => utl_i18n.string_to_raw(prvkey, 'AL32UTF8'), pubkey_alg => kType, sign_alg => sType ); dbms_blockchain_table.sign_row( 'APEXDEV', 'BC_HOUSEHOLD_EXPENSES', l_inst_id, l_chain_id, l_sequence_no, NULL, sign_raw, cert_guid, DBMS_BLOCKCHAIN_TABLE.SIGN_ALGO_RSA_SHA2_512 ); end sign_bc_household_expenses;
作成したプロシージャを使って署名を付けます。
一度署名を付けたあと、再度実行すると以下のエラーが出力されました。
DBMS_BLOCKCHAIN_TABLE.VERIFY_ROWSで検証をしてみます。
Number of rows verified = 4といった形でレポートされます。