ไม่สามารถสร้างความสัมพันธ์ที่เชื่อถือได้สำหรับช่องทางที่ปลอดภัยของ SSL / TLS - SOAP


325

ฉันมีการเรียกใช้บริการเว็บอย่างง่ายที่สร้างโดยแอป windows. NET (C #) 2.0 ผ่านพร็อกซีบริการเว็บที่สร้างโดย Visual Studio สำหรับบริการบนเว็บที่เขียนด้วย C # (2.0) สิ่งนี้ได้ผลเป็นเวลาหลายปีและยังคงทำเช่นนั้นในสถานที่ที่เป็นที่รู้จัก

การติดตั้งใหม่ที่ไซต์ใหม่กำลังประสบปัญหา เมื่อพยายามที่จะเรียกใช้บริการเว็บมันล้มเหลวด้วยข้อความว่า:

ไม่สามารถสร้างความสัมพันธ์ที่เชื่อถือได้สำหรับช่องทางที่ปลอดภัยของ SSL / TLS

URL ของบริการบนเว็บใช้ SSL (https: //) - แต่มันใช้งานได้เป็นเวลานาน (และยังคงทำเช่นนั้น) จากที่อื่น ๆ

ฉันจะมองที่ไหน นี่อาจเป็นปัญหาด้านความปลอดภัยระหว่าง Windows และ. NET ที่ไม่ซ้ำกับการติดตั้งนี้หรือไม่? ถ้าเป็นเช่นนั้นฉันจะตั้งค่าความสัมพันธ์ที่เชื่อถือได้ที่ไหน ฉันหลงทาง!


ในกรณีของฉันข้อผิดพลาดนี้เกิดจากการส่งต่อที่อยู่ IP
cja

คำตอบ:


166

ความคิด (ขึ้นอยู่กับความเจ็บปวดในอดีต):

  • คุณมี DNS และการมองเห็นของเซิร์ฟเวอร์หรือไม่
  • คุณใช้ชื่อที่ถูกต้องจากใบรับรองหรือไม่
  • ใบรับรองยังใช้งานได้
  • ตัวโหลดบาลานซ์ที่กำหนดค่าไม่ดีทำสิ่งต่าง ๆ สับสนหรือไม่
  • เครื่องเซิร์ฟเวอร์ใหม่มีการตั้งค่านาฬิกาอย่างถูกต้องหรือไม่ (เช่นเวลา UTC ถูกต้อง [ละเว้นเวลาท้องถิ่นมันไม่เกี่ยวข้องส่วนใหญ่]) - สิ่งนี้สำคัญสำหรับ WCF ดังนั้นอาจส่งผลกระทบต่อ SOAP ปกติ?
  • มีปัญหาห่วงโซ่ใบรับรองที่เชื่อถือได้หรือไม่ หากคุณเรียกดูจากเซิร์ฟเวอร์ไปยังบริการสบู่คุณจะได้รับ SSL หรือไม่
  • เกี่ยวข้องกับด้านบน - มีการติดตั้งใบรับรองในตำแหน่งที่ถูกต้องหรือไม่ (คุณอาจต้องการสำเนาใน Trusted Root Certificate Authorities)
  • พร็อกซีระดับเซิร์ฟเวอร์ของเครื่องตั้งค่าถูกต้องหรือไม่ (ซึ่งแตกต่างกับพร็อกซีของผู้ใช้); ดู proxycfg สำหรับ XP / 2003 (ไม่แน่ใจเกี่ยวกับ Vista ฯลฯ )

2
1) บริการบนเว็บอยู่บนเว็บ เราสามารถเรียกดูผ่านเบราว์เซอร์ 2) เครื่องใหม่ไม่ใช่เซิร์ฟเวอร์ - เป็นเดสก์ท็อปที่ใช้แอพของฉันซึ่งรวบรวมข้อมูลการสั่งซื้อและอัพโหลดผ่านบริการ SOAP 3) ใช่เราสามารถเรียกดูได้ 4) นี่คือสิ่งใหม่สำหรับฉัน: proxy level machine?
Rob Schripsema

