Habilitar a política de registro de certificados e solicitar um certificado usando o PowerShell

9

No momento, estou fazendo o seguinte para solicitar um certificado de um servidor CEP:

  • Abra gpedit.msc
  • Em Configuração do Computador> Configurações do Windows> Configurações de Segurança> Diretivas de Chave Pública, clique duas vezes em "Cliente de Serviços de Certificado - Política de Registro de Certificado"
  • Habilitar
  • Digite o CEP URI
  • Alterne para autenticação de nome de usuário / senha
  • Validar (Fornecer Creds)
  • Abra o MMC e importe o snap-in de certificados
  • Vá para Certificados> Pessoal
  • Clique com o botão direito do mouse> Solicitar novo certificado
  • Digite "mais informações" (CN, nome DNS etc.)
  • Fornecer Creds

Depois disso, tenho um certificado do CEP; no entanto, esse é um processo doloroso para ser feito manualmente. Existe alguma maneira de automatizar isso no Server 2008 (e 2012)? Todas as informações que posso encontrar sobre isso dizem como instalar os serviços CEP para tornar um servidor um servidor de políticas de inscrição (nada sobre solicitar um novo certificado ou habilitá-lo no lado do cliente). É possível automatizar isso?

Parece que esse processo adiciona muitos dados em HKEY_LOCAL_MACHINE \ SOFTWARE \ Policies \ Microsoft \ Cryptography. Posso adicionar isso manualmente (e falsificar um GUID / ServiceID)?

EGr
fonte
1
Para não desencorajar o seu entusiasmo, como também gosto de POWERSHELL TODAS AS COISAS !!!!!! mas os cmdlets da diretiva de grupo ainda são absolutamente horríveis e os cmdlets PKI são muito aprimorados na v4 em vez da v3, então ... :( No entanto, acho útil esse módulo PKI de terceiros para o módulo PowerShell e pode levar algumas das dor manual para fora o que você está tentando fazer.
HopelessN00b

Respostas:

3

Presumo que seus pedidos de certificado sejam feitos usando um modelo. Se for esse o caso, use o Public Key Policies/Certificate Services Client - Auto-Enrollment SettingsGPO para impor a inscrição automática. Você também deve garantir que o modelo que a ACL tenha Enrolle AutoEnrollmarque para computadores ou usuários do domínio (ou qualquer outro objeto da ACL , dependendo do público-alvo). certificado ou certificado de usuário que você está tentando enviar. A inscrição começa assim que a política é enviada por push (geralmente cerca de 15 minutos) depois que o GPO é vinculado e imposto.

Colyn1337
fonte
2
Bem, duh. Fiquei tão desconectado com a parte do PowerShell que fiquei totalmente impressionado com o fato de ter configurado muitos GPOs para automatizar a inscrição de certificados por muitos anos. D'oh! Boa pegada.
HopelessN00b
Essa é definitivamente uma opção (provavelmente a melhor opção), mas eu preferiria definir uma configuração de diretiva de grupo local .. isso é possível?
EGR
2
@ EGr por que no mundo você gostaria de fazer isso?
MDMoore313
@ HopelessN00b Eu fiz a mesma coisa, no entanto, seria legal ter uma maneira de fazer o PowerShell para solucionar problemas, no mínimo, por isso ainda é uma boa pergunta.
MDMoore313
1

Este é o processo que eu usei no Windows 2012 R2 e superior. Todo o código do PowerShell foi executado a partir de um prompt elevado do PowerShell. A automação completa é deixada como um exercício para o usuário.

Pré-requisito

Verifique se você possui um modelo no servidor de certificados com o botão de opção "Fornecer na solicitação" selecionado na guia Assunto. Como esta não é uma máquina AD, o servidor de certificação não pode consultar adequadamente o Active Directory para obter informações.

Exportar a raiz

Exporte o Certificado da Autoridade de Certificação Raiz Confiável no servidor de certificados e copie esse arquivo de certificado para o servidor de destino

certutil --% -ca.cert <name of certificate file>

Confie na raiz

Importe esse certificado para a Autoridade de Certificação Raiz Confiável no servidor de destino

$PathToCertificate=<name of certificate file>
$RootCertificate=Get-PfxCertificate -FilePath $PathToCertificate
$AlreadyExists=Get-ChildItem -Path "Cert:\LocalMachine\Root" | Where-Object { $_.Thumbprint -eq $RootCertificate.Thumbprint }
if ($AlreadyExists -eq $null) { Import-Certificate -CertStoreLocation "Cert:\LocalMachine\Root" -FilePath $PathToCertificate }
else { Write-Warning "Root certificate already installed" }

Fornecedor de Políticas do Active Directory

Determinar a URL para o provedor de diretivas do Active Directory

# Get AD Configuration Context
$RootDSE=[System.DirectoryServices.DirectoryEntry]::new("LDAP://RootDSE")
$ConfigContext="CN=Enrollment Services,CN=Public Key Services,CN=Services,"+$RootDSE.configurationNamingContext
# Get name of Enterprise Root Certificate Autority server
$Server=Get-ADObject -SearchBase $ConfigContext -Filter "*"
if ($Server.Count -eq 1) { throw "No Enterprise Root Certificate Autority server exists" }
else { $Server=$Server[1].Name }
# Get Enrollment URL
$ConfigContext="CN=$Server,"+$ConfigContext
$EnrollmentURL=(Get-ADObject -SearchBase $ConfigContext -Filter "*" -Properties "msPKI-Enrollment-Servers" | Select-Object -ExpandProperty "msPKI-Enrollment-Servers").Split("`n") | Where-Object { $_ -like "http*" }
if ($EnrollmentURL -eq $null) { $EnrollmentURL="" }
# Get AD Enrollment Policy URL
$Server=$Server+$RootDSE.configurationNamingContext.Value.Replace("CN=Configuration","").Replace(",DC=",".")
$WMI=Get-WmiObject -ComputerName $Server -Namespace "root\WebAdministration" -Class Application | Where-Object { $_.Path -eq "/ADPolicyProvider_CEP_UsernamePassword" }
if ($WMI -ne $null) { $PolicyURL="https://"+$Server+$WMI.Path+"/service.svc/CEP" }
else { $PolicyURL="" }
Write-Output "Enrollment URL = $EnrollmentURL"
Write-Output "Policy URL = $PolicyURL"

Política de Inscrição

Adicione a política de inscrição ao servidor de destino (isso funciona apenas no Windows 2012 e superior. Para obter instruções da GUI, veja abaixo). Verifique se a Política foi adicionada depois de criar o modelo que não é de domínio, caso contrário, ela não aparecerá, pois a política não será atualizada.

$User="<your domain name>\<your domain user name>"
$Pass="<Your domain password>"
$SecPass=ConvertTo-SecureString -String $Pass -AsPlainText -Force
$Cred=[System.Management.Automation.PSCredential]::new($User,$SecPass)
Add-CertificateEnrollmentPolicyServer -Url $PolicyURL -context Machine -NoClobber -AutoEnrollmentEnabled -Credential $Cred

Obter o certificado

Agora você deve conseguir se inscrever para um certificado usando o modelo desejado

$DNS="<FQDN of your server>"
$URL=Get-CertificateEnrollmentPolicyServer -Scope All -Context Machine | Select-Object -ExpandProperty Url | Select-Object -ExpandProperty AbsoluteUri
$Enrollment=Get-Certificate -Url $URL -Template "<Template name (not display name)>" -SubjectName "CN=$DNS" -DnsName $DNS -Credential $Cred -CertStoreLocation cert:\LocalMachine\My
$Enrollment.Certificate.FriendlyName=$DNS

Política de Inscrição Pré-Windows 2012 R2

  1. Abra os certificados MMC
  2. Faça uma busca detalhada no armazenamento de certificados pessoais
  3. Clique com o botão direito do mouse em "Certificados" e selecione Todas as tarefas / Operações avançadas / Gerenciar
  4. Políticas de inscrição no menu de contexto
  5. Clique no botão "Adicionar"
  6. Cole o URL da política de inscrição
  7. Selecione Nome de usuário / senha como o tipo de autenticação
  8. Clique no botão "Validar servidor" e insira suas credenciais de domínio, incluindo o domínio
  9. Supondo que você tenha conseguido validar com êxito, clique no botão "Adicionar"
  10. Selecione a política de inscrição e clique no botão "Propriedades"
  11. Verifique se a caixa "Ativar inscrição e renovação automática" está marcada
  12. Nunca marquei a opção "Exigir validação forte durante a inscrição" para não saber o que faz
Slogmeister Extraordinaire
fonte
0

Não tenho uma solução completa, no entanto, posso aconselhar pontos de partida. Meu módulo PKI do PowerShell tem a capacidade de registrar o ponto de extremidade do serviço de inscrição começando no Windows 7 / Windows Server 2008 R2 (observe que o Windows Server 2008 não oferece suporte a serviços de inscrição). Aqui está um exemplo de como registrar uma política: http://en-us.sysadmins.lv/Lists/Posts/Post.aspx?ID=101

em relação à inscrição. Esta série de postagens do blog pode fornecer algumas dicas sobre como utilizar as interfaces COM CertEnroll para realizar o registro de certificados no PowerShell. Infelizmente, não há nada sobre serviços da web de inscrição, mas as técnicas são as mesmas. Você precisará iniciar com esta interface: IX509CertificateRequestPkcs10V2

HTH

Crypt32
fonte