

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

# 为你的 Amazon Microsoft AD 托管用户启用用于初始身份验证的公钥加密 (PKINIT)
<a name="ms_ad_map_altsecurityidentity"></a>

Amazon 默认情况下，托管 Microsoft AD 目录使用强证书绑定，这需要在证书和 AD 对象之间进行显式映射。对于 Amazon 托管 Microsoft AD，以下映射被认为是强大的：
+ `altSecurityIdentities` 颁发者和序列号
+ `altSecurityIdentities` 使用者密钥标识符
+ `altSecurityIdentities` SHA1 公钥的哈希值

这些属性支持强大的证书映射，这要求在 Active Directory 中定义显式 certificate-to-user关系，从而为基于证书的身份验证提供更好的安全性。这有助于防范基于证书的权限提升攻击

可使用此过程配置强证书绑定，在保持证书身份验证功能的同时帮助防止权限提升攻击。

有关更多信息，请参阅 [Microsoft KB5014754：Windows 域控制器上基于证书的身份验证更改](https://support.microsoft.com/en-us/topic/kb5014754-certificate-based-authentication-changes-on-windows-domain-controllers-ad2c23b0-15d8-4340-a468-4d4f3b188f16)

## 先决条件
<a name="ms_ad_map_altsecurityidentity_prerequisite"></a>
+ 配置了证书颁发机构的 Amazon 托管 Microsoft AD 目录
+ 对 Active Directory 环境的管理权限
+ PowerShell 安装了活动目录模块
+ 要映射至 AD 对象的证书

## 地图 AltSecurityIdentity 属性
<a name="ms_ad_map_altsecurityidentity_steps"></a>

1. 根据证书信息，选择以下 `AltSecurityIdentity` 映射方法之一：
   + **SHA1 hash** — 使用证书公钥的 SHA1 哈希值

     对于 SHA1 哈希映射，请提取证书哈希值并将其应用于用户对象：

     ```
     $Username = 'YourUsername'
     $cert = certutil -dump "YourCertificate.cer"
     $certHash = ($cert | Select-String -Pattern "(sha1):*" | 
         Select-String -Pattern "Cert").ToString().TrimStart('Cert Hash(sha1): ').Replace(' ','')
     Set-ADUser -Identity $Username -Add @{'altSecurityIdentities'="X509:<SHA1-PUKEY>$CertHash"}
     ```
   + **颁发者和序列号**：使用证书的颁发者名称和序列号

     对于颁发者和序列号映射，请使用证书的颁发者和序列号：

     ```
     $Username = 'YourUsername'
     $IssuerName = 'YourCertificateIssuer'
     $SerialNumber = 'YourCertificateSerialNumber'
     Set-ADUser -Identity $Username -Add @{'altSecurityIdentities'="X509:<I>$IssuerName<SR>$SerialNumber"}
     ```
   + **使用者密钥标识符**：使用证书的使用者密钥标识符扩展

     对于使用者密钥标识符映射，请使用证书的使用者密钥标识符：

     ```
     $Username = 'YourUsername'
     $SubjectKeyIdentifier = 'YourSubjectKeyIdentifier'
     Set-ADUser -Identity $Username -Add @{'altSecurityIdentities'="X509:<SKI>$SubjectKeyIdentifier"}
     ```

1. 验证映射是否成功应用：

   ```
   Get-ADUser -Identity $Username -Properties altSecurityIdentities | 
       Select-Object -ExpandProperty altSecurityIdentities
   ```

1. 等待 Active Directory 复制完成（通常为 15-30 秒钟），然后再测试证书身份验证。

## 示例：映射 AltSecurityIdentity 属性的批量证书
<a name="ms_ad_map_altsecurityidentity_example"></a>

以下示例演示如何对来自某个证书颁发机构的多个用户证书的 `AltSecurityIdentity` 属性进行映射：

```
$CertificateTemplateName = 'User'
$Now = $((Get-Date).ToString($(Get-culture).DateTimeFormat.ShortDatePattern))
$Restrict = "Disposition=20,NotAfter>=$Now,Certificate Template=$CertificateTemplateName"
$Out = "SerialNumber,Certificate Hash,User Principal Name,RequesterName,CommonName,CertificateTemplate,NotBefore,NotAfter"
$Certs = certutil -view -restrict $Restrict -out $Out csv | ConvertFrom-CSV
$UserSha1HashMapping = @{}

ForEach ($Cert in $Certs) {
    $UPN = $Cert.'User Principal Name'
    $Username, $Domain = $UPN.Split('@')
    $CertificateThumbprint = ($Cert.'Certificate Hash').Replace(' ','')
    $AdUserObject = Get-ADUser -Identity $Username
    If ($AdUserObject -And $AdUserObject.Count -gt 1) {
        Write-Output "Unable to map user: $Username, multiple user objects found"
        Continue
    }
    If ($AdUserObject) {
        If ($UserSha1HashMapping.Keys -Contains $Username) {
            $UserSha1HashMapping[$Username] += $CertificateThumbprint
        } Else {
            $UserSha1HashMapping[$Username] = @($CertificateThumbprint)
        }
    }
}

ForEach ($User in $UserSha1HashMapping.Keys) {
    Write-Output "Mapping altSecurityIdentity for $User"
    $UserObject = Get-ADUser -Identity $User | Get-ADObject -Properties 'altSecurityIdentities'
    $altSecurityIdentities = $UserObject.altSecurityIdentities
    ForEach ($thumbprint in $UserSha1HashMapping[$User]) {
        $SHA1PUKEY = "X509:<SHA1-PUKEY>$thumbprint"
        If ($altSecurityIdentities -Contains $SHA1PUKEY) {
            Write-Output "Skipping $thumbprint, already mapped."
            Continue
        }
        Write-Output "Adding $thumbprint to $User as altSecurityIdentity"
        Set-ADUser -Identity $User -Add @{'altSecurityIdentities'=$SHA1PUKEY}
    }
}
```

## 后续步骤
<a name="ms_ad_map_altsecurityidentity_next_steps"></a>
+ 使用映射的证书测试基于证书的身份验证
+ 配置应用程序，以使用映射的证书进行身份验证
+ 身份验证事件的 [监控你的 Amazon 托管微软 AD](ms_ad_monitor.md)