第 6 章 使用本地证书配置智能卡验证

使用本地证书配置智能卡验证:

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

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

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

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

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

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

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

先决条件

  • 已安装 authselect

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

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

    详情请查看 RHEL9 中的智能卡支持

6.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

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