web-dev-qa-db-ja.com

PFXファイルを作成せずに、証明書とキーからX509Certificate2を作成する

過去には、パスワード付きのPFX証明書をエクスポートして安全なTcpListenerを作成してきましたが、この手順をスキップできるかどうか知りたいです。

商用SSL証明書を使用しておらず、サーバー証明書の発行に使用するルートCAを持っています。これらのサーバー証明書は、C#でTcpListenerをホストするときに追加の手順が必要です(CSRが使用されなかったためと思います)...

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

これはすばらしいことですが、opensslコマンドを発行して、証明書と秘密鍵からpfxファイルを作成し、パスワードを作成する必要があります。次に、このパスワードをコードに含めます。

このステップがかなり必要かどうか私は思っていました。証明書からX509Certificate2を作成し、秘密鍵を適用する方法はありますか?コンストラクター引数はCertのみの部分を許可しますが、秘密鍵がないため暗号化は失敗します。

また、OpenSSLまたはIISを使用してpfxをエクスポートすることに依存したくありません...は不格好です。

理想的には:

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

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

最後に私はこれを行いました、そしてそれはうまくいきます:

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