Обработка пользовательских сертификатов AD - PullRequest
0 голосов
/ 18 марта 2019

Я настоящий новичок в Powershell, и реальная проблема заключается в том, что я немного растерялся из-за того, как искать по различным свойствам и с трудом нахожу примеры, которые соответствуют моим потребностям.

Сэто говорит о том, что мне нужно искать в Active Directory, чтобы найти пользовательские сертификаты S / MIME, срок действия которых истекает, выданные конкретным центром сертификации.

Что у меня уже есть:

$Mail = user@example.com
$allProfileCerts = Get-ADUser -Server example.com:3268 -Filter {EmailAddress -eq $Mail} -Properties Certificates  | select Certificates

Результат:

       Handle Issuer     Subject                                                                                                             
       ------ ------     -------                                                                                                             
1625625266096 CN=<CA1>   E=test.user@example.com, CN=Test User, OU=Normal, OU=Users, OU=EXAMPLE, ...
1625625265968 CN=<CA2>   E=test.user@example.com, CN=Test User, O=Example Company, ...    
1625625271728 CN=<CA1>   CN=Test User, OU=Normal, OU=Users, OU=EXAMPLE, ...

Я полагал, что следующим шагом может быть:

$allProfileCerts.Certificates | foreach {New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $_}

Результаты предоставляют более подробную информацию (отредактировано для удаления PII):

EnhancedKeyUsageList     : {Secure Email (1.3.6.1.5.5.7.3.4)}
DnsNameList              : {Test User}
SendAsTrustedIssuer      : False
EnrollmentPolicyEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
EnrollmentServerEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
PolicyId                 : 
Archived                 : False
Extensions               : {System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid...}
FriendlyName             : 
IssuerName               : System.Security.Cryptography.X509Certificates.X500DistinguishedName
NotAfter                 : 29/05/2021 10:47:00
NotBefore                : 11/12/2018 09:47:00
HasPrivateKey            : False
PrivateKey               : 
PublicKey                : System.Security.Cryptography.X509Certificates.PublicKey
RawData                  : {48, 130, 8, 51...}
SerialNumber             : <snip>
SubjectName              : System.Security.Cryptography.X509Certificates.X500DistinguishedName
SignatureAlgorithm       : System.Security.Cryptography.Oid
Thumbprint               : <snip>
Version                  : 3
Handle                   : 1625625266096
Issuer                   : <ISSUER1>
Subject                  : <subject>

EnhancedKeyUsageList     : {Secure Email (1.3.6.1.5.5.7.3.4)}
DnsNameList              : {Test User}
SendAsTrustedIssuer      : False
EnrollmentPolicyEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
EnrollmentServerEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
PolicyId                 : 
Archived                 : False
Extensions               : {System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid...}
FriendlyName             : 
IssuerName               : System.Security.Cryptography.X509Certificates.X500DistinguishedName
NotAfter                 : 30/08/2020 14:00:00
NotBefore                : 30/08/2018 02:00:00
HasPrivateKey            : False
PrivateKey               : 
PublicKey                : System.Security.Cryptography.X509Certificates.PublicKey
RawData                  : {48, 130, 5, 127...}
SerialNumber             : <snip>
SubjectName              : System.Security.Cryptography.X509Certificates.X500DistinguishedName
SignatureAlgorithm       : System.Security.Cryptography.Oid
Thumbprint               : <snip>
Version                  : 3
Handle                   : 1625625265968
Issuer                   : <ISSUER2>
Subject                  : <subject>

EnhancedKeyUsageList     : {Encrypting File System (1.3.6.1.4.1.311.10.3.4)}
DnsNameList              : {Test User}
SendAsTrustedIssuer      : False
EnrollmentPolicyEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
EnrollmentServerEndPoint : Microsoft.CertificateServices.Commands.EnrollmentEndPointProperty
PolicyId                 : 
Archived                 : False
Extensions               : {System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid, System.Security.Cryptography.Oid...}
FriendlyName             : 
IssuerName               : System.Security.Cryptography.X509Certificates.X500DistinguishedName
NotAfter                 : 09/04/2020 15:57:37
NotBefore                : 22/10/2017 15:57:37
HasPrivateKey            : False
PrivateKey               : 
PublicKey                : System.Security.Cryptography.X509Certificates.PublicKey
RawData                  : {48, 130, 8, 4...}
SerialNumber             : <snip>
SubjectName              : System.Security.Cryptography.X509Certificates.X500DistinguishedName
SignatureAlgorithm       : System.Security.Cryptography.Oid
Thumbprint               : <snip>
Version                  : 3
Handle                   : 1625625271728
Issuer                   : <ISSUER1>
Subject                  : <subject>

