smtp4devプロジェクトにある次のコードで動作する X.509 証明書ファイルを作成しようとしています。
var certificate = new X509Certificate(Settings.Default.SSLCertificatePath);
var clientCertificateRequired = false;
var protocols = SslProtocols.Ssl2 | SslProtocols.Ssl3 | SslProtocols.Tls;
var checkRevocation = false;
var stream = new SslStream(stream);
stream.AuthenticateAsServer(certificate, clientCertificateRequired, protocols, checkRevocation);
Settings.Default.SSLCertificatePath
.cer ファイルを指します。
何を試しても、これはSystem.NotSupportedException
次のメッセージで失敗します。
サーバー モード SSL は、関連付けられた秘密キーを持つ証明書を使用する必要があります。
昇格した PowerShell セッションでNew-SelfSignedCertificate PowerShell CommandLetを使用して X509 証明書を作成しました。
New-SelfSignedCertificate `
-DnsName "localhost" `
-CertStoreLocation "cert:\CurrentUser\My" `
-FriendlyName "smtp4dev" `
-TextExtension "2.5.29.37={text}1.3.6.1.5.5.7.3.1" `
-KeyUsage DigitalSignature,KeyEncipherment,DataEncipherment `
-Provider "Microsoft RSA SChannel Cryptographic Provider"
これらのオプションを追加して、マシンに既に保存されており、IIS Express インストーラーによって生成された証明書を可能な限り厳密にミラーリングしました。理由はわかりませんが、その特定の証明書が機能するためです。
どちらの証明書も証明Local Computer > Personal
書ストアにあります。両方の証明書について、Certificate Manager は「この証明書に対応する秘密鍵を持っています」と述べています。
これら 2 つの証明書のプロパティを比較すると、smtp4dev 証明書は次の 3 つの点で IIS Express 開発証明書と異なります (拇印とシリアル番号に加えて)。
- キー使用法は重要な拡張機能としてマークされています
- 値を持つサブジェクト代替名拡張子
DNS Name=localhost
- 値を持つサブジェクト キー識別子拡張
e7 12 f5 ...
Certificate Manager を使用して、プライベート キーなしで両方の証明書を「Base-64 エンコード x.509 (.CER)」ファイルとしてデスクトップにエクスポートしました。(秘密鍵を含めると、エクスポート形式が smtp4dev でサポートされていない PKCS #12 (.PFX) に制限されます。)
この方法で証明書をエクスポートした後、証明書をダブルクリックしても、秘密鍵の所有に関するメッセージは表示されません。
この質問の冒頭に示されているコードでは、IIS Express 開発証明書のみが機能します。smtp4dev はそうではありません。
私が試した他のこと:
を使用するチュートリアルをよく見かけます
makecert
が、そのプログラムは持っていません。によって生成された自己署名証明書を使用しようとしましたが、 を に
openssl
設定するだけCommon Name
でしlocalhost
たが、同じ例外が発生しました (「サーバー モード SSL は、関連付けられた秘密キーを持つ証明書を使用する必要があります」)。X509Certificate2 を使用するようにコードを変更することはオプションではありません。プロジェクトが積極的に開発されていないように見えるため、パッチが適用された smtp4dev の別のリリースを取得するには時間がかかるためです。
ファイルの名前を .cer に変更する限り、別の証明書ファイル形式 (PFX など) を試すことは実際には可能です。smtp4dev をだまして証明書を使用させることができます。これにより、証明書に秘密鍵を含めることができます。IIS Express 開発証明書のエクスポートでは機能しますが、smtp4dev 証明書のエクスポートでは機能しません。