本文由机器翻译。若要查看英语原文,请勾选“英语”复选框。 也可将鼠标指针移到文本上,在弹出窗口中显示英语原文。
翻译
英语

智能卡体系结构

 

适用对象:Windows Vista, Windows Server 2008, Windows 7, Windows 8.1, Windows Server 2008 R2, Windows Server 2012 R2, Windows Server 2012, Windows 8

面向 IT 专业人士的本主题介绍在 Windows 操作系统,包括凭据提供程序体系结构和智能卡子系统的体系结构中支持智能卡的系统体系结构。

身份验证是一个用于对象或人员身份进行验证的过程。 当您进行身份验证的对象如智能卡外,目的是验证对象为正版。 当对用户进行身份验证时,目的是验证您所不面对冒名顶替。

在网络环境中,身份验证是指证明网络应用程序或资源的身份的动作。 通常情况下,标识证明由使用只有用户知道的密钥的加密操作 (如公钥加密),或共享的密钥。 身份验证交换的服务器端会将签名数据和已知的加密密钥相比较来验证身份验证尝试。 将加密密钥存储在安全的中心位置中可以确保身份验证过程可伸缩且可维护。

智能卡的 Windows 支持符合安全的身份验证要求,且是可扩展的以便您可以包括自定义凭据提供程序的提供程序体系结构。 本主题包含下列相关信息:

有关详细信息,请参阅 Windows 身份验证体系结构 Windows 身份验证技术概述在本主题说明对于 Windows 的早期和当前版本的 Windows 身份验证的基本体系结构方案。

下表列出了在交互式登录的体系结构的 Windows Server 和 Windows 操作系统中包含的组件。

 

组件

说明

Winlogon

提供了一个交互式登录基础结构。

登录用户界面

提供交互式 UI 呈现。

凭据提供程序 (密码和智能卡)

介绍凭据信息和序列化的凭据。

本地安全机构 (LSA)

进程的登录凭据。

身份验证包

包括 NTLM 和 Kerberos 协议。 与用户进行身份验证的服务器身份验证包进行通信。

在 Windows 中的交互式登录在用户按下 CTRL + ALT + DEL 时开始。 CTRL + ALT + DEL 键组合称为安全注意序列 (SAS)。 若要防止其他程序和进程使用它,Winlogon 在启动过程中注册此序列。

收到后该 SAS,UI 然后生成的登录磁贴从接收来自已注册的凭据提供程序的信息。 下图显示的 Windows 操作系统中的凭据提供程序的体系结构。

Flow chart

图 1凭据提供程序体系结构

通常情况下,使用本地帐户或域帐户登录到计算机的用户必须输入用户名和密码。 这些凭据用于验证用户的标识。 有关智能卡登录时,智能卡安全芯片上包含用户的凭据。 智能卡读卡器允许计算机与智能卡上的安全芯片进行交互。 当用户使用智能卡登录时,则他们输入而不是用户名和密码的个人标识号 (PIN)。

凭据提供程序是在本地系统上运行,用于收集凭据的进程内 COM 对象。 登录用户界面提供交互式 UI 呈现,Winlogon 提供交互式登录的基础结构,以及凭据提供程序处理这两个用于帮助收集和处理凭据这些组件。

Winlogon 指示登录用户界面在接收到它 SAS 事件后显示凭据提供程序图块。 登录用户界面会查询每个凭据提供程序凭据它想要枚举的数量。 凭据提供程序可以选择将这些磁贴之一指定为默认值。 所有提供程序已经枚举其磁贴后,登录用户界面为用户显示它们。 在用户磁贴以将提供正确的凭据与交互。 登录用户界面将提交这些凭据进行身份验证。

与支持硬件结合使用,则可以将凭据提供程序扩展 Windows 操作系统以使用户能够通过使用生物识别 (例如,指纹、 视网膜,或语音识别)、 密码、 PIN、 智能卡证书或任何自定义身份验证包中进行登录。 企业和 IT 专业人员可以开发和部署所有的域用户的自定义身份验证机制和它们显式可能要求用户使用此自定义的登录机制。

System_CAPS_note注意

凭据提供程序不是强制机制。 它们用于收集和序列化的凭据。 LSA 和身份验证包强制实施安全。

