

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 “个人” 中 WorkSpaces 使用智能卡进行身份验证
<a name="smart-cards"></a>

DCV 捆绑包 WorkSpaces 上的 Windows 和 Linux 允许使用[通用访问卡 (CAC)](https://www.cac.mil/Common-Access-Card) 和[个人身份验证 (PIV)](https://www.idmanagement.gov/university/piv/) 智能卡进行身份验证。

Amazon WorkSpaces 支持使用智能卡进行*会话前身份验证和会话*中*身份验证*。会话前身份验证是指在用户登录时执行的智能卡身份验证。 WorkSpaces会话中身份验证是指登录后执行的身份验证。

例如，在使用 Web 浏览器和应用程序时，用户可以使用智能卡进行会话中身份验证。他们也可以使用智能卡执行需要管理权限的操作。例如，如果用户拥有其 Linux 的管理权限 WorkSpace，则他们可以在运行`sudo`和`sudo -i`命令时使用智能卡进行身份验证。

**Topics**
+ [要求](#smart-cards-requirements)
+ [限制](#smart-cards-limitations)
+ [目录配置](#smart-cards-directory-config)
+ [启用适用于 Windows 的智能卡 WorkSpaces](#smart-cards-windows-workspaces)
+ [为 Ubuntu、Rocky Linux 和红帽企业 Linux 启用智能卡 WorkSpaces](#smart-cards-linux-workspaces)
+ [为亚马逊 Linux 2 启用智能卡 WorkSpaces](#smart-cards-amazon-linux-workspaces)

## 要求
<a name="smart-cards-requirements"></a>
+ 会话前身份验证需要 Active Directory Connector (AD Connector) 目录。AD Connector 使用基于证书的相互传输层安全行协议身份验证（相互 TLS），通过基于硬件或软件的智能卡证书对 Active Directory 的用户进行身份验证。有关如何配置 AD Connector 和本地目录的更多信息，请参阅[目录配置](#smart-cards-directory-config)。
+ 要在 Windows 或 Linux 上使用智能卡 WorkSpace，用户必须使用亚马逊 WorkSpaces Windows 客户端版本 3.1.1 或更高版本、mac WorkSpaces OS 客户端版本 3.1.5 或更高版本，或 Ubuntu 22.04 客户端版本 2024.1 WorkSpaces 或更高版本（Ubuntu 20.04 客户端不支持智能卡身份验证）。 WorkSpaces 有关在 Windows 和 macOS 客户端上使用智能卡的更多信息，请参阅*亚马逊 WorkSpaces 用户*指南中的[智能卡支持](https://docs.aws.amazon.com/workspaces/latest/userguide/smart_card_support.html)。
+ 根 CA 和智能卡证书必须满足某些要求。有关更多信息，请参阅《AWS Directory Service 管理指南》**中的[在 AD Connector 中启用 mTLS 身份验证以用于智能卡](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ad_connector_clientauth.html)以及 Microsoft 文档中的[证书要求](https://docs.microsoft.com/en-us/windows/security/identity-protection/smart-cards/smart-card-certificate-requirements-and-enumeration#certificate-requirements)。

  除这些要求外，用于向 Amazon 进行智能卡身份验证的用户证书还 WorkSpaces 必须包含以下属性：
  + 证书 userPrincipalName (SAN) 字段中的 AD 用户 subjectAltName (UPN)。建议为用户的默认 UPN 颁发智能卡证书。
**注意**  
亚马逊 Linux 2 WorkSpaces 依靠 UPN 进行 certificate-to-user映射。较新的 Linux WorkSpaces，例如 Ubuntu、Rocky Linux 和红帽企业 Linux WorkSpaces，支持更安全的[映射](https://www.idmanagement.gov/implement/scl-windows/#step-4---account-linking)方法。
  + 客户端身份验证 (1.3.6.1.5.5.7.3.2) 扩展密钥使用 (EKU) 属性。
  + 智能卡登录 (1.3.6.1.4.1.311.20.2.2) EKU 属性。
+ 对于会话前身份验证，需要在线证书状态协议 (OCSP) 来检查证书吊销。对于会话中身份验证，建议使用 OCSP，但不是必需的。
**注意**  
默认情况下，Ubuntu WorkSpaces、Rocky Linux WorkSpaces 和 Red Hat Enterprise Linux WorkSpaces 需要 OCSP 进行会话内身份验证，而这些系统中的 OCSP 验证要求 OCSP 响应者启用 NONCE 扩展以防止重播攻击。要禁用 NONCE 扩展，必须完全禁用会话中 OCSP 验证。要在 Ubuntu、Rocky Linux 和红帽企业 Linux 中禁用 OCSP 验证 WorkSpaces，请创建一个`/etc/sssd/conf.d/disable-ocsp.conf`包含以下内容的新文件：  

  ```
  [sssd]
  certificate_verification = no_ocsp
  ```

## 限制
<a name="smart-cards-limitations"></a>
+ 目前仅支持 WorkSpaces Windows 客户端应用程序版本 3.1.1 或更高版本、mac WorkSpaces OS 客户端应用程序版本 3.1.5 或更高版本 WorkSpaces 以及 Ubuntu 22.04 客户端应用程序版本 2024.1 或更高版本。 WorkSpaces 智能卡身份验证不支持 Ubuntu 20.04 或更早版本的客户端应用程序。
+ 只有在 64 位版本的 WorkSpaces Windows 上运行时，Windows 客户端应用程序 3.1.1 或更高版本才支持智能卡。
+ 目前只支持 AD Connector 目录进行智能卡身份验证。
+ 会话中身份验证在所有支持 DCV 的区域均可用。以下区域提供会话前身份验证：
  + 亚太地区（悉尼）区域
  + 亚太地区（东京）区域
  + 欧洲地区（爱尔兰）区域
  + AWS GovCloud （美国东部）区域
  + AWS GovCloud （美国西部）区域
  + 美国东部（弗吉尼亚州北部）区域
  + 美国西部（俄勒冈州）区域
+ 对于 Linux 或 Windows 上的会话内身份验证和会话前身份验证 WorkSpaces，目前一次只能使用一张智能卡。可以同时使用多张卡，但不支持。
+ 对于会话前身份验证，目前不支持在同一目录上同时启用智能卡身份验证和登录身份验证。
+ 目前仅支持 CAC 和 PIV 卡。其他类型基于硬件或软件的智能卡也可能起作用，但它们尚未经过与 DCV 配合使用的全面测试。

## 目录配置
<a name="smart-cards-directory-config"></a>

要启用智能卡身份验证，必须按以下方式配置 AD Connector 目录和本地目录。

**AD Connector 目录配置**  
在开始之前，请确保您的 AD Connector 目录已按照《AWS Directory Service 管理指南》**内 [AD Connector 先决条件](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/prereq_connector.html)中所述进行设置。特别是，请确保您已在防火墙中打开必要的端口。

要完成 AD Connector 目录的配置，请按照《AWS Directory Service 管理指南》**内[在 AD Connector 中启用 mTLS 身份验证以用于智能卡](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ad_connector_clientauth.html)中的说明进行操作。

**注意**  
智能卡身份验证需要 Kerberos 约束委托 (KCD) 才能正常运行。KCD 要求 AD Connector 服务帐户的用户名部分与同一用户的AMAccount名称相匹配。A 的AMAccount名称不能超过 20 个字符。

**本地目录配置**  
除了配置 AD Connector 目录外：
+ 确保向本地目录的域控制器颁发的证书设置了 “KDC 身份验证” 扩展密钥用法 (EKU)。为此，请使用 Active Directory 域服务 (AD DS) 默认 Kerberos 身份验证证书模板。请勿使用域控制器证书模板或域控制器身份验证证书模板，因为这些模板不包含智能卡身份验证所需的设置。
+ 对于 Linux WorkSpaces，请确保颁发智能卡证书的 CA 的 OCSP 响应器已启用 NONCE 扩展。如果无法启用，则必须在 Ubuntu、Rocky Linux 和红帽企业 Linux 中禁用会话中 OCSP 验证。 WorkSpaces要禁用 OCSP 验证，请创建一个`/etc/sssd/conf.d/disable-ocsp.conf`包含以下内容的新文件：

  ```
  [sssd]
  certificate_verification = no_ocsp
  ```

## 启用适用于 Windows 的智能卡 WorkSpaces
<a name="smart-cards-windows-workspaces"></a>

有关如何在 Windows 上启用智能卡身份验证的一般指南，请参阅 Microsoft 文档中[使用第三方证书颁发机构启用智能卡登录指南](https://docs.microsoft.com/troubleshoot/windows-server/windows-security/enabling-smart-card-logon-third-party-certification-authorities)。

**检测 Windows 锁屏并断开会话连接**  
要允许用户在屏幕锁定时解锁启用了智能卡会话前身份验证的 Window WorkSpaces s，可以在用户会话中启用 Windows 锁屏检测。检测到 Windows 锁屏后， WorkSpace 会话将断开，用户可以使用其智能卡从 WorkSpaces 客户端重新连接。

 您可以使用组策略设置，启用在检测到 Windows 锁屏时断开会话连接。有关更多信息，请参阅 [配置 DCV 屏幕锁定时断开会话连接](group_policy.md#gp_lock_screen_in_wsp)。

**启用会话内或会话前身份验证**  
默认情况下，Windows WorkSpaces 不支持使用智能卡进行会话前或会话中身份验证。如果需要，您可以使用组策略设置为 Windows WorkSpaces 启用会话中和会话前身份验证。有关更多信息，请参阅 [为 DCV 配置智能卡重定向](group_policy.md#gp_smart_cards_in_wsp)。

要使用会话前身份验证，除了更新组策略设置外，您还必须通过 AD Connector 目录设置启用会话前身份验证。有关更多信息，请按照《AWS Directory Service 管理指南》**内[在 AD Connector 中启用 mTLS 身份验证以用于智能卡](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ad_connector_clientauth.html)中的说明进行操作。

**允许用户在浏览器中使用智能卡**  
如果您的用户使用 Chrome 作为浏览器，则无需进行特殊配置即可使用智能卡。

如果您的用户使用 Firefox 作为浏览器，则您可以通过组策略允许您的用户在 Firefox 中使用智能卡。您可以在中使用这些 [Firefox 组策略模板](https://github.com/mozilla/policy-templates/tree/master/windows)。 GitHub

例如，您可以安装适用于 Windows 的 64 位版本的 [OpenSC](https://github.com/OpenSC/OpenSC/wiki) 来支持 PKCS \$111，然后使用以下组策略设置，其中 `NAME_OF_DEVICE` 是您要用来标识 PKCS \$111 的任何值，例如 `OpenSC`，其中 `PATH_TO_LIBRARY_FOR_DEVICE` 是 PKCS \$111 模块的路径。此路径应指向扩展名为 .DLL 的库，例如 `C:\Program Files\OpenSC Project\OpenSC\pkcs11\onepin-opensc-pkcs11.dll`。

```
Software\Policies\Mozilla\Firefox\SecurityDevices\NAME_OF_DEVICE = PATH_TO_LIBRARY_FOR_DEVICE
```

**提示**  
如果您使用的是 OpenSC，也可以通过运行 `pkcs11-register.exe` 程序，将 OpenSC `pkcs11` 模块加载到 Firefox 中。要运行此程序，请双击 `C:\Program Files\OpenSC Project\OpenSC\tools\pkcs11-register.exe` 中的文件，或者打开命令提示符窗口并运行以下命令：  

```
"C:\Program Files\OpenSC Project\OpenSC\tools\pkcs11-register.exe"
```
要验证 OpenSC `pkcs11` 模块是否已加载到 Firefox 中，请执行以下操作：  
如果 Firefox 已经在运行，请将其关闭。
打开 Firefox。选择右上角的菜单按钮 ![\[Firefox menu button\]](http://docs.aws.amazon.com/zh_cn/workspaces/latest/adminguide/images/firefox-menu-button.png)，然后选择**选项**。
在**关于: 首选项**页面上，在左侧导航窗格中选择**隐私与安全**。
在**证书**下，选择**安全设备**。
在**设备管理器**对话框中，您应该在左侧导航栏中看到 **OpenSC 智能卡框架 (0.21)**，当您选择它时，它应该具有以下值：  
**模块**：`OpenSC smartcard framework (0.21)`  
**路径**：`C:\Program Files\OpenSC Project\OpenSC\pkcs11\onepin-opensc-pkcs11.dll`

**问题排查**  
有关排查智能卡问题的信息，请参阅 Microsoft 文档中的[证书和配置问题](https://docs.microsoft.com/troubleshoot/windows-server/windows-security/enabling-smart-card-logon-third-party-certification-authorities#certificate-and-configuration-problems)。

可能导致问题的一些常见问题：
+ 槽与证书的映射不正确。
+ 智能卡上有多个可以与用户匹配的证书。证书使用以下标准进行匹配：
  + 证书的根 CA。
  + 证书的 `<KU>` 和 `<EKU>` 字段。
  + 证书主题中的 UPN。
+ 多个证书的密钥用法中存在 `<EKU>msScLogin`。

通常，最好只有一个用于智能卡身份验证的证书，该证书映射到智能卡的第一个槽。

用于管理智能卡上的证书和密钥（例如删除或重新映射证书和密钥）的工具可能因制造商而异。有关更多信息，请参阅智能卡制造商提供的文档。

## 为 Ubuntu、Rocky Linux 和红帽企业 Linux 启用智能卡 WorkSpaces
<a name="smart-cards-linux-workspaces"></a>

要在 Ubuntu、Rocky Linux 和 Red Hat Enterprise Linux WorkSpaces 上启用智能卡，你需要在 WorkSpace 镜像中包含所有 CAs 发行智能卡和所有颁发域控制器证书的中间 CA 证书。 CAs 

**要获取 CA 证书：**您可以通过多种方式获取 CA 证书：
+ 您可以使用第三方证书颁发机构的 CA 证书包。
+ 您可以使用 Web 注册网站导出自己的 CA 证书，该网站是`http://ip_address/certsrv`或`http://fqdn/certsrv`，其中`ip_address`和`fqdn`是 CA 服务器的 IP 地址和完全限定域名 (FQDN)。有关使用 Web 注册网站的更多信息，请参阅 Microsoft 文档中的[如何导出根证书颁发机构证书](https://docs.microsoft.com/troubleshoot/windows-server/identity/export-root-certification-authority-certificate)。
+ 您可以使用以下步骤从运行 Active Directory 证书服务 (AD CS) 的 CA 服务器中导出 CA 证书。有关安装 AD CS 的信息，请参阅 Microsoft 文档中的[安装证书颁发机构](https://docs.microsoft.com/windows-server/networking/core-network-guide/cncg/server-certs/install-the-certification-authority)。

  1. 使用管理员帐户登录 CA 服务器。

  1. 在 Windows 的**开始**菜单中，打开命令提示符窗口（**开始** > **Windows 系统** > **命令提示符**）。

  1. 使用以下命令将 CA 证书导出到新文件中，其中`rootca.cer`是新文件的名称：

     ```
     certutil -ca.cert rootca.cer
     ```

     有关运行 certutil 的更多信息，请参阅 Microsoft 文档中的 [certutil](https://docs.microsoft.com/windows-server/administration/windows-commands/certutil)。

  1. 使用以下 OpenSSL 命令将导出的 CA 证书从 DER 格式转换为 PEM 格式，其中*rootca*是证书的名称。有关 OpenSSL 的更多信息，请访问 [www.openssl.org](https://www.openssl.org/)。

     ```
     openssl x509 -inform der -in rootca.cer -out /tmp/rootca.pem
     ```

**将您的 CA 证书添加到 Linux WorkSpaces**

为了帮助您启用智能卡，我们已将该`enable_smartcard`脚本添加到我们的 Linux WorkSpaces DCV 捆绑包中。此脚本将执行以下操作：
+ 将您的 CA 证书导入私有 PEM 捆绑包，该包定义了 Linux WorkSpaces 上的 SSSD 的信任根）。
+ 更新 SSSD、PAM 和 Kerberos 配置，其中包括在置备期间启用`PKINIT`（使用证书而不是密码进行 Kerberos 身份验证）。 WorkSpace

以下过程说明如何使用`enable_smartcard`脚本导入 CA 证书以及如何为 Linux 启用智能卡身份验证 WorkSpaces。

1. 创建一个启用了 DCV 协议 WorkSpace 的新 Linux。在 Amazon WorkSpaces 控制台 WorkSpace 中启动时，请务必**在 “选择捆绑包**” 页面上为协议选择 **DCV**，然后选择一个 Linux WorkSpaces 公共捆绑包。

1. 在新创建的文件中 WorkSpace，确保`/etc/skylight.conf`文件在`[features]`章节中有`pam_smartcard = true`行：

   ```
   [features]
   pam_smartcard = true
   ```
**注意**  
如果尚未将所有用户配置为使用强`altSecurityIdentities`证书映射，您也可以在中的同一`[features]`部分中添加一`smartcard_weak_mapping = true`行`/etc/skylight.conf`以支持旧版映射方法，但我们建议尽快迁移这些用户以使用强映射方法。

1. 在 WorkSpace，以 root 身份运行以下命令`pem-path1`，其中`pem-path2`、等是文件的路径，每个文件都包含智能卡和域控制器证书信任链中的一个 CA 证书。所有这些文件都应采用 PEM 格式，每个文件包含一个证书。可以使用 Glob 模式（例如`*.pem`）

   ```
   /usr/lib/skylight/enable_smartcard --ca-cert pem-path1 pem-path2 pem-path3 ...
   ```
**注意**  
在运行上述命令 WorkSpace 之前，请确保在上安装了其他依赖包，并以 root 身份使用以下命令。  
对于 Rocky Linux 和红帽企业 Linux WorkSpaces：  

   ```
   dnf install sssd-dbus libsss_simpleifp sssd-tools krb5-pkinit opensc
   ```
 对于 Ubuntu WorkSpaces 来说：  

   ```
   apt install krb5-pkinit opensc
   ```

1. 在上执行任何其他自定义。 WorkSpace例如，您可能希望添加一个系统范围的策略，以[允许用户在 Firefox 中使用智能卡](#smart-cards-firefox-linux)。（Chrome 用户必须自己在客户端上启用智能卡。 有关更多信息，请参阅 *Amazon WorkSpaces 用户指南*中的[智能卡支持](https://docs.aws.amazon.com/workspaces/latest/userguide/smart_card_support.html)。） 

1. 从@@ [中创建自定义 WorkSpace 映像和捆绑包](create-custom-bundle.md) WorkSpace。

1. 使用新的自定义捆绑包 WorkSpaces 为用户启动。

您可以在 Linux WorkSpace 映像中添加 SecurityDevices 策略，让您的用户能够在 Firefox 中使用智能卡。有关向 Firefox 添加系统范围策略的更多信息，请参阅上的 [Mozilla 策略模板](https://github.com/mozilla/policy-templates/releases)。 GitHub

**允许用户在 Firefox 中使用智能卡**

1. 在你 WorkSpace 用来创建 WorkSpace 映像的系统上，创建一个名`policies.json`为的新文件，其中`PREFIX`位于`/usr/lib64`基于 Fedora 的系统（亚马逊 Linux 2 `PREFIX/firefox/distribution/`、红帽企业 Linux 和 Rocky Linux WorkSpaces）和基于 Debian 的系统（Ubuntu）`/usr/lib`上。 WorkSpaces

1. 在 JSON 文件中，添加以下 SecurityDevices 策略，其中`NAME_OF_DEVICE`是您要用来标识`pkcs`模块的任何值。例如，您可能想使用 `"OpenSC"` 这样的值：

   ```
   {
       "policies": {
           "SecurityDevices": {
               "NAME_OF_DEVICE": "PREFIX/opensc-pkcs11.so"
           }
       }
   }
   ```

**问题排查**  
当会话前设置为使用密码身份验证时，智能卡身份验证的故障排除更容易——在会话配置期间，Linux 会 WorkSpaces 自动将主机身份验证模式首选项切换为基于密码或基于智能卡的身份验证模式，具体取决于所使用的会话前身份验证方法。如果智能卡身份验证存在任何问题，则使用密码会话前身份验证断开连接并重新连接会将工作空间重置为主机上的密码身份验证。要手动将 Linux WorkSpaces 实例切换到智能卡身份验证，请以 root 身份运行`/usr/lib/skylight/resume_smartcard`命令。

Linux WorkSpaces 使用 OpenSC 软件来处理智能卡。该软件附带诸如`pkcs11-tool`和`pkcs15-tool`之类的工具，可用于解决智能卡问题。这些工具可用于检查智能卡读卡器、单个令牌以及每个智能卡令牌上的 PIV 插槽或证书。

`openssl`命令行工具可以帮助解决信任链、OCSP 响应器或缺失 KUs/EKUs （密 usage/extended 钥使用）标志的问题，尤其是与从智能卡中提取公共证书`pkcs15-tool`的功能结合使用时。

常见故障排除选项：
+ 首先从智能卡中提取证书（通常是 PIV 插槽 9A）并将其保存为：`card-cert.pem``pkcs15-tool --read-certificate 1 > card-cert.pem`
+ 根据信任数据库验证提取的证书 WorkSpace：`openssl verify -verbose -CAfile /etc/sssd/pki/sssd_auth_ca_db.pem -cert card-cert.pem`
+ 从提取的智能卡证书中获取 OCSP 网址：`openssl x509 -noout -ocsp_uri -in card-cert.pem`
+ 验证 OCSP 响应是否表明证书有效并且包含 NONCE:`openssl ocsp -issuer /etc/sssd/pki/sssd_auth_ca_db.pem -CAfile /etc/sssd/pki/sssd_auth_ca_db.pem -cert card-cert.pem -text -url OCSP_URI`，其中*OCSP\$1URI*是上面的 OCSP 网址。
+ 检查域控制器证书是否被视为可信：`openssl s_client -connect DC_HOSTNAME:636 -showcerts | openssl verify -verbose -CAfile /etc/sssd/pki/sssd_auth_ca_db.pem`，其中*DC\$1HOSTNAME*是 Active Directory 域中其中一个域控制器的主机名。
+ 确认域控制器证书已设置 KDC 身份验证 EKU（扩展密钥用法）：。`openssl s_client -connect DC_HOSTNAME:636 -showcerts | openssl x509 -noout -text`
+ 尝试手动 PKINIT，看看是否有任何错误代码可以用来缩小问题范围：`KRB5_TRACE=/dev/stdout kinit -X X509_user_identity=PKCS11:opensc-pkcs11.so:certid=01 -V`，卡上四个主 PIV 插槽之一的数量在*01*哪里 —— `01` for `9A`、`02` for 等。`9C`大多数卡在插槽 9A 中都有用于用户身份验证的证书。
+ 检查系统是否能够将智能卡证书映射到 AD 用户（以 root 身份执行）：`dbus-send --print-reply --system --dest=org.freedesktop.sssd.infopipe /org/freedesktop/sssd/infopipe/Users org.freedesktop.sssd.infopipe.Users.FindByCertificate string:"$(<card-cert.pem)"`。这可以与启用 SSSD 的调试日志记录相结合。

最常见的已知问题：
+ 智能卡证书的信任链不完整-使用`enable_smartcard`脚本导入证书时，必须提供所有根证书和中间 CA 证书的完整列表。如果由于列表中缺少根 CA 证书而并非所有导入的证书都可信，则该`enable_smartcard`工具将显示错误，但它无法检测到何时缺少整个信任链或其中一个信任链中最内层的中间 CA 证书。在这种情况下，它将毫无错误地导入证书，但是智能卡证书或域控制器证书仍可能被视为不受信任。
+ 缺少域控制器证书的信任链-如果域控制器证书由与智能卡不同的 CA 颁发（例如，[通用访问卡 (CAC)）](https://www.cac.mil/Common-Access-Card)，则需要将该 CA 信任链与颁发 CA 证书的智能卡一起导入。
+ OCSP 响应器中缺乏 NONCE 扩展支持-Linux WorkSpaces 要求智能卡发卡机构的 OCSP 响应器启用 NONCE 扩展。如果无法启用，则必须完全禁用 OCSP 验证。
+ 域控制器证书缺失 `KDC Authentication` EKU (OID 1.3.6.1.5.2.3.1)-要使智能卡身份验证起作用，需要重新颁发域控制器证书，以包括 KDC 身份验证 EKU。
+ 域控制器证书已过期-要使智能卡身份验证起作用，必须保留域控制器证书 up-to-date。
+ 使用弱映射方法将智能卡证书映射到 AD 中的用户——传统上， subjectAltName 属性中的 UPN 字段用于将证书映射到 AD 中的用户，并期望与 userPrincipalName 属性匹配。这不再被视为一种安全的映射方法，并且在默认情况下是不允许的。可以通过向`enable_smartcard`命令传递`--allow-weak-mapping`参数并在`/etc/skylight.conf`文件中的`[features]`部分中添加`smartcard_weak_mapping = true`行来重新启用它，但是更好的解决方案是使用一种强大的映射方法。有关更多详细信息，请参阅[账户关联](https://www.idmanagement.gov/implement/scl-windows/#step-4---account-linking)文档。

用于管理智能卡上的证书和密钥（例如删除或重新映射证书和密钥）的工具可能因制造商而异。可用来处理智能卡的其他工具包括：
+ `opensc-explorer`
+ `opensc-tool`
+ `pkcs11_inspect`
+ `pkcs11_listcerts`
+ `pkcs15-tool`

**启用调试日志记录**
+ `/etc/sssd/sssd.conf`为每个单独的部分添加一`debug_level = LEVEL`行，其中*LEVEL*是所需的详细程度，从 1 到 10。然后可以在`/var/log/sssd/`目录中找到每个相应部分的日志。有关更多详细信息，请参阅[此处和此](https://docs.pagure.org/sssd.sssd/users/troubleshooting.html#sssd-debug-logs)[处](https://sssd.io/troubleshooting/basics.html#sssd-debug-logs)的 SSSD 文档。

## 为亚马逊 Linux 2 启用智能卡 WorkSpaces
<a name="smart-cards-amazon-linux-workspaces"></a>

**注意**  
DCV WorkSpaces 上的 Amazon Linux 2 目前存在以下限制：  
不支持剪贴板、音频输入、视频输入和时区重定向。
不支持多个显示器。

要在 Amazon Linux 2 上启用智能卡 WorkSpaces，您需要在 WorkSpace 镜像中包含 PEM 格式的根 CA 证书文件。

**要获取根 CA 证书，请执行以下操作：**您可以通过多种方式获取根 CA 证书：
+ 您可以使用由第三方证书颁发机构运营的根 CA 证书。
+ 您可以使用 Web 注册网站导出自己的根 CA 证书，该网站为 `http://ip_address/certsrv` 或 `http://fqdn/certsrv`，其中 `ip_address` 和 `fqdn` 分别是根证书 CA 服务器的 IP 地址和完全限定域名 (FQDN)。有关使用 Web 注册网站的更多信息，请参阅 Microsoft 文档中的[如何导出根证书颁发机构证书](https://docs.microsoft.com/troubleshoot/windows-server/identity/export-root-certification-authority-certificate)。
+ 您可以使用以下步骤，从运行 Active Directory 证书服务 (AD CS) 的根 CA 证书服务器导出根 CA 证书。有关安装 AD CS 的信息，请参阅 Microsoft 文档中的[安装证书颁发机构](https://docs.microsoft.com/windows-server/networking/core-network-guide/cncg/server-certs/install-the-certification-authority)。

  1. 使用管理员账户登录根 CA 服务器。

  1. 在 Windows 的**开始**菜单中，打开命令提示符窗口（**开始** > **Windows 系统** > **命令提示符**）。

  1. 使用以下命令将根 CA 证书导出到新文件，其中 `rootca.cer` 是新文件的名称：

     ```
     certutil -ca.cert rootca.cer
     ```

     有关运行 certutil 的更多信息，请参阅 Microsoft 文档中的 [certutil](https://docs.microsoft.com/windows-server/administration/windows-commands/certutil)。

  1. 使用以下 OpenSSL 命令将导出的根 CA 证书从 DER 格式转换为 PEM 格式，其中*rootca*是证书的名称。有关 OpenSSL 的更多信息，请访问 [www.openssl.org](https://www.openssl.org/)。

     ```
     openssl x509 -inform der -in rootca.cer -out /tmp/rootca.pem
     ```

**将您的根 CA 证书添加到您的亚马逊 Linux 2 WorkSpaces**

为了帮助您启用智能卡，我们已将 `enable_smartcard` 脚本添加到我们的 Amazon Linux DCV 捆绑包中。此脚本将执行以下操作：
+ 将您的根 CA 证书导入[网络安全服务 (NSS)](https://developer.mozilla.org/docs/Mozilla/Projects/NSS) 数据库。
+ 安装可插入验证模块 (PAM) 身份验证的 `pam_pkcs11` 模块。
+ 执行默认配置，包括在 WorkSpace置备`pkinit`期间启用。

以下过程说明了如何使用`enable_smartcard`脚本将根 CA 证书添加到 Amazon Linux 2 WorkSpaces 以及如何为亚马逊 Linux 2 启用智能卡 WorkSpaces。

1. 创建一个启用 DCV 协议 WorkSpace 的新 Amazon Linux 2。在亚马逊 WorkSpaces 控制台 WorkSpace 中启动时，请务必**在 “选择捆绑包**” 页面上为协议选择 **DCV**，然后选择一个 Amazon Linux 2 公共捆绑包。

1. 在新版本中 WorkSpace，以 root 身份运行以下命令，其中`pem-path`是 PEM 格式的根 CA 证书文件的路径。

   ```
   /usr/lib/skylight/enable_smartcard --ca-cert pem-path
   ```
**注意**  
Amazon Linux 2 WorkSpaces 假设智能卡上的证书是针对用户的默认用户主体名称 (UPN) 颁发的，例如`sAMAccountName@domain`，其中`domain`是完全限定的域名 (FQDN)。  
要使用备用 UPN 后缀，请参阅 `run /usr/lib/skylight/enable_smartcard --help`，了解更多信息。备用 UPN 后缀的映射对每个用户来说都是唯一的。因此，必须对每个用户单独执行映射 WorkSpace。

1. （可选）默认情况下，所有服务都允许在 Amazon Linux 2 上使用智能卡身份验证 WorkSpaces。要将智能卡身份验证仅限于特定服务，必须编辑 `/etc/pam.d/system-auth`。取消 `pam_succeed_if.so` 对应的 `auth` 行的注释，并根据需要编辑服务列表。

   取消 `auth` 行的注释后，要允许服务使用智能卡身份验证，必须将其添加到列表中。要使服务仅使用密码身份验证，必须从列表中将其删除。

1. 对执行任何其他自定义。 WorkSpace例如，您可能希望添加一个系统范围的策略，以[允许用户在 Firefox 中使用智能卡](#smart-cards-firefox-amazon-linux)。（Chrome 用户必须自己在客户端上启用智能卡。 有关更多信息，请参阅 *Amazon WorkSpaces 用户指南*中的[智能卡支持](https://docs.aws.amazon.com/workspaces/latest/userguide/smart_card_support.html)。） 

1. 从@@ [中创建自定义 WorkSpace 映像和捆绑包](create-custom-bundle.md) WorkSpace。

1. 使用新的自定义捆绑包 WorkSpaces 为用户启动。

您可以通过向您的亚马逊 Linux 2 WorkSpace 映像添加 SecurityDevices 策略来允许您的用户在 Firefox 中使用智能卡。有关向 Firefox 添加系统范围策略的更多信息，请参阅上的 [Mozilla 策略模板](https://github.com/mozilla/policy-templates/releases)。 GitHub

**允许用户在 Firefox 中使用智能卡**

1. 在你 WorkSpace 用来创建 WorkSpace 图像的上，创建一个名为`policies.json`的新文件`/usr/lib64/firefox/distribution/`。

1. 在 JSON 文件中，添加以下 SecurityDevices 策略，其中`NAME_OF_DEVICE`是您要用来标识`pkcs`模块的任何值。例如，您可能想使用 `"OpenSC"` 这样的值：

   ```
   {
       "policies": {
           "SecurityDevices": {
               "NAME_OF_DEVICE": "/usr/lib64/opensc-pkcs11.so"
           }
       }
   }
   ```

**疑难解答：**为了排除故障，我们建议添加该`pkcs11-tools`实用程序。此实用工具允许您执行以下操作：
+ 列出每张智能卡。
+ 列出每张智能卡上的槽。
+ 列出每张智能卡上的证书。

可能导致问题的一些常见问题：
+ 槽与证书的映射不正确。
+ 智能卡上有多个可以与用户匹配的证书。证书使用以下标准进行匹配：
  + 证书的根 CA。
  + 证书的 `<KU>` 和 `<EKU>` 字段。
  + 证书主题中的 UPN。
+ 多个证书的密钥用法中存在 `<EKU>msScLogin`。

通常，最好只有一个用于智能卡身份验证的证书，该证书映射到智能卡的第一个槽。

用于管理智能卡上的证书和密钥（例如删除或重新映射证书和密钥）的工具可能因制造商而异。可用来处理智能卡的其他工具包括：
+ `opensc-explorer`
+ `opensc-tool`
+ `pkcs11_inspect`
+ `pkcs11_listcerts`
+ `pkcs15-tool`

**启用调试日志记录**

要排查 `pam_pkcs11` 和 `pam-krb5` 配置问题，您可以启用调试日志记录。

1. 在 `/etc/pam.d/system-auth-ac` 文件中，编辑 `auth` 操作，并将 `pam_pksc11.so` 的 `nodebug` 参数更改为 `debug`。

1. 在 `/etc/pam_pkcs11/pam_pkcs11.conf` 文件中，将 `debug = false;` 更改为 `debug = true;`。`debug` 选项分别适用于每个映射器模块，因此，您可能需要直接在`pam_pkcs11`部分下方和相应的映射器部分（默认情况下，这为 `mapper generic`）下，对其进行更改。

1. 在 `/etc/pam.d/system-auth-ac` 文件中，编辑 `auth` 操作，并将 `debug` 或 `debug_sensitive` 参数添加到 `pam_krb5.so`。

启用调试日志记录后，系统会直接在活动终端中打印出 `pam_pkcs11` 调试消息。来自 `pam_krb5` 的消息已记录在 `/var/log/secure` 中。

要检查智能卡证书映射到哪个用户名，请使用以下 `pklogin_finder` 命令：

```
sudo pklogin_finder debug config_file=/etc/pam_pkcs11/pam_pkcs11.conf
```

系统提示时，输入智能卡 PIN。`pklogin_finder` 在 `stdout` 上以 `NETBIOS\username` 的形式输出智能卡证书的用户名。此用户名应与 WorkSpace 用户名匹配。

在 Active Directory 域服务 (AD DS) 中，NetBIOS 域名是 Windows 2000 之前的域名。通常（但并非总是如此），NetBIOS 域名是域名系统 (DNS) 域名的子域。例如，如果 DNS 域名为 `example.com`，则 NetBIOS 域名通常为 `EXAMPLE`。如果 DNS 域名为 `corp.example.com`，则 NetBIOS 域名通常为 `CORP`。

例如，对于域 `corp.example.com` 中的用户 `mmajor`，来自 `pklogin_finder` 的输出为 `CORP\mmajor`。

**注意**  
如果您收到消息 `"ERROR:pam_pkcs11.c:504: verify_certificate() failed"`，则此消息表示 `pam_pkcs11` 已在智能卡上找到了符合用户名标准的证书，但该证书未链接到计算机可识别的根 CA 证书。发生这种情况时，`pam_pkcs11` 会输出上述消息，然后尝试下一个证书。它仅在找到与用户名匹配且链接到可识别的根 CA 证书的证书时，才允许进行身份验证。

要排查 `pam_krb5` 配置问题，您可以使用以下命令在调试模式下手动调用 `kinit`：

```
KRB5_TRACE=/dev/stdout kinit -V
```

此命令应成功获取 Kerberos 票证授予票证 (TGT)。如果失败，请尝试在命令中显式添加正确的 Kerberos 主体名称。例如，对于域 `corp.example.com` 中的用户 `mmajor`，使用以下命令：

```
KRB5_TRACE=/dev/stdout kinit -V mmajor
```

如果此命令成功，则问题很可能出在从 WorkSpace 用户名到 Kerberos 主体名称的映射中。检查 `/etc/krb5.conf` 文件中的 `[appdefaults]/pam/mappings` 部分。

如果此命令不成功，但基于密码的 `kinit` 命令成功了，请检查 `/etc/krb5.conf` 文件中的 `pkinit_` 相关配置。例如，如果智能卡包含多个证书，则可能需要对 `pkinit_cert_match` 进行更改。