Я также подумал, что могу легко фильтровать по дате, используя Where-Object NotAfter... (поправьте меня, если я ошибаюсь в этом :)), но ради любви к миру я не могу понять, как фильтровать по EnhancedKeyUsageList : {Secure Email (1.3.6.1.5.5.7.3.4)},Я думаю, что это массив (может быть более одного EKU в любом данном сертификате), но как я могу фильтровать по элементам массива?

Бонусный вопрос: если у меня есть:

$oneCert = $allProfileCerts.Certificates | foreach {New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $_} | Where-Object SerialNumber -Match "<SN>"

Как мне получить доступ к полю «NotAfter»?Я пытался $oneCert."NotAfter", $oneCert["NotAfter"], $oneCert | % NotAfter, $oneCert | select -expandproperty "NotAfter" - ни один не работает: /

EDIT: код, который работает, на основе предложения @tomalak:

Get-ADUser -Server $Server -Filter {EmailAddress -eq $Mail} -Property Certificates |
    ForEach-Object {
        # ...we have "user" objects here
        Write-Host $_

        $_.Certificates | 
            foreach {New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $_} |
            Where-Object {
                $_.EnhancedKeyUsageList.FriendlyName -eq "Secure Email"
            }
    } |
    ForEach-Object {
    # ...we have "certificate" objects here
    Write-Host $_.Issuer
}

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Как правило, вы можете использовать Where-Object для фильтрации конвейера и -eq для фильтрации списков.В этом случае что-то вроде:

$adUser.Certificates | Where-Object {
    $_.EnhancedKeyUsageList.oid.Value -eq "1.3.6.1.5.5.7.3.4"
}

выдаст вам все сертификаты пользователя, у которых в списке EKU есть "1.3.6.1.5.5.7.3.4".

Обратите внимание, что когда Powershell (4.0 и выше) видит такиевыражение $object.Property.ChildProperty.SomeData, оно извлекает все Property значения, для всех них оно извлекает все ChildProperty значения и для всех их этоизвлекает все значения SomeDataЭто значительно экономит время при наборе текста.В традиционном императивном языке для этого вам понадобятся вложенные циклы, в Powershell вам вообще не нужны циклы.

Зная это, $_.EnhancedKeyUsageList.oid.Value -eq "1.3.6.1.5.5.7.3.4" становится возможным, поскольку -eq не является вашим традиционным "Оператор равенства: принимает список значений и фильтрует их, например:

1,2,3 -eq 3  # produces 3
1,3,3 -eq 3  # produces 3,3

. Вы можете пойти до

Get-ADUser -Property Certificates | Where-Object {
    $_.Certificates.EnhancedKeyUsageList.oid.Value -eq "1.3.6.1.5.5.7.3.4"
}

, чтобы получить всех пользователей AD, у которых есть совпадающиесертификат за один раз.

Поскольку вы хотите отфильтровать два свойства для каждого сертификата, я бы порекомендовал несколько вариантов

$minValid = (Get-Date).AddMonths(6)

Get-ADUser -Property Certificates -PipelineVariable user | ForEach-Object {
    # ...we have "user" objects here
    Write-Host $_

    $_.Certificates | Where-Object {
        $_.EnhancedKeyUsageList.oid.Value -eq "1.3.6.1.5.5.7.3.4" -and $_.NotAfter -lt $minValid
    }
} | ForEach-Object {
    # ...we have "certificate" objects here
    Write-Host $_
}
1 голос
/ 18 марта 2019

Я бы выбрал значение ObjectId:

$certificates |Where-Object {$_.EnhancedKeyUsageList.ObjectId -like '1.3.6.1.5.5.7.3.2'}

В этом примере используется перечисление свойств OID в EnhancedKeyUsageList, поэтому он будет работать только в PowerShell 4.0 или более новой версии

...