2
ใช่; รหัสไม่ได้ใช้การตั้งค่าพร็อกซี IE มันใช้ร้านค้าแยกต่างหาก ... มันเป็นสิ่งสำคัญที่มีการกำหนดค่านี้ (ถ้าคุณใช้พร็อกซี) บน XP ตัวเลือกที่ง่ายที่สุดคือ (IIRC) "proxycfg -i" เพื่อนำเข้าการตั้งค่า IE
Marc Gravell

11
ขอบคุณมาร์ค สิ่งนี้ช่วยฉันได้และปัญหาก็คือเซิร์ฟเวอร์มีใบรับรองที่ลงนามโดย CA บุคคลที่สามที่ฉันยังไม่ได้เชื่อถือ วิธีแก้ไขคือเพิ่ม CA นั้นในรายการ Trusted Root CA
p.campbell

1
คอมพิวเตอร์ที่มีข้อยกเว้นนี้ไม่สามารถซิงค์เวลาของระบบโดยใช้เซิร์ฟเวอร์เวลา ฉันต้องเข้าไปข้างในแล้วทำการซิงค์เวลาก่อนที่มันจะทำงาน
Chris - Haddox Technologies

4
คุณอาจได้รับสิ่งนี้หากคุณใช้ Fiddler เพื่อดีบักการเรียกใช้บริการและใช้โหมดการสกัดกั้นใบรับรอง เพียงแค่ลบการสกัดกั้นในตัวเลือกของพู้ทำเล่นและคุณควรจะดี
Ruskin

363

ตัวอย่างต่อไปนี้จะแก้ไขกรณีที่มีบางอย่างผิดปกติกับใบรับรอง SSL บนเซิร์ฟเวอร์ที่คุณโทร ตัวอย่างเช่นอาจเป็นชื่อตัวเองหรือชื่อโฮสต์ระหว่างใบรับรองและเซิร์ฟเวอร์อาจไม่ตรงกัน

สิ่งนี้เป็นอันตรายหากคุณโทรหาเซิร์ฟเวอร์นอกการควบคุมโดยตรงเนื่องจากคุณไม่สามารถมั่นใจได้ว่าคุณกำลังพูดคุยกับเซิร์ฟเวอร์ที่คุณคิดว่าคุณเชื่อมต่ออยู่ อย่างไรก็ตามหากคุณกำลังติดต่อกับเซิร์ฟเวอร์ภายในและการได้รับใบรับรอง "ถูกต้อง" นั้นไม่สามารถใช้งานได้ให้ใช้วิธีการต่อไปนี้เพื่อแจ้งให้บริการเว็บละเว้นปัญหาใบรับรองและทหารกล้าหาญ

สองคนแรกใช้การแสดงออกแลมบ์ดาที่สามใช้รหัสปกติ คนแรกยอมรับใบรับรองใด ๆ อย่างน้อยสองครั้งล่าสุดตรวจสอบว่าชื่อโฮสต์ในใบรับรองเป็นชื่อที่คุณคาดหวัง
... หวังว่าคุณจะพบว่ามีประโยชน์

//Trust all certificates
System.Net.ServicePointManager.ServerCertificateValidationCallback =
    ((sender, certificate, chain, sslPolicyErrors) => true);

// trust sender
System.Net.ServicePointManager.ServerCertificateValidationCallback
                = ((sender, cert, chain, errors) => cert.Subject.Contains("YourServerName"));

// validate cert by calling a function
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);

// callback used to validate the certificate in an SSL conversation
private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors)
{
    bool result = cert.Subject.Contains("YourServerName");
    return result;
}

