13.8. EE のサーバー側キー生成
13.8.1. 概要
Firefox v69 以降や Chrome など、多くの新しいバージョンのブラウザーでは、PKI キーを生成する機能と、キーアーカイブ用の CRMF のサポートが削除されています。CRMFPopClient ("CRMFPopClient --help" を参照) や pki ("pki client-cert-request --help" を参照) などの CLI は、Fedora または RHEL プラットフォームでの回避策として使用できますが、他のプラットフォーム上のクライアントはほとんど使用されていません。
サーバー側の Keygen の登録は、トークンキー管理システム (TMS) の導入以来、長い間行われてきました。このシステムでは、キーをスマートカードでローカルに生成するのではなく、KRA で生成できます。PKI v.10.5 以降では、ブラウザーのキー生成の問題を解決するための同様のメカニズムが導入されています。鍵はサーバー (具体的には KRA) で生成され、PKCS#12 のクライアントに安全に転送されます。
暗号化証明書にのみサーバー側 Keygen メカニズムを使用することが強く推奨されます。
13.8.2. 主な機能
- 証明書要求キーは KRA で生成されます (注: CA と連携するには、KRA をインストールする必要があります)。
- プロファイルのデフォルトプラグイン serverKeygenUserKeyDefaultImpl は、キーアーカイブ (つまり “enableArchival” パラメーター) を有効または無効にするための選択を提供します。
- RSA 鍵と EC 鍵の両方のサポート
- 手動 (エージェント) 承認と自動承認 (ディレクトリーパスワードベースなど) の両方のサポート
13.8.3. インストール設定
サーバー側 Keygen を設定するには、CA に加えて KRA インスタンスが必要です。
CA と KRA が Tomcat インスタンスを共有している場合は、トランスポート証明書をインポートするために以下の手順を実行する必要はありません。
CA インスタンスおよび KRA インスタンスをインストールした後に、スタンドアロンの Tomcat Web サーバーインスタンスの場合には、CA の nssdb に KRA トランスポート証明書を追加する必要があります。
まず CA をシャットダウンします。
Systemctl stop pki-tomcatd@<ca_instance_name>.service e.g. # Systemctl stop pki-tomcatd@pki-ca.service
Systemctl stop pki-tomcatd@<ca_instance_name>.service
e.g.
# Systemctl stop pki-tomcatd@pki-ca.service
KRA の輸送証明書をファイルにエクスポートします。
- KRA トランスポート証明書を検索してエクスポートします。
grep "kra.transport.cert=" /var/lib/pki/<kra_instance_name>/kra/conf/CS.cfg | sed 's/kra.transport.cert=//' > <kra transport cert file> e.g. # grep "kra.transport.cert=" /var/lib/pki/pki-kra/kra/conf/CS.cfg | sed 's/kra.transport.cert=//' > /tmp/kraTransport.cert
grep "kra.transport.cert=" /var/lib/pki/<kra_instance_name>/kra/conf/CS.cfg | sed 's/kra.transport.cert=//' > <kra transport cert file>
e.g.
# grep "kra.transport.cert=" /var/lib/pki/pki-kra/kra/conf/CS.cfg | sed 's/kra.transport.cert=//' > /tmp/kraTransport.cert
CA の CS.cfg で指定されたニックネームを使用して、KRA のトランスポート証明書を CA の nssdb にインポートします。
- トランスポート証明書のニックネームをリスト表示します。
grep "ca.connector.KRA.transportCertNickname" /var/lib/pki/<ca_instance_name>/ca/conf/CS.cfg e.g. # grep "ca.connector.KRA.transportCertNickname" /var/lib/pki/pki-ca/ca/conf/CS.cfg ca.connector.KRA.transportCertNickname=KRA transport cert
grep "ca.connector.KRA.transportCertNickname" /var/lib/pki/<ca_instance_name>/ca/conf/CS.cfg
e.g.
# grep "ca.connector.KRA.transportCertNickname" /var/lib/pki/pki-ca/ca/conf/CS.cfg
ca.connector.KRA.transportCertNickname=KRA transport cert
- 上記のステップでリストしたニックネームを使用してインポートします。
certutil -d /var/lib/pki/<ca_instance_name>/alias -A -t “,,” -n <transportNickName> -i <kra transport cert file> e.g. # certutil -d /var/lib/pki/pki-ca/alias -A -t “,,” -n "KRA transport cert" -i /tmp/kraTransport.cert
certutil -d /var/lib/pki/<ca_instance_name>/alias -A -t “,,” -n <transportNickName> -i <kra transport cert file>
e.g.
# certutil -d /var/lib/pki/pki-ca/alias -A -t “,,” -n "KRA transport cert" -i /tmp/kraTransport.cert
CA を開始します。
systemctl start pki-tomcatd@<ca_instance_name>.service e.g. # Systemctl start pki-tomcatd@pki-ca.service
systemctl start pki-tomcatd@<ca_instance_name>.service
e.g.
# Systemctl start pki-tomcatd@pki-ca.service
13.8.4. プロファイル設定
サーバー側で鍵が生成される証明書の登録を許可するために、caServerKeygen_UserCert および caServerKeygen_DirUserCert の 2 つのデフォルトプロファイルがデフォルトで提供されます。ただし、正しい入力、出力、およびポリシー設定を持つプロファイルは、サーバー側の keygen プロファイルに切り替えることができます。
Server-Side Keygen プロファイルには、以下のコンポーネントが含まれている必要があります。
13.8.4.1. 入力
input.i1.class_id=serverKeygenInputImpl
input.i1.class_id=serverKeygenInputImpl
13.8.4.2. 出力
output.o1.class_id=pkcs12OutputImpl
output.o1.class_id=pkcs12OutputImpl
13.8.4.3. Policyset
生成された PKCS12 のパスワードは、次のポリシーで適用できます。
policyset.userCertSet.11.constraint.class_id=p12ExportPasswordConstraintImpl policyset.userCertSet.11.constraint.name=PKCS12 Password Constraint policyset.userCertSet.11.constraint.params.password.minSize=20 policyset.userCertSet.11.constraint.params.password.minUpperLetter=2 policyset.userCertSet.11.constraint.params.password.minLowerLetter=2 policyset.userCertSet.11.constraint.params.password.minNumber=2 policyset.userCertSet.11.constraint.params.password.minSpecialChar=2 policyset.userCertSet.11.constraint.params.password.seqLength=6 policyset.userCertSet.11.constraint.params.password.maxRepeatedChar=3 policyset.userCertSet.11.default.class_id=noDefaultImpl policyset.userCertSet.11.default.name=No Default
policyset.userCertSet.11.constraint.class_id=p12ExportPasswordConstraintImpl
policyset.userCertSet.11.constraint.name=PKCS12 Password Constraint
policyset.userCertSet.11.constraint.params.password.minSize=20
policyset.userCertSet.11.constraint.params.password.minUpperLetter=2
policyset.userCertSet.11.constraint.params.password.minLowerLetter=2
policyset.userCertSet.11.constraint.params.password.minNumber=2
policyset.userCertSet.11.constraint.params.password.minSpecialChar=2
policyset.userCertSet.11.constraint.params.password.seqLength=6
policyset.userCertSet.11.constraint.params.password.maxRepeatedChar=3
policyset.userCertSet.11.default.class_id=noDefaultImpl
policyset.userCertSet.11.default.name=No Default
このポリシーでは以下を設定できます。
-
password.minSize
- パスワードの最小サイズ。 -
password.minUpperLetter
- 大文字の最小数。 -
password.minLowerLetter
- 小文字の最小数。 -
password.minNumber
- 最小桁数。 -
password.minSpecialChar
- 句読点の最小数。 -
password.seqLength
- 繰り返すことのできない部分文字列シーケンスのサイズ。 -
password.maxRepeatedChar
- 各文字の最大繰り返し回数。
制約に特定の設定が含まれていない場合は、CS.cfg
からオプションを読み取ります。名前が異なる場合は、接頭辞 password.
が passwordChecker.
に置き換えられます。CS.cfg
内の設定はすべてのパスワードに使用されますが、各プロファイルを上書きして、より強力なパスワードまたは脆弱なパスワードを許可できます。
キータイプとキーサイズのパラメーターは、以下に例示するように設定できます。
policyset.userCertSet.3.constraint.class_id=keyConstraintImpl policyset.userCertSet.3.constraint.name=Key Constraint policyset.userCertSet.3.constraint.params.keyType=- policyset.userCertSet.3.constraint.params.keyParameters=1024,2048,3072,4096,nistp256,nistp384,nistp521 policyset.userCertSet.3.default.class_id=serverKeygenUserKeyDefaultImpl policyset.userCertSet.3.default.name=Server-Side Keygen Default policyset.userCertSet.3.default.params.keyType=RSA policyset.userCertSet.3.default.params.keySize=2048 policyset.userCertSet.3.default.params.enableArchival=true
policyset.userCertSet.3.constraint.class_id=keyConstraintImpl
policyset.userCertSet.3.constraint.name=Key Constraint
policyset.userCertSet.3.constraint.params.keyType=-
policyset.userCertSet.3.constraint.params.keyParameters=1024,2048,3072,4096,nistp256,nistp384,nistp521
policyset.userCertSet.3.default.class_id=serverKeygenUserKeyDefaultImpl
policyset.userCertSet.3.default.name=Server-Side Keygen Default
policyset.userCertSet.3.default.params.keyType=RSA
policyset.userCertSet.3.default.params.keySize=2048
policyset.userCertSet.3.default.params.enableArchival=true
13.8.4.4. 認証
デフォルトのサーバー側の keygen 登録プロファイルは認証メカニズムによって異なります。ここでは、以下のようになります。
- caServerKeygen_UserCert.cfg
- "auth.class_id=" への空の値が含まれます。つまり、このプロファイルを介した登録要求には CA エージェントからの承認が必要になります。
- caServerKeygen_DirUserCert.cfg
- これには、"auth.instance_id=UserDirEnrollment" が含まれます。これは、ユーザーが LDAP uid/password 認証を渡すのに必要なことを意味します。このような認証は、CA エージェントからの要求ごとの承認を必要としないため、自動証明書として見なされます。
caServerKeygen_DirUserCert.cfg プロファイルで説明されるように、auth.instance_id ディレクティブを互換性のある認証プラグインクラスに設定すると、自動承認を設定できます。CS.cfg での設定例を次に示します。
auths.instance.UserDirEnrollment.dnpattern= auths.instance.UserDirEnrollment.ldap.basedn=ou=People,dc=example,dc=com auths.instance.UserDirEnrollment.ldap.ldapconn.host=host.example.com auths.instance.UserDirEnrollment.ldap.ldapconn.port=389 auths.instance.UserDirEnrollment.ldap.ldapconn.secureConn=false auths.instance.UserDirEnrollment.ldap.maxConns= auths.instance.UserDirEnrollment.ldap.minConns= auths.instance.UserDirEnrollment.ldapByteAttributes= auths.instance.UserDirEnrollment.ldapStringAttributes=mail auths.instance.UserDirEnrollment.pluginName=UidPwdDirAuth
auths.instance.UserDirEnrollment.dnpattern=
auths.instance.UserDirEnrollment.ldap.basedn=ou=People,dc=example,dc=com
auths.instance.UserDirEnrollment.ldap.ldapconn.host=host.example.com
auths.instance.UserDirEnrollment.ldap.ldapconn.port=389
auths.instance.UserDirEnrollment.ldap.ldapconn.secureConn=false
auths.instance.UserDirEnrollment.ldap.maxConns=
auths.instance.UserDirEnrollment.ldap.minConns=
auths.instance.UserDirEnrollment.ldapByteAttributes=
auths.instance.UserDirEnrollment.ldapStringAttributes=mail
auths.instance.UserDirEnrollment.pluginName=UidPwdDirAuth
13.8.5. Server-Side Keygen を使用した証明書の登録
デフォルトの Sever-Side Keygen 登録プロファイルは、EE ページの “List Certificate Profiles” タブにあります。
13.8.5.1. サーバー側の鍵の生成を使用した手動ユーザーのデュアル使用証明書登録
図13.2 エージェントの手動による承認を必要とするサーバー側のキータイプの登録

