Certificados com chave privada associada
A classe PKCertificateWithKey detém informação de certificados que possuem chave privada associada e permite operações seguras com esta chave.
As diferentes maneiras de se carregar certificados com chave privada são apresentadas nas seções seguintes.
Carregando certificados pessoais do Windows Store
// Carregando certificados pessoais do Windows Store
var store = WindowsCertificateStore.LoadPersonalCurrentUser();
// Selecionando os certificados com chave privada associada
var certsWithKey = store.GetCertificatesWithKey();
// Exibindo informações dos certificados
certsWithKey.ForEach(c => Console.WriteLine(c.Certificate));
A classe WindowsCertificateStore
além de carregar certificados pessoais do usuário, também permite
carregar certificados da máquina ou de um StoreName
e StoreLocation
passado.
Para mais informações de opções para carregar certificados do Windows Store, verifique os métodos de "Load" no guia da API: WindowsCertificateStore
Carregando certificado de um PKCS#12
// PKCS#12 bytes e password
byte[] pkcs12Content = ...
string password = ...
// Carregando um PKCS#12
var p12 = Pkcs12CertificateStore.Load(pkcs12Content, password);
// Selecionando os certificados com chave privada associada
var certsWithKey = p12.GetCertificatesWithKey();
// Exibindo informações dos certificados
certsWithKey.ForEach(c => Console.WriteLine(c.Certificate));
Operações com chave
A classe PKCertificateWithKey permite realizar as seguintes operações com a chave privada do certificado:
- Realização de algoritmo de assinatura (métodos SignData(SignatureAlgorithm, Byte[]) e SignHash(SignatureAlgorithm, Byte[]))
- Verificação de algoritmo de assinatura (métodos VerifyData(SignatureAlgorithm, Byte[], Byte[]) e VerifyHash(SignatureAlgorithm, Byte[], Byte[]))
Seu uso é exemplificado a seguir.
Assinatura de dados
PKCertificateWithKey certWithKey = ...
// Definindo algoritmo de digest
var digestAlgorithm = DigestAlgorithm.SHA256;
// Definindo bytes a serem assinados
var toSign = System.Text.Encoding.ASCII.GetBytes("hello pki");
// Assinando com certificado
var signature = certWithKey.SignData(digestAlgorithm, toSign);
// Verificando assinatura
Console.WriteLine(certWithKey.VerifyData(digestAlgorithm, toSign, signature));
Assinatura de hash
PKCertificateWithKey certWithKey = ...
// Definindo algoritmo de digest
var digestAlgorithm = DigestAlgorithm.SHA256;
// Computando hash a ser assinado
var toSignHash = digestAlgorithm.ComputeHash(System.Text.Encoding.ASCII.GetBytes("hello pki"));
// Assinando com certificado
var signature = certWithKey.SignHash(digestAlgorithm, toSignHash);
// Verificando assinatura
Console.WriteLine(certWithKey.VerifyHash(digestAlgorithm, toSignHash, signature));