Gerando certificado autoassinado sem bibliotecas externas
Estou curioso para saber se existe uma maneira simples de criar um certificado autoassinado comparável ao abaixoNew-SelfSignedCertificate
comando (outros fornecedores também estão OK, por exemplo). Desejo usar apenas as bibliotecas .NET sem P / Invoke ou bibliotecas externas, como o Bouncy Castle ou sem chamar o PowerShell a partir do aplicativo.
New-SelfSignedCertificate -DnsName $certificateName -CertStoreLocation $certificateStore -KeyExportPolicy Exportable -Provider "Microsoft Enhanced RSA and AES Cryptographic Provider" -NotAfter $certificateNotAfter
Suponho que a alternativa mais simples seria chamar o PowerShell ou usar uma biblioteca Nuget como o Bouncy Castle, se isso não for possível sem instalações externas? Embora pareça que, se eu soubesse o suficiente como construir certificados, seria possível criar um modelo de matriz de bytes ou algo semelhante e usá-lo noX509Certificate2
construtor.
Parece que seria necessário
public X509Certificate2 GenerateCertificate(string fileName, string password, string subjectName, StoreName storeName, DateTime endDate, DateTime notAfter, string provider = "Microsoft Enhanced RSA and AES Cryptographic Provider")
{
//Could provider be taken from https://stackoverflow.com/questions/43474902/generate-self-signed-rsa-2048-sha-256-certificate-pfx-file-using-openssl?
var newCertificate = new X509Certificate2(fileName, password, X509KeyStorageFlags.Exportable);
/*
# The following creates a self-signed certificate with one year of running time.
$currentDate = Get-Date
$certificateEndDate = $currentDate.AddYears(1)
$certificateNotAfter = $certificateEndDate.AddYears(1)
$certificateName = "https://www.test.com/test"
$certificateStore = "Cert:\LocalMachine\My"
New-SelfSignedCertificate -DnsName $certificateName -CertStoreLocation $certificateStore -KeyExportPolicy Exportable -Provider "Microsoft Enhanced RSA and AES Cryptographic Provider" -NotAfter $certificateNotAfter
*/
}
<edit: Logo ficou claro que não há uma boa maneira de fazer isso com o .NET simples.
Mais algumas opções que encontrei:
Uma postagem no blogCriando certificados assinados por autoridade e autoassinados no .NET porSteve Syfuhs e outra postagem de SO usando extensões Mono,O Mono.Security não define vários KeyUsages. Além das opções já discutidas, é "algo assim".