過去には、パスワード付きの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);
最後に私はこれを行いました、そしてそれはうまくいきます:
...
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);
...