6
ประสบการณ์ของฉันกับ ServicePointManager การเปลี่ยนแปลงใด ๆ จะมีผลกับโดเมนแอปทั้งหมด แม้ว่าคำตอบจะอธิบายอย่างชัดเจนว่าสามารถใช้สิ่งนี้ได้อย่างไรฉันชอบที่จะจุดนี้
Amzath

การตั้งค่าการโทรกลับทำงานใน. NET 4.5 สำหรับฉัน แต่ไม่ใช่. NET 4.6
RJB

@Amzath ข้อเสนอแนะเกี่ยวกับวิธีการตั้งค่าใหม่หลังจากคำขอเฉพาะเสร็จสมบูรณ์? บุคคลอาจต้องทำการร้องขอหนึ่งครั้งไปยังเซิร์ฟเวอร์ที่ไม่แน่นอนจากนั้นนำสิ่งต่าง ๆ กลับมาเหมือนเดิม
Isaac Lyman

1
@Isaac Lyman: ServicePointManager.ServerCertificateValidationCallback = null;ควรเปลี่ยนกลับเป็นพฤติกรรมเริ่มต้น
Mike Chamberlain

1
@MikeChamberlain ปัญหาที่เกิดขึ้นกับข้อเสนอแนะของคุณคือคำขอที่เกิดขึ้นพร้อมกันนั้นอาจไม่ปลอดภัยเนื่องจากคุณกำลังจัดการกับการตั้งค่าแอพทั่วโลก
Isaac Lyman

178

วิธีการแก้ปัญหา "จับทั้งหมด" ที่ง่ายมากคือ:

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

การแก้ปัญหาจาก sebastian-castaldi มีรายละเอียดเพิ่มเติมเล็กน้อย


21
ฉันเพิ่งวางสิ่งนี้ลงใน#If CONFIG = "Debug"คำสั่งเพื่อให้มันเปิดใช้งานเฉพาะเมื่ออยู่ในโหมดแก้ไขข้อบกพร่อง มันใช้งานได้ดี!
cjbarth

1
รายละเอียดสามารถทำได้ดี แต่มีบางอย่างที่ต้องพูดเพื่อให้ได้โค้ดที่สั้นสั้นและง่ายเช่นกัน รหัสนี้สั้นและไม่หลอกลวง
allen1

การกระทำนี้จะกระทำเฉพาะกับการกระทำปัจจุบัน (เช่นใช้ ASP MVC) หรือจะตั้งเป็นพฤติกรรมเริ่มต้นสำหรับแอปพลิเคชัน ASP.NET?
JeeShen Lee

2
ควรใช้เพื่อการทดสอบเท่านั้นโซลูชันนี้เชื่อถือใบรับรองใด ๆ แม้จะไม่ถูกต้อง / หมดอายุ
Shenron

1
ตามที่อธิบายไว้ในความคิดเห็นด้านบนสิ่งนี้ไม่ได้ตรวจสอบว่าการเชื่อมต่อ SSL นั้นถูกต้องอีกต่อไป ดังนั้นการเชื่อมต่อระหว่างระบบของคุณและระบบอื่น ๆ อาจถูกบุกรุก เป็นคำถามที่คุณต้องการในสิ่งนี้เสมอ
Remy

35

โดยส่วนตัวแล้วฉันชอบวิธีแก้ปัญหาต่อไปนี้มากที่สุด:

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

... จากนั้นก่อนที่คุณจะรับข้อผิดพลาดให้ทำดังต่อไปนี้

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };

พบสิ่งนี้หลังจากปรึกษาโซลูชันของลุค


4
ดูคำตอบของSebastian Castaldiสำหรับข้อควรระวังด้านความปลอดภัยสำหรับวิธีการนี้
Edward Brey

ความเสี่ยงด้านความปลอดภัยของการใช้สิ่งนี้ในการผลิตคืออะไร?
Amjad

