4

hmailserver 5.3.2 をインストールして構成しました。メールの送受信は普通にできますが、別サーバーにある.net/C#アプリからのメール送信に使いたいので、SSL通信を使いたいと思いました。以前は、アプリケーションはポート 587 で gmail 経由でメールを送信するように構成されていましたが、問題なく動作していましたが、今は独自のメール サーバーを使用したいと考えています。最初に、ポート 25 の smtp.domain.com に接続するようにアプリケーションを構成しました。これが機能し、電子メールが送信されます。

次に、安全なチャネルを介してメッセージを送信できるかどうかをテストするために、自己署名証明書を作成しました。openSSL 設定共通名で証明書を作成しました: mail.domain.com、smtp.domain.com、*.domain.com、 domain.com. ファイアウォールでポート 587 を開き、そのポートでのインバウンド接続に証明書を使用するように hmailserver を構成しました。作成した証明書はどれも機能せず (1 つ試してから別の証明書を作成するなど)、アプリケーションで次の (一般的な) 例外が生成されました。

System.Exception: _COMPlusExceptionCode = -532459699

もちろん、telnet 経由で接続しようとしました: telnet smtp.domain.com 587 で、空白の画面が表示されました。ポート 587 で ssl を無効にすると正常に接続できるため、ファイアウォールの問題ではありません。ログを見ると、SSL で 587 を使用しているときに接続しようとしている様子さえありません。

私はすでにこれらの質問をチェックしました:Getting SmtpClient to work with a self signed SSL certificateUsing a self-signed certificate with .NET's HttpWebRequest/Response、しかしそれは私の問題を解決しませんでした。ServerCertificateValidationCallbackを使用したアプローチには何の影響もありませんでした。

ポート 25 (上記の質問の 1 つでも提案されています)、465、587 で試してみましたが、3 つすべてで同じことが起こります: 最初のハンドシェイク (SYN / SYN-ACK / ACK) と約 80 秒後に接続はクローズド (FIN)、間に何もありません。

その証明書をどこかにインストールして、.net アプリケーションが信頼できると見なす必要がありますか? つまり、すでに信頼されたルート認証局としてインストールしており、mmc を実行して確認できたので、どこに行けばよいかわかりません...

助けてくれてありがとう!

PS: C# アプリケーションだけでなくメール サーバーにも関係するため、これが ServerFault に属するかどうかはわかりません...

編集:コードサンプル:

ServicePointManager.ServerCertificateValidationCallback = 
(sender, certificate, chain, sslPolicyErrors) => true;

SmtpClient mailClient = new SmtpClient("smtp.domain.com");
mailClient.Credentials = new NetworkCredential("username@domain.com", "pwd");
mailClient.Port = 587;
mailClient.EnableSsl = true;
MailMessage mailMessage = new MailMessage("mailAddressFrom", "mailAddressTo", "subject", "body");
mailMessage.IsBodyHtml = true;
mailClient.Send(mailMessage);

EDIT 2: ログ (Ramunas の提案に基づく):

"TCPIP" 3588    "2010-06-23 10:02:49.685"   "TCPConnection - Posting AcceptEx on 0.0.0.0:465"
"DEBUG" 3588    "2010-06-23 10:02:49.809"   "Creating session 24039"
"TCPIP" 772 "2010-06-23 10:04:29.639"   "TCPConnection - SSL handshake with client failed. Error code: 2, Message: End of file, Remote IP: X"
"DEBUG" 772 "2010-06-23 10:04:29.639"   "Ending session 24039"
4

5 に答える 5

1

現在、hMailServerで使用されている証明書が購入されているか自己署名されているかに関係なく、c#4 /.NET4を使用してhMailServerにメールを送信することはできません。

問題は2つの部分からなるAFAIKです...c#4 /.NET4はTLSとポート587を使用してのみ送信します。hMailServerは現在STARTTLSをサポートしていません。c#4 / .NET 4は、465/SSLの代替をサポートしていません。

hMailServerのフォーラムでこのスレッド「SSLの混乱を構成しています...」を参照してください。

"SmtpClient.EnableSslプロパティ"
"代替接続方法は、プロトコルコマンドが送信される前にSSLセッションを事前に確立する方法です。この接続方法は、SMTP / SSL、SMTP over SSL、またはSMTPSと呼ばれることもあり、デフォルトでポート465を使用します。 。SSLを使用したこの代替接続方法は現在サポートされていません。」--MSDN

于 2011-12-04T20:09:28.590 に答える
1

gerryLowry 氏は次のように述べています。

c# 4/.NET 4 は、TLS とポート 587 を使用してのみ送信します。
hMailServer は現在 STARTTLS をサポートしていません

ここでhMailServer を hMailServer 5.5.1 (BETA) に更新できます。
現在、STARTTLS をサポートしており、ポート 587 ですべて正常に動作しています。

于 2014-10-08T09:18:48.120 に答える
0

これは洗練されたメカニズムですが、簡単に言えば、クライアント(接続元のコンピューター)は誰が証明書の発行者であるかを知っている必要があります(この場合、サーバーは証明書の発行者です)。信頼されたルート認証局リストに見つからない場合、この接続は安全でないと見なされます。(ブラウザが https://.... サイトへの安全でないリクエストについて警告しているのを見たことがあると思います)。

クライアント コンピュータの Microsoft 管理コンソールで証明書スナップインを開き、同じ自己署名証明書を信頼されたルート証明機関リストに追加してみてください。

于 2010-06-22T19:13:22.273 に答える
0

hMailServer をインストールし、自己署名証明書を作成し、それを hMailServer に追加しましたが、それを介してメールを送信することもできませんでした。証明書なしでメールを送信している間は成功しましたが。

hMailServer へのログオンを有効にして (すべて)、再試行しましたが、うまくいきませんでした。しかし、ログファイルに次のエラーが表示されました

"重大度​​: 2 (高)、コード: HM5113、ソース: TCPServer::Run()、説明: 証明書ファイルの読み込みに失敗しました。パス: <...>test.cer、アドレス: 0.0.0.0、ポート: 25、エラー: 無効な引数が指定されました」

多分これはあなたのhMailServerにも当てはまりますか?

于 2010-06-22T22:50:57.343 に答える
0

hMailServer で通常の SMTP としてポート 25 を開き、SSL 用にポート 465 を開いているため、通常の SMTP 構成を指すようにコードを変更する必要がありました。その後、動作するはずです。SSL に関しては、申し訳ありませんが、hMailServer では動作しません...

        MailMessage message = new MailMessage();
        message.From = new MailAddress("me@myself.home", "Me");
        message.Body = "hello, World!";
        message.To.Add(new MailAddress("you@myself.home", "You"));

        SmtpClient client = new SmtpClient("secure.myself.home", 25);
        client.EnableSsl = false;
        client.UseDefaultCredentials = false;
        client.Credentials = new NetworkCredential("me@myself.home", "pwd");

        client.Send(message);
于 2014-02-27T19:04:09.110 に答える