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".

questionAnswers(1)

yourAnswerToTheQuestion