@Amjad ความเสี่ยงด้านความปลอดภัยก็คือว่ามันเป็นประโยชน์ต่อการใช้ SSL / TLS เซิร์ฟเวอร์สามารถแสดงใบรับรองใดก็ได้ที่มันชอบและรหัสนี้จะไม่สนใจข้อผิดพลาด
1800 ข้อมูล

18

หากคุณใช้ Windows 2003 คุณสามารถลอง:

เปิดคอนโซลการจัดการของ Microsoft (เริ่ม -> เรียกใช้ -> mmc.exe);

เลือกไฟล์ -> เพิ่ม / ลบสแนปอิน;

ในแท็บสแตนด์อโลนเลือกเพิ่ม

เลือกสแน็ปอินใบรับรองและคลิกเพิ่ม;

ในตัวช่วยสร้างเลือกบัญชีคอมพิวเตอร์จากนั้นเลือกคอมพิวเตอร์เฉพาะที่ กดเสร็จสิ้นเพื่อสิ้นสุดตัวช่วยสร้าง;

ปิดไดอะล็อกเพิ่ม / ลบสแนปอิน

นำทางไปยังใบรับรอง (Local Computer) และเลือกร้านค้าที่จะนำเข้า:

หากคุณมีใบรับรอง Root CA สำหรับ บริษัท ที่ออกใบรับรองให้เลือกผู้ออกใบรับรองหลักที่เชื่อถือได้

หากคุณมีใบรับรองสำหรับเซิร์ฟเวอร์นั้นให้เลือกบุคคลอื่น

คลิกขวาที่ร้านค้าและเลือกงานทั้งหมด -> นำเข้า

ทำตามตัวช่วยสร้างและระบุไฟล์ใบรับรองที่คุณมี

หลังจากนั้นให้เริ่มต้น IIS ใหม่แล้วลองเรียกใช้บริการทางเว็บอีกครั้ง

การอ้างอิง: http://www.outsystems.com/NetworkForums/ViewTopic.aspx?Topic=Web-Services:-Could-not-establish-trust-relationship-for-the-SSL/TLS- ...


2
สิ่งนี้ทำให้ฉันเป็นส่วนหนึ่ง แต่ฉันต้องมีใบรับรองในส่วน Trusted Root Certification Authorities เพื่อให้ทำงานได้ ตามblogs.msdn.com/b/jpsanders/archive/2009/09/16/…
Jacob Ewald

17

หากคุณไม่ต้องการเชื่อใจทุกคนแบบสุ่มสี่สุ่มห้าและทำการยกเว้นความไว้วางใจสำหรับโฮสต์บางแห่งโซลูชันต่อไปนี้เหมาะสมกว่า

public static class Ssl
{
    private static readonly string[] TrustedHosts = new[] {
      "host1.domain.com", 
      "host2.domain.com"
    };

    public static void EnableTrustedHosts()
    {
      ServicePointManager.ServerCertificateValidationCallback = 
      (sender, certificate, chain, errors) =>
      {
        if (errors == SslPolicyErrors.None)
        {
          return true;
        }

        var request = sender as HttpWebRequest;
        if (request != null)
        {
          return TrustedHosts.Contains(request.RequestUri.Host);
        }

        return false;
      };
    }
}

จากนั้นเพียงโทร Ssl.EnableTrustedHosts เมื่อแอปของคุณเริ่มทำงาน


@thelem ใช่การอ่านอีกครั้งฉันคิดว่าฉันต้องอ่านผิดครั้งแรก
30414 Shiv

ความเสี่ยงด้านความปลอดภัยของการเชื่อถือใบรับรองทั้งหมดในการผลิตคืออะไร
Amjad

@Amjad ความเสี่ยงด้านความปลอดภัยคือทุกคนระหว่างไคลเอนต์และเซิร์ฟเวอร์สามารถแทรกตัวเองในช่วงกลางของการสื่อสารใช้ใบรับรอง SSL ของตัวเองและอ่านการรับส่งข้อมูลทั้งหมดระหว่างไคลเอนต์และเซิร์ฟเวอร์ การทำเช่นนี้จะทำให้ SSL ใช้ไม่ได้อย่างมีประสิทธิภาพ
Rob Prouse

