証明書失効の自動承認、及び、CRL情報の自動生成について。
証明書失効の自動承認 †
証明書の発行はともかく、失効は申請者の申告時点で自動的に失効としたいケースがある。
証明書の失効時に自動承認フラグを設定することで、失効申請の自動承認が可能である。
デフォルトではフラグが表示されていないが、Workflow設定を修正することで表示させることが可能。
... PENDING_USER: label: I18N_OPENXPKI_UI_WORKFLOW_STATE_CRR_REQUEST_COMPLETE_LABEL description: I18N_OPENXPKI_UI_WORKFLOW_STATE_CRR_REQUEST_COMPLETE_DESC action: - submit > CHECK_APPROVALS - update_crr > PENDING_USER - global_cancel > CANCELED output: - cert_identifier - reason_code - invalidity_time - delay_revocation_time - comment - flag_auto_approval # 設定追加 button: submit: format: expected update_crr: format: optional cancel: format: failure ... field: crr_info: label: I18N_OPENXPKI_UI_WORKFLOW_FIELD_CRR_INFO_LABEL name: crr_info type: server required: 0 flag_auto_approval: label: I18N_OPENXPKI_UI_WORKFLOW_FIELD_FLAG_CRR_AUTO_APPROVAL_LABEL name: flag_auto_approval description: I18N_OPENXPKI_UI_WORKFLOW_FIELD_FLAG_CRR_AUTO_APPROVAL_DESC type: bool # serverからboolへ required: 0 ...
Workflowは、以下のWorkflowモジュールをラップし拡張している。
URL Workflow - on https://metacpan.org/pod/Workflow
Workflowの定義は、Workflowモジュールを見れば大体わかると思う。
actionの記述については、OpenXPKIが定めているシンタックスなので確認しておく。
my ($auto, $global, $action_name, $next_state, $nn, $conditions) = ($action_item =~ m{ \A (\W?)(global_)?([\w\s]+\w)\s*>\s*(\w+)(\s*\?\s*([!\w\s]+))? }xs);
例えば、以下のワークフローのaction定義を見てみる。
以下は、NOTIFY_CRR_PENDING
のstateで2つのアクション定義がある。
?
以降のconditionに該当すれば、actionが実行され > state
で示されるstateに遷移する、というものである。
NOTIFY_CRR_PENDING: autorun: 1 action: - global_noop > PENDING ? pending_notification_send - send_pending_notification flag_pending_notification_send > PENDING ? !pending_notification_send
以下を抜き出してみよう。
- global_noop > PENDING ? pending_notification_send
- globalのnoopアクションを実行
- 次のstateはPENDING
- conditionは、pending_notification_send、(なお二番目のactionのconditionにある!は否定を示す)
1つのaction内に複数の指定がある場合は、内部的なアクションとして展開される。
実際には1つのステートに変換される。
{ 'observer' => [ { 'class' => 'OpenXPKI::Server::Workflow::Observer::AddExecuteHistory' }, { 'class' => 'OpenXPKI::Server::Workflow::Observer::Log' } ], 'persister' => 'OpenXPKI', 'state' => [ { 'name' => 'SUCCESS', 'action' => [] }, { 'name' => 'NOTIFY_CRR_PENDING_CRR_SEND_PENDING_NOTIFICATION_0', 'action' => [ { 'name' => 'crr_flag_pending_notification_send', 'resulting_state' => 'PENDING' } ], 'autorun' => 'yes' }, { 'name' => 'NOTIFY_CRR_PENDING', 'action' => [ { 'resulting_state' => 'PENDING', 'condition' => [ { 'name' => 'crr_pending_notification_send' } ], 'name' => 'global_noop' }, { 'resulting_state' => 'NOTIFY_CRR_PENDING_CRR_SEND_PENDING_NOTIFICATION_0', 'condition' => [ { 'name' => '!crr_pending_notification_send' } ], 'name' => 'crr_send_pending_notification' } ], 'autorun' => 'yes' }, { 'autorun' => 'yes', 'action' => [ { 'resulting_state' => 'PENDING_USER', 'name' => 'global_noop', 'condition' => [ { 'name' => '!global_is_automated_request' } ] }, { 'resulting_state' => 'CHECK_APPROVALS', 'name' => 'global_noop2', 'condition' => [ { 'name' => 'global_is_automated_request' }, { 'name' => '!global_is_signed_request' } ] }, { 'name' => 'crr_check_authorized_signer', 'condition' => [ { 'name' => 'global_is_automated_request' }, { 'name' => 'global_is_signed_request' } ], 'resulting_state' => 'CHECK_APPROVALS' } ], 'name' => 'CHECK_BATCHMODE' }, { 'name' => 'REJECTED', 'action' => [] }, { 'name' => 'CANCELED', 'action' => [] }, { 'name' => 'FAILURE', 'action' => [] }, { 'action' => [ { 'name' => 'crr_set_workflow_attributes', 'resulting_state' => 'CHECK_BATCHMODE' } ], 'name' => 'INITIAL_CRR_INITIALIZE_0', 'autorun' => 'yes' }, { 'name' => 'INITIAL', 'action' => [ { 'name' => 'crr_initialize', 'resulting_state' => 'INITIAL_CRR_INITIALIZE_0' } ] }, { 'autorun' => 'yes', 'action' => [ { 'name' => 'global_noop', 'resulting_state' => 'SUCCESS' } ], 'name' => 'CHECK_FOR_REVOCATION' }, { 'name' => 'PENDING', 'action' => [ { 'name' => 'crr_approve_crr', 'condition' => [ { 'name' => 'crr_acl_can_approve' }, { 'name' => 'crr_is_not_yet_revoked_or_pending' } ], 'resulting_state' => 'CHECK_APPROVALS' }, { 'resulting_state' => 'PENDING', 'condition' => [ { 'name' => 'crr_acl_can_approve' }, { 'name' => 'crr_is_not_yet_revoked_or_pending' } ], 'name' => 'crr_update_crr' }, { 'resulting_state' => 'REJECTED', 'name' => 'crr_reject_crr', 'condition' => [ { 'name' => 'crr_acl_can_reject' }, { 'name' => 'crr_is_not_yet_revoked_or_pending' } ] }, { 'resulting_state' => 'SUCCESS', 'name' => 'crr_cleanup', 'condition' => [ { 'name' => '!crr_is_not_yet_revoked_or_pending' } ] } ] }, { 'autorun' => 'yes', 'action' => [ { 'resulting_state' => 'NICE_DISPATCH_REVOKE', 'condition' => [ { 'name' => 'crr_is_not_yet_revoked_or_pending' } ], 'name' => 'crr_persist_crr' }, { 'condition' => [ { 'name' => '!crr_is_not_yet_revoked_or_pending' } ], 'name' => 'global_noop', 'resulting_state' => 'CHECK_FOR_REVOCATION' } ], 'name' => 'CRR_PERSIST' }, { 'action' => [ { 'resulting_state' => 'CHECK_FOR_REVOCATION', 'name' => 'global_nice_revoke_certificate' } ], 'name' => 'NICE_DISPATCH_REVOKE', 'autorun' => 'yes' }, { 'autorun' => 'yes', 'action' => [ { 'resulting_state' => 'CRR_PERSIST', 'condition' => [ { 'name' => 'crr_is_delayed_revocation' } ], 'name' => 'crr_delay_revocation' }, { 'condition' => [ { 'name' => '!crr_is_delayed_revocation' } ], 'name' => 'global_noop', 'resulting_state' => 'CRR_PERSIST' } ], 'name' => 'CHECK_FOR_DELAYED_REVOKE' }, { 'action' => [ { 'name' => 'crr_submit', 'resulting_state' => 'CHECK_APPROVALS' }, { 'name' => 'crr_update_crr', 'resulting_state' => 'PENDING_USER' }, { 'name' => 'global_cancel', 'resulting_state' => 'CANCELED' } ], 'name' => 'PENDING_USER' }, { 'autorun' => 'yes', 'action' => [ { 'condition' => [ { 'name' => '!crr_is_not_yet_revoked_or_pending' } ], 'name' => 'crr_cleanup', 'resulting_state' => 'CHECK_FOR_REVOCATION' }, { 'condition' => [ { 'name' => 'crr_is_approved' }, { 'name' => 'crr_is_not_yet_revoked_or_pending' } ], 'name' => 'global_noop', 'resulting_state' => 'CHECK_FOR_DELAYED_REVOKE' }, { 'name' => 'global_noop2', 'condition' => [ { 'name' => '!crr_is_approved' }, { 'name' => 'crr_is_not_yet_revoked_or_pending' } ], 'resulting_state' => 'NOTIFY_CRR_PENDING' } ], 'name' => 'CHECK_APPROVALS' } ], 'type' => 'certificate_revocation_request_v2' };
デフォルトのstateは、INITIAL
となっているので、Workflowの流れを追うときはINITIAL
を探しフローを追っていけば良い。
CRLの自動実行 †
CRLの発行は、Web画面で操作することで実行が可能である。
CRLの発行も1つのワークフローとなっており、CRLの発行操作に対して1つの作業IDが振られる。
CRLを自動発行したい場合は、コマンドラインから定期的にCRL発行のコマンドを実行すれば良い。cronで実行するのが簡単であろう。
openxpkicmd --realm ca-signer-1 crl_issuance
col_issuanceのワークフロー定義は以下である。
/etc/openxpki/config.d/realm/democa/workflow/def/crl_issuance
ワークフローの状態を確認するには、以下のコマンドできる。
# openxpkicli --realm democa --arg id=10239 get_workflow_info $VAR1 = { 'result' => { 'workflow' => { 'title' => 'I18N_OPENXPKI_UI_WORKFLOW_TYPE_CRL_ISSUANCE_LABEL', 'state' => 'SUCCESS', 'reap_at' => 1593862224, 'proc_state' => 'finished', 'id' => '10239', 'last_update' => '2020-07-04T11:25:24', 'label' => 'I18N_OPENXPKI_UI_WORKFLOW_TYPE_CRL_ISSUANCE_LABEL', 'count_try' => 0, 'type' => 'crl_issuance', 'context' => { 'workflow_id' => '10239', 'creator' => 'anonymous' }, 'wake_up_at' => 0, 'description' => 'I18N_OPENXPKI_UI_WORKFLOW_TYPE_CRL_ISSUANCE_DESC' } } };