第 4 章 配置和导入本地证书到智能卡

本章描述了以下情况:

  • 主机没有连接到某个域。
  • 您需要在这个主机上使用智能卡进行验证。
  • 您需要使用智能卡验证配置 SSH 访问。
  • 您需要使用 authselect 配置智能卡。

使用以下配置来实现这种情况:

  • 为希望使用智能卡进行身份验证的用户获取用户证书。证书应该由在域中使用的可信认证认证机构生成。

    如果您无法获得证书,您可以生成由本地证书颁发机构签名的用户证书用于测试。

  • 在智能卡中保存证书和私钥。
  • 为 SSH 访问配置智能卡验证。
重要

如果主机可以作为域的一部分,将主机添加到域中,并使用活动目录或者身份管理认证机构生成的证书。

有关如何为智能卡创建 IdM 证书的详情,请参考为智能卡验证配置身份管理

先决条件

  • 已安装 authselect

    authselect 工具在 Linux 主机中配置用户验证,您可以使用它配置智能卡验证参数。有关 authselect 的详情,请参考浏览 authselect

  • RHEL 8 支持的智能卡或者 USB 设备

    详情请参阅 RHEL8 中的智能卡支持

4.1. 创建本地证书

本节论述了如何执行这些任务:

  • 生成 OpenSSL 证书颁发机构
  • 创建证书签名请求
警告

以下步骤仅用于测试目的。由本地自签名证书颁发机构生成的证书与使用 AD、IdM 或 RHCS 认证认证机构一样安全。即使主机不是域的一部分,您仍应使用企业认证认证机构生成的证书。

流程

  1. 创建可生成证书的目录,例如:

    # mkdir /tmp/ca
    # cd /tmp/ca
  2. 设置证书(将该文件复制到 ca 目录中您的命令行):

    cat > ca.cnf <<EOF
    [ ca ]
    default_ca = CA_default
    
    [ CA_default ]
    dir              = .
    database         = \$dir/index.txt
    new_certs_dir    = \$dir/newcerts
    
    certificate      = \$dir/rootCA.crt
    serial           = \$dir/serial
    private_key      = \$dir/rootCA.key
    RANDFILE         = \$dir/rand
    
    default_days     = 365
    default_crl_days = 30
    default_md       = sha256
    
    policy           = policy_any
    email_in_dn      = no
    
    name_opt         = ca_default
    cert_opt         = ca_default
    copy_extensions  = copy
    
    [ usr_cert ]
    authorityKeyIdentifier = keyid, issuer
    
    [ v3_ca ]
    subjectKeyIdentifier   = hash
    authorityKeyIdentifier = keyid:always,issuer:always
    basicConstraints       = CA:true
    keyUsage               = critical, digitalSignature, cRLSign, keyCertSign
    
    [ policy_any ]
    organizationName       = supplied
    organizationalUnitName = supplied
    commonName             = supplied
    emailAddress           = optional
    
    [ req ]
    distinguished_name = req_distinguished_name
    prompt             = no
    
    [ req_distinguished_name ]
    O  = Example
    OU = Example Test
    CN = Example Test CA
    EOF
  3. 创建以下目录:

    # mkdir certs crl newcerts
  4. 创建以下文件:

    # touch index.txt crlnumber index.txt.attr
  5. 在串行文件中写入数字 01:

    # echo 01 > serial

    该命令在串行文件中写入数字 01。它是证书的序列号。当这个 CA 发布一个新证书时这个数字会加一。

  6. 创建一个 OpenSSL root CA 密钥:

    # openssl genrsa -out rootCA.key 2048
  7. 创建自签名 root 认证认证机构证书:

    # openssl req -batch -config ca.cnf \
        -x509 -new -nodes -key rootCA.key -sha256 -days 10000 \
        -set_serial 0 -extensions v3_ca -out rootCA.crt
  8. 为您的用户名创建密钥:

    # openssl genrsa -out example.user.key 2048

    这个密钥是在本地系统中生成的,因此当密钥保存在卡中时,从系统中删除密钥。

    您还可以直接在智能卡中创建密钥。要做到这一点,请遵循智能卡生产商生成的说明。

  9. 创建证书签名请求配置文件(将这个文本复制到 ca 目录中的命令行中):

    cat > req.cnf <<EOF
    [ req ]
    distinguished_name = req_distinguished_name
    prompt = no
    
    [ req_distinguished_name ]
    O = Example
    OU = Example Test
    CN = testuser
    
    [ req_exts ]
    basicConstraints = CA:FALSE
    nsCertType = client, email
    nsComment = "testuser"
    subjectKeyIdentifier = hash
    keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
    extendedKeyUsage = clientAuth, emailProtection, msSmartcardLogin
    subjectAltName = otherName:msUPN;UTF8:testuser@EXAMPLE.COM, email:testuser@example.com
    EOF
  10. 为 example.user 证书创建证书签名请求:

    # openssl req -new -nodes -key example.user.key \
        -reqexts req_exts -config req.cnf -out example.user.csr
  11. 配置新证书。过期期限设定为 1 年:

    # openssl ca -config ca.cnf -batch -notext \
        -keyfile rootCA.key -in example.user.csr -days 365 \
        -extensions usr_cert -out example.user.crt