ควรทำงานเมื่อ iam ใช้ WCF addon เพื่อสร้างคลาสจาก wsdl
Kamil

7

ลุคเขียนบทความที่ดีงามเกี่ยวกับเรื่องนี้ .. ค่อนข้างตรงไปตรงมา .. ลองทำดู

ทางออกของลุค

เหตุผล (อ้างจากบทความของเขา (ลบสาปแช่ง)) ".. ปัญหาเกี่ยวกับรหัสข้างต้นคือมันไม่ทำงานหากใบรับรองของคุณไม่ถูกต้องทำไมฉันจะโพสต์ไปยังหน้าเว็บที่มีใบรับรอง SSL ที่ไม่ถูกต้องเพราะ ฉันราคาถูกและฉันไม่รู้สึกว่าจ่าย Verisign หรืออย่างใดอย่างหนึ่ง** - * s สำหรับใบรับรองไปยังกล่องทดสอบของฉันดังนั้นฉันจึงเซ็นชื่อเองเมื่อฉันส่งคำขอฉันได้รับข้อยกเว้นที่น่ารัก:

System.Net.WebException การเชื่อมต่อพื้นฐานถูกปิด ไม่สามารถสร้างความสัมพันธ์ที่เชื่อถือได้กับเซิร์ฟเวอร์ระยะไกล

ฉันไม่รู้เกี่ยวกับคุณ แต่สำหรับฉันแล้วข้อยกเว้นนั้นดูเหมือนสิ่งที่อาจเกิดจากความผิดพลาดโง่ ๆ ในรหัสของฉันซึ่งทำให้ POST ล้มเหลว ดังนั้นฉันค้นหาต่อไปและปรับเปลี่ยนและทำสิ่งแปลก ๆ ทุกประเภท หลังจากที่ฉันเข้าไปในสิ่งที่ *** ฉันพบว่าพฤติกรรมเริ่มต้นหลังจากพบใบรับรอง SSL ที่ไม่ถูกต้องคือการทิ้งข้อยกเว้นนี้ .."


1
โซลูชันนี้เลิกใช้แล้วสำหรับ. Net 4.5 หากคุณเพียงแค่ต้องการยอมรับใบรับรองทั้งหมดดู Sebastian Castaldi หรือคำตอบของฉันเพิ่มเติมด้านล่าง
Remy

7

เครื่องมือวินิจฉัย SSLของ Microsoft อาจสามารถระบุปัญหาได้

อัปเดตลิงก์ได้รับการแก้ไขแล้ว


7
ตั้งแต่วันนี้ (สิงหาคม 2012) ลิงค์นั้นเสียแล้ว
ashes999

