2016-12-14 4 views
0

サービスファブリックアクタメソッドから電子メールを送信しようとしています。このコードは非常に単純で、コンソールアプリケーションでは問題なく動作しますが、アクターメソッド内の同じコードは例外を生成します。
"リモート証明書は検証手順に従って無効です"SmtpClientを使用してサービスファブリックアクタから電子メールを送信できない場合

これはなぜ私はそれを動作させるために自分のコードに追加すべきもの(私は証明書の検証を無効にするか暗号化を無効にしたくありません)ので、このフォーラムのヘルプを探しています。

はここ

は(ダミーの名前を持つだけ交換した資格情報とドメイン)私のコード

​​

あり、ここでありがとう例外データあなたがにSSLを使用している

Message "The remote certificate is invalid according to the validation procedure." string 


    StackTrace " at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)\r\n at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)\r\n at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)\r\n at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)\r\n at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)\r\n at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)\r\n at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)\r\n at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)\r\n at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)\r\n at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)\r\n at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)\r\n at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)\r\n at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)\r\n at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)\r\n at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)\r\n at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)\r\n at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)\r\n at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)\r\n at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)\r\n at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)\r\n at System.Net.Mail.SmtpConnection.Flush()\r\n at System.Net.Mail.ReadLinesCommand.Send(SmtpConnection conn)\r\n at System.Net.Mail.EHelloCommand.Send(SmtpConnection conn, String domain)\r\n at System.Net.Mail.SmtpConnection.GetConnection(ServicePoint servicePoint)\r\n at System.Net.Mail.SmtpClient.GetConnection()\r\n at System.Net.Mail.SmtpClient.Send(MailMessage message)\r\n at UserActor.UserActor.DeliverFeedbackMessage(String cur_msg, String remote_ip, String usr_agent) in C:\\testsrc\\DigitalRadar\\UserActor\\UserActor.cs:line 621" string 

答えて

0

メールサーバー(smtp.mydomain.com)に接続します。メールサーバー上の証明書に有効な(CAで署名された)証明書があるかどうかを確認します。たぶん自己署名、期限切れ、または弱いサイファーを持っているかもしれません。

+0

ありがとうございます、私は個人的には、手動でサーバー証明書をチェックして、それは完璧です、それは紺碧の公式パートナーbtwです。 私はSF俳優のSDTに不具合があると思われますが、これをSFチームに報告します。その間、私は問題を解決するための良い回避策を見つけ、自分自身のqに答えます。同じ問題を抱える他の人を助ける。再びありがとう –

0

この問題を回避するために、(セキュリティを犠牲にすることなく)適切な回避策を見つけました。同じ問題を抱えている可能性のある人を助けるために私自身の質問に答えています。

私のSFバージョンは5.0.217、アクターバージョンは2.0.217、おそらくは新しいバージョンです。 SFチームが継続的にフレームワークを改善しているので、問題はないかもしれません。私はしばらくすると、新しいverをチェックし、このスレッドを更新します。

SF actorメソッド内からSmtpClient.Sendが呼び出されたときに、デフォルトのcertの検証が失敗するようです。 C#コンソールアプリからの同じ呼び出しがうまくいきます。その理由は私の理解を超えているかもしれませんが、おそらくSFの不具合は、.NETはこのアプローチを使用してデフォルトのものに置き換えてカスタム検証手順を作成し登録することができますが、問題を解決しましたが、私が実際に証明書をチェックして、それが良いかどうかを確認することをお勧めします。それ以外の場合は、セキュリティを脅かすことがあります。その後、SSLや証明書を使用する必要はありません。

ServicePointManager.ServerCertificateValidationCallback = MyValidateSmtpServerCertificate; 

今、すべてですそれ:ここに私の検証コード(自分の状況に適応させる)

private bool MyValidateSmtpServerCertificate(object sender, X509Certificate certificate, 
               X509Chain chain, SslPolicyErrors sslPolicyErrors) { 
     if (sslPolicyErrors != SslPolicyErrors.None) 
      return false; 
     string[] subj_params = certificate.Subject.Split(','); 
     string common_name = string.Empty; 
     foreach (string param in subj_params) { 
      string[] sub_params = param.Split('='); 
      if (sub_params[0].Trim() == "CN") 
       common_name = sub_params[1].Trim(); 
     } 
     string[] valid_names = { 
      common_const.smtpServer, 
      "*." + common_const.smtpServer, 
     }; 
     if (!valid_names.Contains(common_name)) 
      return false; 
     return true; 
     } 

次の行でSmtpClient.Sendを呼び出す前に、この関数を登録していることを言いましたアクターメソッド内の私のコードは完璧に動作し、電子メールは安全かつ確実に配信されます。

+0

あなたはsslPolicyErrorsの値を投稿できますか? – LoekD

関連する問題