此时,认证颁发机构和证书被成功生成并准备好导入到智能卡。

4.2. 将证书复制到 SSSD 目录中

GNOME 桌面管理器(GDM)需要 SSSD。如果使用 GDM,则需要将 PEM 证书复制到 /etc/sssd/pki 目录中。

先决条件

  • 已生成本地 CA 颁发机构和证书

流程

  1. 确保已在系统中安装了 SSSD。

    # rpm -q sssd
    sssd-2.0.0.43.el8_0.3.x86_64
  2. 创建 /etc/sssd/pki 目录:

    # file /etc/sssd/pki
    /etc/sssd/pki/: directory
  3. rootCA.crt 作为 PEM 文件复制到 /etc/sssd/pki/ 目录中:

    # cp /tmp/ca/rootCA.crt /etc/sssd/pki/sssd_auth_ca_db.pem

现在,您已成功生成了证书颁发机构和证书,并将它们保存到 /etc/sssd/pki 目录中。

注意

如果要与另一个应用程序共享证书颁发机构证书,您可以在 sssd.conf 中更改位置:

  • SSSD PAM 响应者:[pam] 部分中的 pam_cert_db_path
  • SSSD ssh 响应器:[ssh] 部分中的 ca_db

详情请查看 sssd.conf 的 man page。

红帽建议保留默认路径,并使用 SSSD 的专用证书颁发机构文件来确保这里只列出信任验证的证书颁发机构。

4.3. 安装用来管理和使用智能卡的工具

要配置智能卡,您需要一些工具来生成证书并将其保存在智能卡中。

您必须:

  • 安装可帮助您管理证书的 gnutls-utils 软件包。
  • 安装 opensc 软件包,它提供一组库和工具来使用智能卡。
  • 启动与智能卡读取器沟通的 pcscd 服务。

流程

  1. 安装 openscgnutls-utils 软件包:

    # dnf -y install opensc gnutls-utils
  2. 启动 pcscd 服务。

    # systemctl start pcscd

验证 pcscd 服务是否正在运行。

4.4. 在智能卡中存储证书

本节论述了使用 pkcs15-init 工具配置智能卡,帮助您配置:

  • 擦除智能卡
  • 设置新的 PIN 和可选的 PIN Unblocking Keys(PUKs)
  • 在智能卡上创建新插槽
  • 在插槽存储证书、私钥和公钥
  • 锁定智能卡设置(有些智能卡需要这种类型)

先决条件

  • 已安装 opensc 软件包,其中包括 pkcs15-init 工具。

    详情请查看安装用于管理和使用智能卡的工具

  • 该卡插入读卡器并连接到计算机。
  • 您有可保存在智能卡中的私钥、公钥和证书。在此过程中,testuser.keytestuserpublic.keytestuser.crt 是用于私钥、公钥和证书的名称。
  • 您当前的智能卡用户 PIN 和 Security Officer PIN(SO-PIN)

