示例注册演练
本文介绍执行虚拟智能卡自助注册所需的步骤。 它介绍了使用用户设置的 PIN 自动批准的请求。
客户端对用户进行身份验证,然后请求经过身份验证的用户可以注册的配置文件模板的列表:
GET /CertificateManagement/api/v1.0/profiletemplates.
客户端向用户显示生成的列表。 用户选择名为“虚拟智能卡 VPN”和 UUID
97CD65FA-AF4B-4587-9309-0DD6BFD8B4E1
的 vSC (虚拟智能卡) 配置文件模板。客户端通过使用上一步中返回的 UUID 检索所选配置文件模板的注册策略:
GET /CertificateManagement/api/v1.0/profiletemplates/97CD65FA-AF4B-4587-9309-0DD6BFD8B4E1/policies/enroll
客户端分析返回的策略中的 DataCollection 字段,并注意到显示名为“请求原因”的单个数据收集项。 客户端还注意到 collectComments 标志设置为 false,因此不会提示用户输入任何。
用户输入要求证书的原因后,客户端将创建一个请求:
POST /CertificateManagement/api/v1.0/requests { "datacollection":"[{“Request Reason”:”Need VPN Certs”}]", "type":"Enroll", "profiletemplateuuid":"97CD65FA-AF4B-4587-9309-0DD6BFD8B4E1", "comment":"" }
服务器成功创建请求并将请求的 URI 返回到客户端:
/CertificateManagement/api/v1.0/requests/C6BAD97C-F97F-4920-8947-BE980C98C6B5
。客户端通过调用返回的 URI 检索请求对象:
GET /CertificateManagement/api/v1.0/requests/C6BAD97C-F97F-4920-8947-BE980C98C6B5
客户端验证请求中的 状态 属性是否设置为“已批准”。 请求执行可能会开始。
客户端通过分析 newsmartcarduuid 参数的内容,检查请求中是否存在与该请求关联的智能卡。
由于它只包含一个空 GUID,因此客户端必须使用 MIM CM 尚未使用的现有卡,或者在为虚拟智能卡配置配置文件模板时创建一个。
因为后一种情况已通过可注册配置文件模板的初始查询(第 1 步)向客户端指明,所以客户端现在必须创建虚拟智能卡设备。
客户端从配置文件模板检索智能卡策略。 它使用步骤 3 中选择的模板的 UUID:
GET /CertificateManagement/api/v1.0/profiletemplates/97CD65FA-AF4B-4587-9309-0DD6BFD8B4E1/configuration/smartcards
智能卡策略包含 DefaultAdminKeyHex 属性中卡的默认管理密钥。 创建智能卡时,客户端必须将智能卡的初始管理密钥设置为此密钥。
创建智能卡设备后,客户端必须将它分配给请求:
POST /CertificateManagement/api/v1.0/smartcards { "requestid":" C6BAD97C-F97F-4920-8947-BE980C98C6B5", "cardid":"23CADD5F-020D-4C3B-A5CA-307B7A06F9C9", }
服务器使用新创建的智能卡对象的 URI 响应客户端:
api/v1.0/smartcards/D700D97C-F91F-4930-8947-BE980C98A644
。客户端检索智能卡对象:
GET /CertificateManagement/api/v1.0/smartcards/ D700D97C-F91F-4930-8947-BE980C98A644
通过检查步骤 12 中获取的智能卡策略中 多样化adminkey 标志的值,客户端知道它必须使管理密钥多样化。
客户端检索建议的管理密钥:
GET /CertificateManagement/api/v1.0/requests/C6BAD97C-F97F-4920-8947-BE980C98C6B5/smartcards/D700D97C-F91F-4930-8947-BE980C98A644/diversifiedkey?cardid=23CADD5F-020D-4C3B-A5CA-307B7A06F9C9
客户端必须将该卡验证为管理员,才能设置管理密钥。 为此,客户端请求从智能卡中获取身份验证质询,并将它提交到服务器:
GET /CertificateManagement/api/v1.0/requests/C6BAD97C-F97F-4920-8947-BE980C98C6B5/smartcards/D700D97C-F91F-4930-8947-BE980C98A644/authenticationresponse?cardid=23CADD5F-020D-4C3B-A5CA-307B7A06F9C9&challenge=CFAA62118BBD25&diversified=false
服务器在 HTTP 响应正文中发送质询响应。 找到十六进制质询字符串,将它转换为 base64,再将它作为 URL 参数进行传递。 URL 返回另一个响应,该响应必须转换回十六进制格式。
服务器发送 HTTP 响应正文中的质询响应,并且客户端使用它来使管理密钥多样化。
客户端指出,用户必须通过检查智能卡策略中的 UserPinOption 字段来提供所需的 PIN。
当用户在对话中输入所需的 PIN 后,客户端将执行步骤 19 中所述的质询-响应身份验证,唯一的区别是,现在应将多元化标志设置为 true:
GET /CertificateManagement/api/v1.0/ requests/C6BAD97C-F97F-4920-8947-BE980C98C6B5/smartcards/D700D97C-F91F-4930-8947-BE980C98A644/authenticationresponse?cardid=23CADD5F-020D-4C3B-A5CA-307B7A06F9C9&challenge=CFAA62118BBD25&diversified=true
客户端使用从服务器收到的响应来设置所需的用户 pin。
客户端现在就可以生成证书请求。 它将查询配置文件模板证书生成参数,以确定应如何生成密钥/请求。
GET /CertificateManagement/api/v1.0/requests/C6BAD97C-F97F-4920-8947-BE980C98C6B5/certificaterequestgenerationoptions.
服务器使用单个 JSON 序列化的 CertificateRequestGenerationOptions 对象进行响应。 对象包括密钥的可导出性参数、证书友好名称、哈希算法、密钥算法、密钥大小等。 客户端使用这些参数来生成证书请求。
将单个证书请求提交到服务器。 当证书模板指定在 CA 上存档证书时,客户端还可以指定一个 PFX 密码,该密码应该用于解密任何 PFX Blob,即 CA 生成密钥对,然后将其发送到客户端。 客户端还可以选择添加一些注释。
POST /CertificateManagement/api/v1.0/requests/C6BAD97C-F97F-4920-8947-BE980C98C6B5/certificatedata { "pfxpassword":"", "certificaterequests":[ "MIIDZDC…” ] }
几秒钟后,服务器将使用单个 JSON 序列化的 Microsoft.Clm.Shared.Certificate 对象进行响应。 通过检查 isPkcs7 标志,客户端了解到此响应不是 PFX Blob。 客户端通过对 pkcs7 字符串进行 base64 解码来提取 Blob 并安装它。
客户端将请求标记为已完成。
PUT /CertificateManagement/api/v1.0/requests/C6BAD97C-F97F-4920-8947-BE980C98C6B5 { "status":"Completed" }