ค้นหาไดเรกทอรีดาวน์โหลดและไม่มีเครื่องมือวินิจฉัย SSL ให้บริการอีกต่อไป :(
SASS_Shooter

2
ให้เราแก้ไขลิงก์ แก้ไขให้ถูกต้องหากฉันผิดiis.net/downloads/community/2009/09/…
Amzath

3

ฉันเพิ่งพบปัญหานี้ ความละเอียดของฉันคือการปรับปรุงเวลาของระบบโดยการซิงค์กับเซิร์ฟเวอร์เวลาด้วยตนเอง ในการทำเช่นนี้คุณสามารถ:

  • คลิกขวาที่นาฬิกาในแถบงาน
  • เลือก Adjust Date/Time
  • เลือกInternet Timeแท็บ
  • คลิก Change Settings
  • เลือก Update Now

ในกรณีของฉันการซิงค์ไม่ถูกต้องดังนั้นฉันต้องคลิกหลาย ๆ ครั้งก่อนที่จะอัปเดตอย่างถูกต้อง หากยังคงอัปเดตอย่างไม่ถูกต้องคุณสามารถลองใช้เซิร์ฟเวอร์เวลาอื่นจากดรอปดาวน์เซิร์ฟเวอร์


วัวศักดิ์สิทธิ์ วิ่งเข้าไปในสิ่งที่แน่นอนนี้ ขอบคุณสำหรับการแก้ไขที่ง่าย!
TheGerm

3

ลองสิ่งนี้:

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

ขอให้สังเกตว่าคุณต้องทำงานอย่างน้อยกับ 4.5 .NET Framework


3

ฉันมีปัญหาคล้ายกันใน.NETแอพใน Internet Explorer

ฉันแก้ไขปัญหาการเพิ่มใบรับรอง (ใบรับรองคลาส VeriSign 3 ในกรณีของฉัน) ไปยังใบรับรองบรรณาธิการที่เชื่อถือได้

Go to Internet Options-> Content -> Publishers and import it

คุณสามารถรับใบรับรองได้หากคุณส่งออกจาก:

Internet Options-> Content -> Certificates -> Intermediate Certification Authorities -> VeriSign Class 3 Public Primary Certification Authority - G5

ขอบคุณ


1

ฉันมีข้อผิดพลาดนี้ทำงานกับเว็บเซิร์ฟเวอร์ที่มี URL เช่น:

a.b.domain.com

แต่ไม่มีใบรับรองสำหรับเรื่องนี้ดังนั้นฉันจึงได้รับ DNS ที่เรียกว่า

a_b.domain.com

เพียงแค่บอกใบ้ให้กับโซลูชันนี้ที่นี่เนื่องจากสิ่งนี้ขึ้นมาบน google


ในกรณีของฉันเว็บไซต์ถูกกำหนดค่าภายใต้ใบรับรอง wildcard ssl (* .abcd.com) เมื่อกำหนดค่าการเชื่อมโยงเว็บไซต์เหมือน xyz-abcd.com ซึ่งเป็นสาเหตุของปัญหา
sree

1

สำหรับผู้ที่มีปัญหานี้ผ่านทางฝั่งไคลเอ็นต์ VS เมื่อเพิ่มการอ้างอิงบริการเรียบร้อยแล้วและพยายามดำเนินการเรียกครั้งแรกได้รับข้อยกเว้นนี้:“ การเชื่อมต่อพื้นฐานถูกปิด: ไม่สามารถสร้างความสัมพันธ์ที่เชื่อถือได้สำหรับช่องทางที่ปลอดภัย SSL / TLS” ถ้า คุณกำลังใช้ (เช่นกรณีของฉัน) URL ปลายทางที่มีที่อยู่ IP และได้รับข้อยกเว้นนี้คุณอาจต้องเพิ่มการอ้างอิงบริการอีกครั้งโดยทำตามขั้นตอนนี้:

  • เปิด URL ปลายทางใน Internet Explorer
  • คลิกที่ข้อผิดพลาดใบรับรอง (ไอคอนสีแดงในแถบที่อยู่)
  • คลิกที่ดูใบรับรอง
  • หยิบออกมาเพื่อ: "ชื่อ" และแทนที่ที่อยู่ IP หรือชื่ออะไรก็ตามที่เราใช้และได้รับข้อผิดพลาดสำหรับ "ชื่อ" นี้

ลองอีกครั้ง :). ขอบคุณ


0

ในกรณีของฉันฉันพยายามทดสอบSSLในสภาพแวดล้อม Visual Studio โดยใช้ IIS 7

