OpenXPKI

証明書失効の自動承認、及び、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

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'
                                      }
                      }
        };

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
目次
ダブルクリックで閉じるTOP | 閉じる
GO TO TOP