在 Active Directory 上为基于 PKINIT 的 Kerberos 登录创建证书
Create Certificates for PKINIT-based Kerberos login on Active Directory
我正在尝试在 Active Directory 上设置基于 PKINIT 的 Kerberos 登录。应在 Linux 上使用 sssd 执行登录。但是,kerberos 服务器不接受客户端证书。我们收到事件 ID 为 21 的错误:用户 REALM/Domainuser 的证书在服务器上无效并且 sssd 显示:客户端名称不匹配。
证书是在另一台 Linux 机器上通过以下过程创建的:
openssl req -new -key keyfile.pem -out reqfile.pem -subj
"/CN=Domainuser/O=AAA/C=DE/OU=BBB"
env REALM=REALM.local CLIENT=Domainuser openssl x509 \
-CAkey ../ca_privkey.pem -CA ../ca_cert.pem -req -in reqfile.pem \
-extensions client_cert -extfile extensions.client \
-days 365 -out certfile.pem
我们在托管 AD 本身的 Windows 服务器上安装了 AD CA。我们将此 CA 的证书导出到 Linux 机器并将其私钥和证书存储在 ca_privkey.pem
和 ca_cert.pem
文件中以与 openssl
.[=25= 一起使用]
我们在创建签名时使用的 client_cert
是使用 sssd 建议的模板创建的。我们唯一添加的是 crlDistributionPoints
选项以包含 CA 的 CRL:
[client_cert]
basicConstraints=CA:FALSE
keyUsage=digitalSignature,keyEncipherment,keyAgreement
extendedKeyUsage=1.3.6.1.5.2.3.4
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
issuerAltName=issuer:copy
subjectAltName=otherName:1.3.6.1.5.2.2;SEQUENCE:princ_name
crlDistributionPoints=URI:http://link-to-CRL-of-CA
[princ_name]
realm=EXP:0,GeneralString:${ENV::REALM}
principal_name=EXP:1,SEQUENCE:principal_seq
[principal_seq]
name_type=EXP:0,INTEGER:1
name_string=EXP:1,SEQUENCE:principals
[principals]
princ1=GeneralString:${ENV::CLIENT}
用于认证的领域是REALM.local(等于AD域)。环境变量 REALM
和 CLIENT
在证书创建期间设置为 REALM.LOCAL
和 pkuser
并且用户 pkuser
也存在于AD中(基于密码的登录是可能)。
我不知道为什么认证不成功。您是否知道配置中可能有什么问题或给我提示 s.t。 Windows 打印更详细的错误信息?请注意,certutil -verify -urlfetch certfile.pem
能够验证整个证书链,并且在 AD 服务器上使用 Administrator
命令执行时不会打印任何错误。
我假设 Windows 服务器上存在一些配置错误。这是我第一次配置 Windows 服务器 ;)
终于,我们弄清楚了问题出在哪里。 Windows AD 需要额外的扩展密钥使用字段才能进行身份验证。
您必须添加 1.3.6.1.5.5.7.3.2
和 1.3.6.1.4.1.311.20.2.2
。
此外,SAN 必须设置为:otherName:1.3.6.1.4.1.311.20.2.3;UTF8:<client-name>@<realm>
我正在尝试在 Active Directory 上设置基于 PKINIT 的 Kerberos 登录。应在 Linux 上使用 sssd 执行登录。但是,kerberos 服务器不接受客户端证书。我们收到事件 ID 为 21 的错误:用户 REALM/Domainuser 的证书在服务器上无效并且 sssd 显示:客户端名称不匹配。
证书是在另一台 Linux 机器上通过以下过程创建的:
openssl req -new -key keyfile.pem -out reqfile.pem -subj "/CN=Domainuser/O=AAA/C=DE/OU=BBB"
env REALM=REALM.local CLIENT=Domainuser openssl x509 \ -CAkey ../ca_privkey.pem -CA ../ca_cert.pem -req -in reqfile.pem \ -extensions client_cert -extfile extensions.client \ -days 365 -out certfile.pem
我们在托管 AD 本身的 Windows 服务器上安装了 AD CA。我们将此 CA 的证书导出到 Linux 机器并将其私钥和证书存储在 ca_privkey.pem
和 ca_cert.pem
文件中以与 openssl
.[=25= 一起使用]
我们在创建签名时使用的 client_cert
是使用 sssd 建议的模板创建的。我们唯一添加的是 crlDistributionPoints
选项以包含 CA 的 CRL:
[client_cert]
basicConstraints=CA:FALSE
keyUsage=digitalSignature,keyEncipherment,keyAgreement
extendedKeyUsage=1.3.6.1.5.2.3.4
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
issuerAltName=issuer:copy
subjectAltName=otherName:1.3.6.1.5.2.2;SEQUENCE:princ_name
crlDistributionPoints=URI:http://link-to-CRL-of-CA
[princ_name]
realm=EXP:0,GeneralString:${ENV::REALM}
principal_name=EXP:1,SEQUENCE:principal_seq
[principal_seq]
name_type=EXP:0,INTEGER:1
name_string=EXP:1,SEQUENCE:principals
[principals]
princ1=GeneralString:${ENV::CLIENT}
用于认证的领域是REALM.local(等于AD域)。环境变量 REALM
和 CLIENT
在证书创建期间设置为 REALM.LOCAL
和 pkuser
并且用户 pkuser
也存在于AD中(基于密码的登录是可能)。
我不知道为什么认证不成功。您是否知道配置中可能有什么问题或给我提示 s.t。 Windows 打印更详细的错误信息?请注意,certutil -verify -urlfetch certfile.pem
能够验证整个证书链,并且在 AD 服务器上使用 Administrator
命令执行时不会打印任何错误。
我假设 Windows 服务器上存在一些配置错误。这是我第一次配置 Windows 服务器 ;)
终于,我们弄清楚了问题出在哪里。 Windows AD 需要额外的扩展密钥使用字段才能进行身份验证。
您必须添加 1.3.6.1.5.5.7.3.2
和 1.3.6.1.4.1.311.20.2.2
。
此外,SAN 必须设置为:otherName:1.3.6.1.4.1.311.20.2.3;UTF8:<client-name>@<realm>