นี่คือสิ่งที่ฉันทำเพื่อให้มันทำงาน:

  • ภายใต้ไซต์ของฉันในส่วน 'การผูก ... ' ทางด้านขวาใน IIS ฉันต้องเพิ่มการผูก 'https' กับพอร์ต 443 และเลือก "ใบรับรองการพัฒนา IIS Express"

  • ใต้ไซต์ของฉันในส่วน 'การตั้งค่าขั้นสูง ... ' ทางด้านขวาฉันต้องเปลี่ยน 'โปรโตคอลที่เปิดใช้งาน' จาก "http" เป็น "https"

  • ใต้ไอคอน 'การตั้งค่า SSL' ฉันเลือก 'ยอมรับ' สำหรับใบรับรองลูกค้า

  • จากนั้นฉันต้องรีไซเคิลแอพพูล

  • ฉันยังต้องนำเข้าใบรับรองโฮสต์ในท้องถิ่นไปยังร้านค้าส่วนตัวของฉันโดยใช้ mmc.exe

web.configไฟล์ของฉันได้รับการกำหนดค่าอย่างถูกต้องแล้วดังนั้นหลังจากที่ฉันได้แยกออกทั้งหมดฉันสามารถทำการทดสอบต่อไปได้


เว็บของคุณตั้งค่าไว้อย่างไร
Chazt3n

@ Chazt3n ฉันไม่สามารถบอกคุณได้ว่าเป็นเวลานาน แต่มันจะเป็นการตั้งค่าการเชื่อมโยง http พื้นฐานฉันมักจะใช้ svcutil เพื่อสร้างข้อมูลการกำหนดค่าสำหรับข้อมูลไคลเอนต์บริการเว็บ
Popo

0

โซลูชันของฉัน (VB.Net เวอร์ชั่น "staging" (UAT) ของแอปพลิเคชันนี้ต้องทำงานกับใบรับรอง "staging" แต่ไม่ส่งผลกระทบต่อการร้องขอเมื่ออยู่บนไซต์จริง):

    ...
        Dim url As String = ConfigurationManager.AppSettings("APIURL") & "token"
        If url.ToLower().Contains("staging") Then
           System.Net.ServicePointManager.ServerCertificateValidationCallback = AddressOf AcceptAllCertifications
        End If
    ...

    Private  Function AcceptAllCertifications(ByVal sender As Object, ByVal certification As System.Security.Cryptography.X509Certificates.X509Certificate, ByVal chain As System.Security.Cryptography.X509Certificates.X509Chain, ByVal sslPolicyErrors As System.Net.Security.SslPolicyErrors) As Boolean
        Return True
    End Function

-3

ถ้าไม่ทำงาน sertificate ไม่ดีเมื่อ ServerCertificateValidationCallback คืนค่าจริง รหัส ServerCertificateValidationCallback ของฉัน:

ServicePointManager.ServerCertificateValidationCallback += delegate
{
    LogWriter.LogInfo("Проверка сертификата отключена, на уровне ServerCertificateValidationCallback");
    return true;
};

รหัสของฉันซึ่งป้องกันการเรียกใช้งาน ServerCertificateValidationCallback:

     if (!(ServicePointManager.CertificatePolicy is CertificateValidation))
    {
        CertificateValidation certValidate = new CertificateValidation();
        certValidate.ValidatingError += new CertificateValidation.ValidateCertificateEventHandler(this.OnValidateCertificateError);
        ServicePointManager.CertificatePolicy = certValidate;
    }

ฟังก์ชัน OnValidateCertificateError:

private void OnValidateCertificateError(object sender, CertificateValidationEventArgs e)
{
    string msg = string.Format(Strings.OnValidateCertificateError, e.Request.RequestUri, e.Certificate.GetName(), e.Problem, new Win32Exception(e.Problem).Message);
    LogWriter.LogError(msg);
    //Message.ShowError(msg);
}

ฉันปิดใช้งานรหัส CertificateValidation และ ServerCertificateValidationCallback ทำงานได้ดีมาก


คุณไม่ควรปิดการตรวจสอบใบรับรองใด ๆ ให้แก้ไขปัญหาที่ทำให้เกิดการตรวจสอบความถูกต้องแทน
Dan

ความเสี่ยงด้านความปลอดภัยของการใช้สิ่งนี้ในการผลิตคืออะไร?
Amjad
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.