Criou o certificado PFX, mas a criptografia não está ativada

1

Eu criei um certificado PFX usando o Prompt de Comando do Visual Studio Developer da seguinte maneira:

makecert -r -pe -n "CN=mycert" -sky exchange "mycert.cer" -sv "mycert.pvk"
pvk2pfx -pvk "mycert.pvk" -spc "mycert.cer" -pfx "mycert.pfx" -pi [password]

Então eu uso o PowerShell para interrogar o certificado

$cert = Get-PfxCertificate [Location]
$cert.Verify()
# Returns 'False'

Como posso obter esse certificado para criptografia?

Atualizar

@root sugerido usando o comando Import-PfxCertificate . Isso é o que acontece quando eu o executo.

Import-PfxCertificate -FilePath [Path]
Import-PfxCertificate : The PFX file you are trying to import requires either a different password or membership in an Active Directory principal to which it is protected.
At line:1 char:1
+ Import-PfxCertificate -FilePath [...]
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Import-PfxCertificate], Win32Exception
    + FullyQualifiedErrorId : System.ComponentModel.Win32Exception,Microsoft.CertificateServices.Commands.Im 
   portPfxCertificate

Atualizações adicionais

@ O McDonald's sugeriu um método seguro para passar a senha para o comando Import-PfxCertificate . Isso é o que eu tentei;

Import-PfxCertificate -FilePath [Path] -Password (Get-Credential).Password
$cert = dir cert:\localmachine\my | where { $_.Thumbprint -eq [Thumbprint] } | Select-Object
$cert.Verify()

Ainda retorna falso. Mais alguma pista?

    
por Steztric 16.06.2017 / 11:36

2 respostas

2

A Verify O método verifica se um certificado é confiável. Para ver exatamente por que a verificação está falhando, precisamos criar a cadeia:

$cert = Get-PfxCertificate -FilePath .\mycert.pfx
$chain = New-Object System.Security.Cryptography.X509Certificates.X509Chain
$chain.Build($cert)
$chain.ChainStatus

Quando eu repito suas etapas e executo esses comandos, obtenho um status de UntrustedRoot . Isso significa que a verificação falhou porque o certificado não está assinado por uma autoridade de certificação confiável, o que faz sentido, já que estamos autografando-o (a -r em makecert ).

Para verificar o certificado, importe-o para o armazenamento Autoridades de Certificação Raiz Confiáveis:

Import-PfxCertificate -CertStoreLocation Cert:\CurrentUser\Root -FilePath .\testcert.pfx -Password (Read-Host 'Password' -AsSecureString)

Digite a senha do PFX, aceite o grande diálogo de aviso e o certificado será adicionado. Então a verificação será aprovada. Se você preferir GUIs, certmgr.msc fará o trabalho.

Você pode usar os parâmetros RSA muito bem sem que o certificado seja confiável para o seu computador. Digamos que o número 137 seja uma mensagem secreta para o detentor da chave privada. Podemos usar a chave pública para criptografar nossa mensagem:

$public = Get-PfxCertificate .\mycert.cer
$public.PublicKey.Key.Encrypt(@(137), $false)

Então, de alguma forma, o grande conjunto criptografado de bytes resultante (chamá-lo de $message ) chega ao detentor da chave privada, que recupera o número original:

$private = Get-PfxCertificate .\mycert.pfx
$private.PrivateKey.Decrypt($message)

Geralmente algo mais interessante / avançado ( consulte MSDN ) seria feito com as chaves. A questão é que os aplicativos podem usar o certificado sem a confiança da máquina.

    
por 23.06.2017 / 00:21
0

Aceitei a resposta da @ BenN, já que essa é a solução real. Eu queria reunir as coisas que aprendi em um processo coeso, para que seja fácil para outras pessoas gerar certificados para criptografia.

Etapa 1: criar um certificado

$publicCert = New-SelfSignedCertificate -DnsName $dnsName '
    -CertStoreLocation Cert:\LocalMachine\My

O certificado não é confiável

$publicCert.Verify()
False

Etapa 2: exportar o certificado PFX

$cred = Get-Credential
Export-PfxCertificate -Cert $publicCert -FilePath $certPath -Password $cred.Password

Etapa 3: instale o certificado no armazenamento de certificados raiz

Import-PfxCertificate -FilePath $certPath -CertStoreLocation Cert:\CurrentUser\Root '
    -Password $cred.Password

Etapa 4: verificar o certificado novamente

$publicCert.Verify()
True

Depois, você pode seguir as instruções do @ BenN sobre como usar o certificado para executar a descriptografia.

    
por 23.06.2017 / 12:00