凭据提供程序可以用于单一登录 (SSO) 支持。 在此过程中,它们进行身份验证到安全的网络访问点的用户 (通过使用 RADIUS 和其他技术) 用于登录到计算机。 凭据提供程序还旨在支持特定于应用程序的凭据收集,并可用于对网络资源将计算机加入到域,或提供管理员同意的情况下用户帐户控制 (UAC) 的身份验证。

多个凭据提供程序可以在一台计算机上共存。

必须在运行 Windows 的计算机上注册的凭据提供程序和他们有责任:

  • 描述所需的身份验证的凭据信息。

  • 处理通信和逻辑与外部身份验证机构。

  • 打包的凭据交互式和网络登录。

System_CAPS_note注意

凭据提供程序 API 不呈现用户界面。 它描述了需要呈现的内容。

只有密码凭据提供程序是在安全模式下可用。

智能卡凭据提供程序在网络过程是在安全模式下可用。

供应商提供了智能卡和智能卡读卡器,并在许多情况下供应商是不同的智能卡和智能卡读卡器。 智能卡读卡器的驱动程序将写入到个人计算机/智能卡 (PC/SC) 标准版本 1.0。 每个智能卡必须具有使用 CryptoAPI 接口来启用加密操作来说,凭据服务提供程序 (CSP) 和 WinSCard Api 以启用与智能卡硬件之间的通信。

图 2 显示了 CryptoAPI、 Csp、 智能卡基本加密服务提供程序 (基本 CSP) 和智能卡 minidrivers 之间的关系。

Flow chart

图 2基本 CSP 和智能卡微型驱动程序体系结构

智能卡体系结构使用缓存机制以帮助简化操作和改进对 PIN 的用户的访问。

  • 数据缓存

    若要最小化智能卡 I/O 操作的单个进程提供数据缓存。

  • 固定缓存

    PIN 缓存可帮助用户无需智能卡未经过身份验证的每次都重新输入 PIN。

每个 CSP 单独实现当前的智能卡数据缓存。 基本 CSP 实现可靠的缓存机制,允许一个进程来最小化智能卡 I/O 操作。

现有全局缓存工作方式如下:

  1. 应用程序请求加密操作。 例如,用户证书是从智能卡读取。

  2. CSP 检查其缓存的项。

  3. 如果在缓存中,找不到该项目,或者如果该项已缓存,但不是最新,从智能卡读取项。

  4. 已从智能卡读取的任何项后,则将它添加到缓存。 该项目的任何现有过期副本将被替换。

三种类型的对象或数据所缓存的 CSP: pin (有关详细信息,请参阅固定缓存)、 证书和文件。 如果任何缓存的数据更改,是从智能卡在后续操作中读取相应的对象。 例如,如果一个文件写入到智能卡中,CSP 缓存便会过期的文件,并且其他进程读取智能卡至少一次刷新其 CSP 缓存。

在智能卡的 Windows 服务中承载的全局数据缓存。 Windows 包括两个公共智能卡 API 调用,SCardWriteCacheSCardReadCache 这些 API 调用会使缓存功能可用于应用程序的全局数据。 每个符合智能卡微型驱动程序规范的智能卡都有一个 16 字节卡标识符。 此值用于唯一地标识与给定的智能卡相关的缓存的数据。 使用标准的 Windows GUID 类型。 这些 Api 允许应用程序将数据添加到和从全局缓存中读取数据。

PIN 缓存可防止用户每次智能卡未经过身份验证时输入 PIN。 智能卡进行身份验证后,它将不区分这些宿主端应用程序 — — 任何应用程序可以访问智能卡上的私有数据。

若要缓解此问题,智能卡排他状态时进入应用程序向智能卡进行身份验证。 但是,这意味着其他应用程序无法与智能卡进行通信并且将被阻止。 因此,这种独占的连接是最小化。 此问题是一种协议 (如 Kerberos 协议) 需要多个签名操作。 因此,该协议在较长时段,要求独占访问智能卡或它需要多个身份验证操作。 这是其中 PIN 缓存用于尽可能地减少独占使用智能卡不会强制用户输入 PIN 多次。

