ข้ามข้อผิดพลาดใบรับรอง SSL ที่ไม่ถูกต้องเมื่อเรียกใช้บริการเว็บใน. Net


88

เรากำลังตั้งค่า SharePoint ใหม่ซึ่งเรายังไม่มีใบรับรอง SSL ที่ถูกต้อง ฉันต้องการเรียกใช้บริการเว็บ Lists เพื่อดึงข้อมูลเมตาบางอย่างเกี่ยวกับการตั้งค่า อย่างไรก็ตามเมื่อฉันพยายามทำสิ่งนี้ฉันได้รับข้อยกเว้น:

การเชื่อมต่อพื้นฐานถูกปิด: ไม่สามารถสร้างความสัมพันธ์ที่เชื่อถือได้สำหรับช่องสัญญาณที่ปลอดภัย SSL / TLS

ข้อยกเว้นที่ซ้อนกันมีข้อความแสดงข้อผิดพลาด:

ใบรับรองระยะไกลไม่ถูกต้องตามขั้นตอนการตรวจสอบความถูกต้อง

นี่ถูกต้องเนื่องจากเราใช้ใบรับรองชั่วคราว

คำถามของฉันคือฉันจะบอกไคลเอ็นต์บริการเว็บ. Net ( SoapHttpClientProtocol ) ให้เพิกเฉยต่อข้อผิดพลาดเหล่านี้ได้อย่างไร

คำตอบ:


18

วิธีที่ฉันใช้เมื่อประสบกับปัญหานี้คือการเพิ่มผู้ลงนามของใบรับรองชั่วคราวในรายการหน่วยงานที่เชื่อถือได้ในคอมพิวเตอร์ที่เป็นปัญหา

โดยปกติฉันจะทำการทดสอบด้วยใบรับรองที่สร้างด้วย CACERT และการเพิ่มลงในรายชื่อหน่วยงานที่เชื่อถือได้ของฉันก็ทำงานได้ดี

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


นั่นเป็นความคิดแรกของฉันเช่นกัน น่าเสียดายที่ใบรับรองหมดอายุเช่นกันดังนั้นจึงไม่สามารถเชื่อถือได้
jan.vdbergh

มีเหตุผลอะไรที่คุณไม่สามารถใช้คนเช่น CA cert? หากเป็นใบรับรองการทดสอบคุณสามารถดำเนินการต่อได้ ฉันไม่แน่ใจว่ามีวิธีปิดการตรวจสอบเหล่านี้หรือไม่!
Simon Johnson

113

หรือคุณสามารถลงทะเบียนผู้แทนการโทรกลับซึ่งไม่สนใจข้อผิดพลาดของการรับรอง:

...
ServicePointManager.ServerCertificateValidationCallback = MyCertHandler;
...

static bool MyCertHandler(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors error)
{
// Ignore errors
return true;
}

1
ฉันเพิ่มวิธีการคงที่นี้ไปยัง global.asax และตั้งค่าเหตุการณ์ใน "OnApplicationStart" ทำงานเหมือนมีเสน่ห์ ขอบคุณ
Juan Zamora

1
@JuanZamora ฉันทำแบบเดียวกับที่คุณทำ มันได้ผล!
Sachin BR

5
นี่คือสิ่งที่คุณต้องทำหากคุณต้องการที่จะหยาบคายกับการโจมตี"Man in the Middle" ...
Houtman

2
ตามหลักการแล้วคุณควรทำสิ่งนี้ในสภาพแวดล้อมการพัฒนาเท่านั้น
Ron DeFreitas

79

เช่นเดียวกับคำตอบของ Jason S:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

ฉันใส่สิ่งนี้ไว้ใน Main และมองไปที่ของฉันapp.configและทดสอบว่า(ConfigurationManager.AppSettings["IgnoreSSLCertificates"] == "True")ก่อนที่จะเรียกรหัสบรรทัดนั้นหรือไม่


24

ฉันแก้ไขด้วยวิธีนี้:

เรียกสิ่งต่อไปนี้ก่อนที่จะเรียกใช้บริการเว็บเซิร์ฟเวอร์ ssl ของคุณซึ่งทำให้เกิดข้อผิดพลาดนั้น:

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

/// <summary>
/// solution for exception
/// System.Net.WebException: 
/// The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
/// </summary>
public static void BypassCertificateError()
{
    ServicePointManager.ServerCertificateValidationCallback +=

        delegate(
            Object sender1,
            X509Certificate certificate,
            X509Chain chain,
            SslPolicyErrors sslPolicyErrors)
        {
            return true;
        };
}

12

ฉันมีข้อผิดพลาดเดียวกันกับการใช้ DownloadString; และสามารถทำให้ใช้งานได้ตามคำแนะนำด้านล่างนี้ในหน้านี้

System.Net.WebClient client = new System.Net.WebClient();            
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
string sHttpResonse = client.DownloadString(sUrl);

3
ServicePointManager.ServerCertificateValidationCallback +=
            (mender, certificate, chain, sslPolicyErrors) => true;

จะข้าม invaild ssl เขียนถึงผู้สร้างบริการเว็บของคุณ


1

สำหรับมือใหม่คุณสามารถขยายคลาสบริการบางส่วนของคุณในไฟล์ cs แยกต่างหากและเพิ่มโค้ดที่ "imanabidi" ให้มาเพื่อให้มันรวม


1

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

คุณจะต้องมีใบรับรองที่ลงนามด้วยตนเองบางประเภท หากคุณใช้ IIS Express คุณจะมีสิ่งเหล่านี้อยู่แล้วคุณจะต้องหามันให้เจอ เปิด Firefox หรือเบราว์เซอร์ใดก็ได้ที่คุณต้องการแล้วไปที่เว็บไซต์ dev ของคุณ คุณควรจะสามารถดูข้อมูลใบรับรองจากแถบ URL และขึ้นอยู่กับเบราว์เซอร์ของคุณคุณควรจะสามารถส่งออกใบรับรองไปยังไฟล์ได้

จากนั้นเปิด MMC.exe และเพิ่มสแนปอินใบรับรอง นำเข้าไฟล์ใบรับรองของคุณไปยังที่เก็บ Trusted Root Certificate Authorities และนั่นคือทั้งหมดที่คุณควรต้องมี สิ่งสำคัญคือต้องแน่ใจว่าร้านนั้นเข้าไปในร้านนั้นไม่ใช่ร้านอื่นอย่าง 'Personal' หากคุณไม่คุ้นเคยกับ MMC หรือใบรับรองมีเว็บไซต์มากมายที่ให้ข้อมูลเกี่ยวกับการดำเนินการนี้

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

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