流程

  1. 擦除智能卡并使用您的 PIN 验证自己:

    $ pkcs15-init --erase-card --use-default-transport-keys
    Using reader with a card: Reader name
    PIN [Security Officer PIN] required.
    Please enter PIN [Security Officer PIN]:

    这个卡已经被清除。

  2. 初始化智能卡,设置您的用户 PIN 和 PUK,以及您的安全响应 PIN 和 PUK:

    $ pkcs15-init --create-pkcs15 --use-default-transport-keys \
        --pin 963214 --puk 321478 --so-pin 65498714 --so-puk 784123
    Using reader with a card: Reader name

    pcks15-init 工具在智能卡上创建新插槽。

  3. 为插槽设置标签和验证 ID:

    $ pkcs15-init --store-pin --label testuser \
        --auth-id 01 --so-pin 65498714 --pin 963214 --puk 321478
    Using reader with a card: Reader name

    该标签设置为人类可读值,本例中为 testuserauth-id 必须是两个十六进制值,在本例中将其设置为 01

  4. 在智能卡的新插槽中存储并标记私钥:

    $ pkcs15-init --store-private-key testuser.key --label testuser_key \
        --auth-id 01 --id 01 --pin 963214
    Using reader with a card: Reader name
    注意

    在存储您的私钥和证书时,您为 --id 指定的值必须相同。如果没有为 --id 指定值,则更复杂的值由工具计算,因此更易于定义您自己的值。

  5. 在智能卡上的新插槽中存储并标记该证书:

    $ pkcs15-init --store-certificate testuser.crt --label testuser_crt \
        --auth-id 01 --id 01 --format pem --pin 963214
    Using reader with a card: Reader name
  6. (可选)在智能卡上新插槽中保存并标记公钥:

    $ pkcs15-init --store-public-key testuserpublic.key
        --label testuserpublic_key --auth-id 01 --id 01 --pin 963214
    Using reader with a card: Reader name
    注意

    如果公钥与私钥和/或证书对应,您应该指定与私钥和/或证书相同的 ID。

  7. (可选)有些智能卡要求您通过锁定设置来完善卡:

    $ pkcs15-init -F

    此时您的智能卡在新创建的插槽中包含证书、私钥和公钥。您还创建了您的用户 PIN 和 PUK,以及安全响应 PIN 和 PUK。

4.5. 使用智能卡验证配置 SSH 访问

SSH 连接需要身份验证。您可以使用密码或证书。本节描述:

  • 使用保存在智能卡中的证书启用验证所需的配置
  • 使用 authselect 工具设置在取出卡时进行锁定

取出卡时进行锁定会强制在智能卡被取出后注销用户的登陆。

有关使用authselect 配置智能卡的详情,请参考使用 authselect 配置智能卡

先决条件

  • 该智能卡包含您的证书和私钥。
  • 该卡插入读卡器并连接到计算机。
  • 已安装并配置了 SSSD。
  • 您的用户名与证书的 SUBJECT 中的 Common Name(CN)或 User ID(UID)匹配。
  • pcscd 服务正在您的本地机器中运行。

    详情请查看安装用于管理和使用智能卡的工具

流程

  1. 在使用智能卡验证的用户主目录中为 SSH 密钥创建新目录:

    # mkdir /home/example.user/.ssh
  2. 使用 opensc 库运行 ssh-keygen -D 命令检索与智能卡中的私钥配对的现有公钥,并将其添加到用户 SSH 密钥目录的 authorized_keys 列表中,以启用智能卡验证的 SSH 访问。

    # ssh-keygen -D /usr/lib64/pkcs11/opensc-pkcs11.so >> ~example.user/.ssh/authorized_keys
  3. SSH 需要正确配置 /.ssh 目录和 authorized_keys 文件。要设置或更改访问权限,请输入:

    # chown -R example.user:example.user ~example.user/.ssh/
    # chmod 700 ~example.user/.ssh/
    # chmod 600 ~example.user/.ssh/authorized_keys
  4. 另外,显示密钥:

    # cat ~example.user/.ssh/authorized_keys

    终端会显示密钥。

  5. 验证 /etc/sssd/sssd.conf 文件中是否启用了智能卡身份验证:

    [pam] 部分,启用 pam 证书验证模块: pam_cert_auth = True

    如果该 sssd.conf 文件还没有创建,您可以通过将以下脚本复制到命令行来创建最小功能配置:

    # cat > /etc/sssd/sssd.conf <<EOF
    [sssd]
    services = nss, pam
    domains = shadowutils
    
    [nss]
    
    [pam]
    pam_cert_auth = True
    
    [domain/shadowutils]
    id_provider = files
    EOF
  6. 要使用 SSH 密钥,请使用 authselect 命令配置身份验证:

    # authselect select sssd with-smartcard with-smartcard-lock-on-removal --force

现在,您可以使用以下命令验证 SSH 访问:

# ssh -I /usr/lib64/opensc-pkcs11.so -l example.user localhost hostname

如果配置成功,会提示您输入智能卡 PIN。

这个配置现在可以在本地运行。现在,您可以复制公钥并将其发布到您要使用 SSH 的所有服务器中的 authorized_keys 文件。


为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。