下面的示例说明了其工作方式。 在此方案中,有两个应用程序:Outlook 和 Internet Explorer。 应用程序使用智能卡进行不同的用途。

  1. 用户启动 Outlook 并尝试发送已签名的电子邮件。 私钥是智能卡上。

  2. Outlook 会提示用户提供智能卡 PIN。 用户输入正确的 PIN。

  3. 电子邮件数据发送到用于签名操作的智能卡中。 Outlook 客户端设置响应的格式并发送的电子邮件。

  4. 用户将打开 Internet Explorer 并尝试访问受保护的站点的客户端要求传输层安全性 (TLS) 身份验证。

  5. Internet Explorer 将提示用户提供智能卡 PIN。 用户输入正确的 PIN。

  6. 在智能卡上发生的 TLS 相关的私有密钥操作和用户进行身份验证和登录。

  7. 用户返回到 Outlook 发送另一个已签名的电子邮件。 这一次,不提示用户输入 PIN 因为 PIN 缓存从以前的操作。 同样,如果用户再次使用另一操作的 Internet Explorer,Internet Explorer 将不会在 PIN 中提示用户。

基本 CSP 内部维护每个进程缓存的 PIN。 PIN 是加密和存储在内存中。 用于保护 PIN 的函数是RtlEncryptMemoryRtlDecryptMemory,和RtlSecureZeroMemory,这将清空包含 PIN 的缓冲区。

在响应中CryptAcquireContextCryptoAPI 中的调用、 基本 CSP 尝试匹配到特定的智能卡和读卡器的调用方指定的容器。 调用方可以提供容器名称特异性的不同级别下表中所示并按从最特定到最宽泛的请求。

同样,在响应NCryptOpenKeyCNG,智能卡 KSP 中的调用尝试匹配容器相同的方式,和它采用相同的容器格式下, 表中所示。

System_CAPS_note注意

在通过使用智能卡 KSP 打开一个键之前, 必须进行的调用到 NCryptOpenStorageProvider (MS_SMART_CARD_KEY_STORAGE_PROVIDER)。

类型

名称

格式

读取器名称和容器名称

\\。 \ < 读取器名称 > \ < 容器名称 >

II

读取器名称和容器名称 (NULL)

\\。 \ < 读取器名称 >

III

仅容器名称

< 容器名称 >

IV

仅默认容器 (NULL)

NULL

基本 CSP 和智能卡 KSP 缓存智能卡处理有关调用进程以及有关该进程已访问智能卡的信息。 当搜索的智能卡容器,基本的 CSP 或智能卡 KSP 首先检查其缓存的进程。 如果缓存的句柄无效或不存在任何匹配,SCardUIDlgAPI 调用以获取了卡句柄。

以下三个容器操作均可通过使用请求CryptAcquireContext:

  1. 创建一个新容器。 (CryptAcquireContext 的 CNG 等效,dwFlags 设置为 CRYPT_NEWKEYSET 是 NCryptCreatePersistedKey。)

  2. 打开现有容器。 (若要打开该容器的 CryptAcquireContext 的 CNG 等效项是 NCryptOpenKey。)

  3. 删除容器。 (CryptAcquireContext 的 CNG 等效,dwFlags 设置为 CRYPT_DELETEKEYSET 是 NCryptDeleteKey。)

用于将加密的句柄与特定的智能卡和读卡器相关联的试探法基于请求的容器操作和使用的容器规范的级别。

下表显示了对容器创建操作的限制。

规格

限制

没有无提示的上下文

密钥容器创建始终必须能够显示用户界面,例如 PIN 提示。

不覆盖现有容器

如果指定的容器已存在选智能卡上,选择另一个智能卡或取消操作。

下表显示用于限制为容器创建操作的上下文标志。

标志

说明

CRYPT_SILENT

可以在此操作期间不显示任何用户界面。

CRYPT_MACHINE_KEYSET

应在此操作期间使用没有缓存的数据。

CRYPT_VERIFYCONTEXT

仅公共数据可以访问智能卡上。

除了容器操作和容器规范,您必须考虑其他用户选项,如CryptAcquireContext标志,在智能卡所选内容。

System_CAPS_important重要事项

CRYPT_SILENT 标志不能用于创建一个新的容器。

应用程序可以调用与 CRYPT_DEFAULT_CONTAINER_OPTIONAL 基本 CSP、 在无提示的上下文中设置 PIN,然后在无提示的上下文中创建一个新的容器。 此操作发生,如下所示:

  1. 调用CryptAcquireContext通过传递中的智能卡读取器名称作为类型 II 容器规范级别,并指定 CRYPT_DEFAULT_CONTAINER_OPTIONAL 标志。

  2. 调用CryptSetProvParam通过指定 PP_KEYEXCHANGE_PIN 或 PP_SIGNATURE_PIN 和 null 值结束的 ASCII PIN。

  3. 释放在步骤 1 中获取的上下文。

  4. 调用CryptAcquireContext与 CRYPT_NEWKEYSET,并将类型指定我容器规范级别。

  5. 调用CryptGenKey来创建该密钥。

