2017-11-11 18 views
0

私の問題は.net標準2.0です。なぜなら、同じコードが.netフレームワークで動作するように思われるからです。.net標準2.0の自己署名入り証明書

問題は、自己署名証明書を使用するサーバーにhttp要求を出すことです。今、.NETフレームワーク(特に4.6.1)でこの問題を解決する方法は、次のものを使用することです:

ServicePointManager.ServerCertificateValidationCallback = CustomValidation; 

public static bool CustomValidation 
      (object sender, 
      X509Certificate certificate, 
      X509Chain chain, 
      SslPolicyErrors policyErrors) 
     { 
      return true; 
     } 

これで問題は解決します。しかし、これを.net標準でコンパイルしているようですが、同じエラー(WinHttpException - セキュリティエラーが発生しました)のSystem.AggregateExceptionが発生しました HResult = 0x80131500 メッセージ= 1つ以上のエラーが発生しました。 (要求の送信中にエラーが発生しました) ソース: StackTrace: at System.Threading.Tasks.Task`1.GetResultCore(ブールwaitCompletionNotification) at matrix_tester.Program.Main(String [] args)in C:\ Users \ Nick \ source \ repos \ matrix-tester \ Program.cs:行11

内部例外1: HttpRequestException:要求の送信中にエラーが発生しました。

内部例外2: WinHttpException:セキュリティエラーが

を発生し、私はここに私の知恵の終わりです。 ServicePointManagerは.net標準で使用されませんか?

+0

.NET標準2.0を使用して自己署名証明書をバイパスする方法はありますか。 –

答えて

0

ServicePointManagerは2.0で利用可能にする必要があります。

免責事項。あなたのコードがなぜ機能しないのか分かりません。私は証明書を自動受理する必要があるときに私が常に使うハックを持っています。これは2.0で動作します。しかし、このスクリプトは、セキュリティの違反であるすべての自己署名証明書を受け入れることを忘れないでください。あなたの自由裁量で使用してください。これはシングルトンクラスです。

Certificates.Instance.GetCertificatesAutomatically(); 

これはあなたのプログラムの最初から呼び出すだけです。あなたが進歩するのを助けることを願って

using System; 
using System.Collections.Generic; 
using System.Security; 
using System.Net; 
using System.Security.Cryptography.X509Certificates; 
using System.Security.Cryptography; 
using System.Net.Security; 

namespace test 
{ 
    public sealed class Certificates 
    { 
     private static Certificates instance = null; 
     private static readonly object padlock = new object(); 

     Certificates() 
     { 
     } 

     public static Certificates Instance 
     { 
      get 
      { 
       lock (padlock) 
       { 
        if (instance == null) 
        { 
         instance = new Certificates(); 
        } 
        return instance; 
       } 
      } 
     } 
     public void GetCertificatesAutomatically() 
     { 
      ServicePointManager.ServerCertificateValidationCallback += 
       new RemoteCertificateValidationCallback((sender, certificate, chain, policyErrors) 
        => { return true; }); 
     } 

     private static bool RemoteCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
     { 
      //Return true if the server certificate is ok 
      if (sslPolicyErrors == SslPolicyErrors.None) 
       return true; 

      bool acceptCertificate = true; 
      string msg = "The server could not be validated for the following reason(s):\r\n"; 

      //The server did not present a certificate 
      if ((sslPolicyErrors & 
       SslPolicyErrors.RemoteCertificateNotAvailable) == SslPolicyErrors.RemoteCertificateNotAvailable) 
      { 
       msg = msg + "\r\n -The server did not present a certificate.\r\n"; 
       acceptCertificate = false; 
      } 
      else 
      { 
       //The certificate does not match the server name 
       if ((sslPolicyErrors & 
        SslPolicyErrors.RemoteCertificateNameMismatch) == SslPolicyErrors.RemoteCertificateNameMismatch) 
       { 
        msg = msg + "\r\n -The certificate name does not match the authenticated name.\r\n"; 
        acceptCertificate = false; 
       } 

       //There is some other problem with the certificate 
       if ((sslPolicyErrors & 
        SslPolicyErrors.RemoteCertificateChainErrors) == SslPolicyErrors.RemoteCertificateChainErrors) 
       { 
        foreach (X509ChainStatus item in chain.ChainStatus) 
        { 
         if (item.Status != X509ChainStatusFlags.RevocationStatusUnknown && 
          item.Status != X509ChainStatusFlags.OfflineRevocation) 
          break; 

         if (item.Status != X509ChainStatusFlags.NoError) 
         { 
          msg = msg + "\r\n -" + item.StatusInformation; 
          acceptCertificate = false; 
         } 
        } 
       } 
      } 

      //If Validation failed, present message box 
      if (acceptCertificate == false) 
      { 
       msg = msg + "\r\nDo you wish to override the security check?"; 
       //   if (MessageBox.Show(msg, "Security Alert: Server could not be validated", 
       //      MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1) == DialogResult.Yes) 
       acceptCertificate = true; 
      } 

      return acceptCertificate; 
     } 

    } 
} 
+0

ServicePointManager.ServerCertificateValidationCallback + = 新しいRemoteCertificateValidationCallback((送信者、証明書、チェーン、policyErrors) => {return true;});これは動作していないようです。私のために働いていないようです... –

+0

デリゲートにブレークポイントを置いています。 –

関連する問題