13.8.5.2. サーバー側の鍵生成を使用したディレクトリー認証ユーザーのデュアル使用証明書の登録
図13.3 LDAP の uid/pwd 認証が正常に実行されると自動的に承認されるサーバー側のキータイプの登録

リクエストの承認方法に関係なく、Server-Side Keygen Enrollment メカニズムでは、エンドエンティティーユーザーが PKCS#12 パッケージのパスワードを入力する必要があります。このパスワードには、発行された証明書と、発行後にサーバーによって生成された暗号化された秘密鍵が含まれます。
パスワードは共有しないでください。CA や KRA のエージェントでさえありません。
登録要求が承認されると、PKCS#12 パッケージが生成され、以下が行われます。
- 手動承認の場合、PKCS#12 ファイルは要求を承認する CA エージェントに返されます。その後、エージェントは PKCS#12 ファイルをユーザーに転送することが期待されます。
- 自動承認の場合、PKCS#12 ファイルはリクエストを送信したユーザーに返されます。
図13.4 エージェントによる手動による登録

PKCS#12 を受信すると、ユーザーは pkcs12util などの CLI を使用して、各アプリケーションの PKCS#12 ファイルをアプリケーションごとのユーザー内部の証明書/キーデータベースにインポートできます。たとえば、ユーザーの Firefox nss データベースです。
13.8.6. キーリカバリー
証明書登録プロファイルで enableArchival パラメーターが true に設定されている場合、Server-Side Keygen 登録時に秘密鍵がアーカイブされます。その後、アーカイブされた秘密鍵は、認定 KRA エージェントにより復元できます。
13.8.7. 追加情報
13.8.7.1. KRA 要求レコード
このメカニズムの性質上、プロファイルで enableArchival パラメーターが true に設定されている場合、Server-Side keygen 要求ごとに 2 つの KRA 要求レコードがあります。
要求タイプ “asymkeyGenRequest” 用
- この要求タイプは、KRA エージェントページの “List Requests” でフィルタリングすることはできません。“Show All Requests” を選択して、リストを表示できます。
- 要求タイプの “recovery” 用
13.8.7.2. 監査レコード
有効にした場合には、以下の監査レコードを確認することができます。
CA
- SERVER_SIDE_KEYGEN_ENROLL_KEYGEN_REQUEST
- SERVER_SIDE_KEYGEN_ENROLL_KEY_RETRIEVAL_REQUEST
KRA
- SERVER_SIDE_KEYGEN_ENROLL_KEYGEN_REQUEST_PROCESSED
- SERVER_SIDE_KEYGEN_ENROLL_KEY_RETRIEVAL_REQUEST_PROCESSED (まだ実装されていません)