在某些以下情况下,可以提示用户插入智能卡。 如果用户上下文是无提示,此操作将失败并且显示没有用户界面。 否则为在响应用户界面,用户可以插入智能卡或单击取消 如果用户取消了操作,则操作将失败。 图 3 中的流程图显示了由 Windows 操作系统执行的所选内容步骤。

Flow chart

图 3智能卡选择行为

通常情况下,由智能卡选择行为SCardUIDlgSelectCardAPI。 基本 CSP 通过直接调用与此 API 进行交互。 基本 CSP 还将发送具有筛选和匹配候选智能卡的用途的回调函数。 调用方CryptAcquireContext提供智能卡信息相匹配。 在内部,基本 CSP 使用智能卡的序列号、 读取器名称和容器名称的组合来查找特定的智能卡。

每次调用SCardUI *可能会导致从候选智能卡读取的其他信息。 基本 CSP 智能卡选择回调缓存此信息。

 惠块  我和类型 II 容器规范级别,智能卡选择过程很不太复杂,因为仅命名的读取器中的智能卡可以被视为匹配。 在匹配智能卡和智能卡读卡器的过程是:

  1. 找到将请求的智能卡读卡器。 如果它找不到,则过程将失败。 (这需要缓存搜索由读取器名称。)

  2. 如果没有智能卡读取器中,被提示用户插入智能卡。 (这是仅在非无提示模式下,如果在静默模式下进行调用,它将失败。)

  3. 对于容器规范级别 II 仅,确定的选智能卡上的默认容器名称。

  4. 若要打开现有容器或删除现有容器,查找指定的容器。 如果此智能卡上找不到指定的容器,被提示用户插入智能卡。

  5. 如果系统会尝试创建一个新容器 (如果指定的容器已存在此智能卡上,则过程将失败。

对于容器规范级别 III 和 IV,更广泛的方法用于匹配适当的智能卡与用户上下文中,因为多个缓存的智能卡可能符合提供的标准。

System_CAPS_note注意

此操作需要您与基本 CSP 一起使用智能卡。

  1. 为每个智能卡的已访问由基本 CSP 和缓存的句柄和容器的信息、 基本 CSP 寻找有效的默认容器。 尝试操作已缓存的 SCARDHANDLE 要验证其有效性。 如果智能卡句柄不是有效的基本 CSP 将继续搜索新的智能卡。

  2. 如果在基本 CSP 缓存中找不到匹配的智能卡,基本 CSP 将调用到智能卡子系统。 SCardUIDlgSelectCard()使用合适的回调的筛选器中用于查找匹配的智能卡与有效的默认容器。

System_CAPS_note注意

此操作需要您与基本 CSP 一起使用智能卡。

  1. 有关每个已注册基本 CSP 的智能卡,搜索请求的容器。 尝试对缓存的 SCARDHANDLE 要验证其有效性的操作。 如果智能卡句柄无效,将智能卡的序列号传递给SCardUI *API 继续搜索此特定的智能卡 (而不是仅容器名称的常规匹配项)。

  2. 如果在基本 CSP 缓存中找不到匹配的智能卡,是针对智能卡子系统进行调用。 SCardUIDlgSelectCard()使用合适的回调的筛选器中用于查找匹配的智能卡与请求的容器。 或者,如果在步骤 1 中搜索产生智能卡序列号,回调筛选器将尝试匹配序列号,而不是容器名称。

System_CAPS_note注意

此操作需要您与基本 CSP 一起使用智能卡。

如果 PIN 不进行缓存,因为用户必须提示您输入 PIN,至少对于容器创建允许没有 CRYPT_SILENT。

对于其他操作调用方可能能够获取对默认容器 (CRYPT_DEFAULT_CONTAINER_OPTIONAL) 的"验证"上下文,然后进行与调用CryptSetProvParam缓存用户 PIN 用于后续操作。

  1. 每个智能卡 CSP 已知,刷新存储的 SCARDHANDLE,然后进行以下检查:

    1. 如果智能卡已删除,则继续执行搜索。

    2. 如果智能卡存在,但它已命名的容器,则继续执行搜索。

    3. 智能卡是否可用,但对调用CardQueryFreeSpace指示智能卡具有足够的存储的额外密钥容器,继续执行搜索。

    4. 否则,使用符合上述条件的容器创建第一个可用智能卡。

  2. 如果在 CSP 缓存中找不到匹配的智能卡,请对智能卡子系统的调用。 用于筛选枚举的智能卡的回调验证候选智能卡不已具有的已命名的容器,并且CardQueryFreeSpace指示智能卡具有足够的空间用于额外的容器。 如果不找到任何适当的智能卡,则被提示用户插入智能卡。

  1. 如果指定的容器名称为 NULL,则删除默认容器。 删除默认容器会导致任意选择一个新的默认容器。 出于此原因,不建议此操作。

  2. 每个智能卡 CSP 已知,刷新存储的 SCARDHANDLE,然后进行以下检查:

    1. 如果智能卡不具有的已命名的容器,继续执行搜索。

    2. 如果智能卡具有的已命名的容器,但智能卡句柄将不再有效,存储所匹配的智能卡的序列号并将其传递到SCardUI *

  3. 如果在 CSP 缓存中找不到匹配的智能卡,请对智能卡子系统的调用。 用于筛选枚举的智能卡的回调应验证候选智能卡已命名的容器。 如果序列号提供作为上一个缓存搜索结果,该回调应筛选序列号而不是根据容器的匹配项的枚举的智能卡。 如果找到任何适当的智能卡的上下文是非无提示,显示提示用户插入智能卡的 UI。

图 4 显示 Windows 操作系统使用的加密体系结构。

Flow chart

图 4加密体系结构

中指定的 Windows 版本中支持以下属性应用于本主题开头的列表。

System_CAPS_note注意

API 定义位于 WinCrypt.h 和 WinSCard.h 中。

属性

说明

PP_USER_CERTSTORE

  • 用于返回包含智能卡上的所有用户证书 HCERTSTORE

  • 只读 (仅供CryptGetProvParam)

  • 调用方负责关闭的证书存储区

  • 使用 PKCS_7_ASN_ENCODING 或 X509_ASN_ENCODING 编码的证书

  • CSP 应在证书上设置 KEY_PROV_INFO

  • 证书存储区应被认为是一个内存中存储区

  • 证书应具有有效 CRYPT_KEY_PROV_INFO 作为属性

PP_ROOT_CERTSTORE

  • 读取和写入 (使用CryptGetProvParamCryptSetProvParam)

  • 用于将根证书的集合写入到智能卡或返回 HCERTSTORE,包含从智能卡的根证书

  • 主要用于通过使用智能卡加入域

  • 调用方负责关闭的证书存储区

PP_SMARTCARD_READER

  • 只读 (仅供CryptGetProvParam)

  • 用于构造一个完全限定的容器名称 (即,智能卡读卡器加上一个容器) 的 ANSI 字符串形式返回智能卡读取器名称

PP_SMARTCARD_GUID

  • 返回智能卡 GUID (也称为序列号),这在某些情况下应该是唯一的每个智能卡

  • 证书传播服务用于跟踪的根证书源

PP_UI_PROMPT

  • 用于设置的搜索字符串SCardUIDlgSelectCard卡插入对话框

  • 设置时的整个过程的持续性

  • 只写 (仅由CryptSetProvParam)

凭据服务提供商 (Csp),包括自定义智能卡 Csp 继续得到支持,但不是建议使用此方法。 使用现有基本 CSP 和智能卡 KSP 以及智能卡微型驱动程序模型对智能卡提供了在性能、 PIN 和数据缓存方面的显著好处。 可以将一个微型驱动程序配置为在 CryptoAPI 和 CNG 层下工作。 这提供了增强的加密支持,包括椭圆曲线加密和 AES 受益。

如果智能卡注册由 CSP 和智能卡微型驱动程序中,已安装的一个最近将用于与智能卡进行通信。

Csp 和 Ksp 是为了只能将数据写入如果特定功能将不可用在当前的智能卡微型驱动程序体系结构中。 例如,智能卡微型驱动程序体系结构支持硬件安全模块,因此无法为硬件安全模块,编写微型驱动程序和 CSP 或 KSP 可能不是必需除非需要它来支持基本的 CSP 或智能卡 KSP 中未实现的算法。

有关如何编写智能卡微型驱动程序、 CSP 或 KSP 的详细信息,请参阅企业在 Microsoft Windows 智能卡框架中的智能卡部署

显示: