Estou tentando criar a infraestrutura necessária para permitir que usuários autorizados assinem scripts do PowerShell e que a organização confie neles. Isso permite implantar scripts em computadores com a Política de Execução AllSigned. Este é o processo que imagino:
- Um servidor de Serviços de Autoridade de Certificação do Windows cria um RootCA (RootCA.cer).
- Dentro desse servidor há um modelo de certificado para um certificado de assinatura de código.
- O RootCA é implantado em todos os computadores por meio da Política de Grupo e colocado no Trusted Publisher Store.
- Um usuário solicita um certificado de assinatura de código usando o modelo (CodeSigningCert.cer), que é assinado e verificado pelo RootCA.
Neste ponto, o certificado de assinatura de código (CodeSigningCert.cer) é um delegado do RootCA (RootCA.cer) e, em minha suposição, deve se qualificar como um Publicador confiável porque seu pai (RootCA.cer) está no armazenamento do Editor confiável.
No entanto, se eu assinar um script do PowerShell usando este certificado:
$cert = Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert
Set-AuthenticodeSignature -FilePath "Z:\PowerShellTest.ps1" -Certificate $cert
E então tento executá-lo, recebo:
Do you want to run software from this untrusted publisher?
Por outro lado, se eu adicionar manualmente o próprio CodeSigningCert.cer ao armazenamento do Trusted Publisher, o Windows executará o script do PowerShell com satisfação, pois é confiável.
Por favor, diga:
- Estou enganado ao presumir que é assim que funcionam as cadeias de assinatura AuthenticodeSignature? (Em que apenas o pai precisa ser confiável e os delegados podem assinar scripts)
- Se estou enganado , qual é a maneira ideal de assinar scripts do PowerShell como uma organização?
- Se não me engano, o que estou fazendo de errado?
Obrigado por qualquer ajuda que você possa fornecer.
Você não está realmente enganado, apenas não sabe todos os detalhes. Resumindo, a confiança na assinatura de código no .NET é dividida em 4 níveis:
E a política de execução do PowerShell exige nível de confiança do Trusted Publisher . Isso significa que junto com o certificado de CA raiz, você deve distribuir o certificado de assinatura de código exato para o contêiner de certificados de Editores Confiáveis do cliente. Você pode fazer isso usando políticas de grupo.
ps: Eu recomendaria usar carimbo de data/hora durante a assinatura. Isso permitirá a execução de scripts assinados mesmo após a expiração do certificado de assinatura de código. Mais detalhes na postagem do meu blog: https://www.sysadmins.lv/blog-en/digital-signatures.aspx