web-dev-qa-db-fra.com

Créez X509Certificate2 à partir de Cert et Key, sans créer de fichier PFX

Dans le passé, j'ai sécurisé TcpListener en exportant un certificat PFX avec un mot de passe, mais je voudrais savoir si cette étape peut être ignorée.

Je n'utilise pas de certificats SSL commerciaux et j'ai une autorité de certification racine que j'utilise pour émettre des certificats de serveur. Ces certificats de serveur nécessitent des étapes supplémentaires lors de l'hébergement d'un TcpListener en C # (je suppose que le CSR n'a pas été utilisé) ... mais que faire si j'ai la clé privée et le certificat qu'OpenSSL génère/utilise.

sslCertificate = new X509Certificate2("myExportedCert.pfx", "1234");

C'est donc très bien, mais je dois émettre une commande openssl pour créer un fichier pfx à partir du certificat et de la clé privée, puis inventer un mot de passe. Incluez ensuite ce mot de passe dans mon code.

Je me demandais si cette étape était vraiment nécessaire. Existe-t-il un moyen de créer un X509Certificate2 à partir du Cert, puis d'appliquer la clé privée. Les arguments du constructeur n'autorisent que la partie Cert, mais le chiffrement échoue alors car il n'y a pas de clé privée.

De plus, je ne veux pas compter sur OpenSSL ou IIS pour exporter le pfx .... semble maladroit.

Idéalement, je voudrais:

sslCertificate = new X509Certificate2("myCert.crt");
sslCertificate.ApplyPrivateKey(keyBytes) // <= or "private.key" or whatever

sslStream.AuthenticateAsServer(sslCertificate, false, SslProtocols.Default, false);
6
Conrad

En fin de compte, je l'ai fait, et cela fonctionne bien:

...
if (!File.Exists(pfx)) {
    // Generate PFX
    string arguments = "openssl pkcs12 -export -in " + certPath + "" + certFile + ".crt -inkey " + certPath + "" + certFile + ".key -out " + certPath + "" + certFile + ".pfx -passout pass:" + pfxPassword;
    ProcessStartInfo opensslPsi = new ProcessStartInfo("Sudo", arguments);
    opensslPsi.UseShellExecute = false;
    opensslPsi.RedirectStandardOutput = true;
    using (Process p = Process.Start(opensslPsi)) {
        p.WaitForExit();
    }
    // Set Permission
    ProcessStartInfo chmodPsi = new ProcessStartInfo("Sudo", "chmod 644 " + certPath + "" + certFile + ".pfx");
    chmodPsi.UseShellExecute = false;
    chmodPsi.RedirectStandardOutput = true;
    using (Process p = Process.Start(chmodPsi)) {
        p.WaitForExit();
    }
}
sslCertificate = new X509Certificate2(pfx, pfxPassword);
...
0
Conrad