ยกเลิกคำขอ: ไม่สามารถสร้างช่องทางที่ปลอดภัยของ SSL / TLS


432

เราไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ HTTPS ที่ใช้WebRequestเนื่องจากข้อความแสดงข้อผิดพลาดนี้:

The request was aborted: Could not create SSL/TLS secure channel.

เรารู้ว่าเซิร์ฟเวอร์ไม่มีใบรับรอง HTTPS ที่ถูกต้องตามเส้นทางที่ใช้ แต่เพื่อหลีกเลี่ยงปัญหานี้เราใช้รหัสต่อไปนี้ที่เรานำมาจากโพสต์ StackOverflow อื่น:

private void Somewhere() {
    ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(AlwaysGoodCertificate);
}

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

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


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


3
ตรวจสอบนี้ยังstackoverflow.com/questions/1600743/…
Oskar Kjellin

51
มันเป็นปี 2018 และมีการดูคำถามนี้ 308,056 ครั้ง แต่ก็ยังไม่มีการแก้ไขที่เหมาะสมสำหรับเรื่องนี้ !! ฉันได้รับปัญหานี้แบบสุ่มและไม่มีการแก้ไขที่กล่าวถึงที่นี่หรือในเธรดอื่น ๆ ที่ได้แก้ไขปัญหาของฉัน
ไนเจล Fds

3
@NigelFds ข้อผิดพลาดThe request was aborted: Could not create SSL/TLS secure channelเป็นเรื่องทั่วไปมาก โดยทั่วไปแล้วจะกล่าวว่า "การเริ่มต้นการเชื่อมต่อ SSL / TLS / HTTPS ล้มเหลวด้วยเหตุผลข้อใดข้อหนึ่งที่เป็นไปได้" ดังนั้นหากคุณได้รับมันเป็นประจำในสถานการณ์ที่เฉพาะเจาะจงตัวเลือกที่ดีที่สุดของคุณคือการถามคำถามเฉพาะที่ให้รายละเอียดเฉพาะเกี่ยวกับสถานการณ์นั้น และตรวจสอบ Event Viewer เพื่อดูข้อมูลเพิ่มเติม และ / หรือเปิดใช้งานการดีบักฝั่งไคลเอ็นต์. NET เพื่อรับรายละเอียดเพิ่มเติม (ใบรับรองเซิร์ฟเวอร์ไม่น่าเชื่อถือหรือไม่มีการเข้ารหัสไม่ตรงกันหรือไม่ SSL / TLS รุ่นโปรโตคอลไม่ตรงกัน? ฯลฯ )
MarnixKlooster ReinstateMonica

4
@MarnixKlooster ฉันได้ตรวจสอบทั้งหมดแล้วมันไม่สามารถมีปัญหากับใบรับรองราวกับว่าฉันลองใหม่มันใช้งานได้ และฉันสงสัยว่าฉันจะสามารถถามคำถามนี้ใน SO โดยไม่มีใครมาและทำเครื่องหมายว่าซ้ำหรืออะไร
ไนเจล Fds

1
ฉันกำลังต่อสู้กับปัญหานี้เป็นครั้งที่ 4 ฐานรหัสเดียวกันฉันทำงานได้ดีในการผลิตและในสภาพแวดล้อม dev ของเพื่อน dev ของฉัน ครั้งล่าสุดที่ฉันได้รับคำสั่งให้เพิ่มค่ารีจิสตรี้ Computer \ HKEY_LOCAL_MACHINE \ SOFTWARE \ WOW6432Node \ Microsoft \ .NETFramework \ v4.7.02046 \ SchUseStrongCrypto [DWORD] = 1 และใช้งานได้ระยะหนึ่ง ฉันเริ่มทำงานในโครงการที่แตกต่างกันสักครู่และตอนนี้ฉันกลับไปที่โครงการนี้และคำขอล้มเหลวอีกครั้งแม้จะมีการแก้ไขคีย์รีจิสทรีนี้ น่ารำคาญมาก
มิเกล

คำตอบ:


598

ในที่สุดฉันก็พบคำตอบ (ฉันไม่ได้สังเกตที่มาของฉัน แต่มาจากการค้นหา);

ในขณะที่รหัสทำงานใน Windows XP ใน Windows 7 คุณต้องเพิ่มรหัสนี้ในตอนต้น:

// using System.Net;
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
// Use SecurityProtocolType.Ssl3 if needed for compatibility reasons

และตอนนี้มันทำงานได้อย่างสมบูรณ์แบบ


ภาคผนวก

ตามที่กล่าวไว้โดย Robin French; หากคุณได้รับปัญหานี้ในขณะที่กำหนดค่า PayPal โปรดทราบว่าพวกเขาจะไม่สนับสนุน SSL3 ตั้งแต่เดือนธันวาคมปี 2018 เป็นต้นไปคุณจะต้องใช้ TLS นี่คือหน้า Paypalเกี่ยวกับมัน


5
ไปที่ SecurityProtocolType.Tls12 จริง ๆ แล้วแก้ไขปัญหานี้ให้ฉัน ดูคำตอบของฉันด้านล่าง
Bryan Legend

24
SSLv3 คือ 18 ปีและตอนนี้ความเสี่ยงที่จะพุดเดิ้ลใช้ประโยชน์ - เป็น @LoneCoder แนะนำ SecurityProtocolType.Tls12 เป็นทดแทนที่เหมาะสมสำหรับ SecurityProtocolType.Ssl3
แกรี่

4
SecurityProtocolType.Tls จริงอาจจะเป็นทางเลือกที่ดีจนกว่าจะมีการใช้ประโยชน์พบว่า (ไม่ทุกเว็บไซต์ที่สนับสนุน Tls12 เช่นการเขียน)
แกรี่

3
PayPal ได้กำหนดวันที่ 30 มิถุนายน 2017 เพื่อปิดการใช้งาน SSL3 และใช้ TLS1.2 มันถูกใช้งานแล้วในสภาพแวดล้อม sandbox ของพวกเขา paypal-knowledge.com/infocenter/ …
Robin French

11
ดูสิ่งนี้เช่นกัน คุณไม่จำเป็นต้องตั้งค่าเป็นประเภทเดียวโดยเฉพาะคุณสามารถต่อท้ายได้เช่นกัน System.Net.ServicePointManager.SecurityProtocol |= System.Net.SecurityProtocolType.Tls12;
Nae

153

วิธีแก้ปัญหานี้ใน. NET 4.5 คือ

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

หากคุณไม่มี. NET 4.5 ให้ใช้

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

10
ขอบคุณ! ฉันต้องใช้. net 4.0 และไม่รู้วิธีแก้ปัญหานี้ ดูเหมือนว่าจะทำงานที่นี่ :)
Fabiano

ไม่ทำงานบน Windows Server 2008R2 (และอาจ 2012 เช่นกัน)
Misam

@billpg อ่านสิ่งนี้เพื่อรับคำตอบที่แม่นยำยิ่งขึ้น
Vikrant

สำหรับประเภท VB (เนื่องจากคำตอบนี้ปรากฏใน Google) รหัสที่เทียบเท่าคือServicePointManager.SecurityProtocol = DirectCast(3072, SecurityProtocolType)
ConfusionTowers

@ Andrej Z ทำงานบน. net framework 4. ขอบคุณ
az fav

107

ตรวจสอบให้แน่ใจว่าการตั้งค่า ServicePointManager ถูกสร้างขึ้นก่อนที่จะสร้าง HttpWebRequest มิฉะนั้นจะไม่สามารถใช้งานได้

ผลงาน:

        ServicePointManager.Expect100Continue = true;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
               | SecurityProtocolType.Tls11
               | SecurityProtocolType.Tls12
               | SecurityProtocolType.Ssl3;

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com/api/")

ล้มเหลว:

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com/api/")

        ServicePointManager.Expect100Continue = true;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
               | SecurityProtocolType.Tls11
               | SecurityProtocolType.Tls12
               | SecurityProtocolType.Ssl3;

4
อะไรคือความแตกต่างระหว่างการทำงานกับความล้มเหลวที่คุณได้กล่าวถึงข้างต้น
Chandy Kunhu

5
น่ากลัว คำขอของฉันทำงานได้หลังจากการลองครั้งที่สองซึ่งไม่สมเหตุสมผลแล้วฉันเห็นโพสต์ของคุณย้ายโพรโทคอลความปลอดภัยก่อนที่คำขอและvoilàจะได้รับการแก้ไข ขอบคุณ @ hogarth45
deanwilliammills

2
แน่นอน! เมื่อฉันวาง ServicePointManager ไว้ก่อนที่คำขอจะถูกสร้างขึ้นมันก็ใช้ได้กับฉันคนขอบคุณคุณบันทึกวันของฉันไว้

1
สมบูรณ์แบบ ... นี่วิเศษมาก
Maryam Bagheri

1
ในกรณีของเราคำขอล้มเหลวเป็นครั้งแรกและทำงานหลังจากนั้น นั่นเป็นเพราะเหตุผลที่ระบุไว้ในคำตอบนี้!
Mohammad Dehghan

34

ปัญหาที่คุณมีคือผู้ใช้ aspNet ไม่มีสิทธิ์เข้าถึงใบรับรอง คุณต้องให้สิทธิ์การเข้าถึงโดยใช้ winhttpcertcfg.exe

ตัวอย่างเกี่ยวกับวิธีตั้งค่านี้อยู่ที่: http://support.microsoft.com/kb/901183

ภายใต้ขั้นตอนที่ 2 ในข้อมูลเพิ่มเติม

แก้ไข: ใน IIS รุ่นล่าสุดคุณสมบัตินี้มีอยู่ในเครื่องมือจัดการใบรับรอง - และสามารถเข้าถึงได้โดยคลิกขวาที่ใบรับรองและใช้ตัวเลือกสำหรับการจัดการคีย์ส่วนตัว รายละเอียดเพิ่มเติมได้ที่นี่: /server/131046/how-to-grant-iis-7-5-access-to-a-certificate-in-certificate-store/132791#132791


ฉันพยายามเรียกใช้งาน winhttpcertcfg.exe ... โปรดทราบว่าฉันใช้ Windows 7 สามารถเปลี่ยนแปลงบางอย่างได้หรือไม่
Simon Dugré

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

2
ใน Windows 7 และใหม่กว่าใบรับรองต้องอยู่ในร้านค้าสำหรับคอมพิวเตอร์ในระบบมากกว่าผู้ใช้ปัจจุบันเพื่อ "จัดการคีย์ส่วนตัว"
Lukos

1
ใช่นี่เป็นปัญหาของฉัน ใช้ mmc.exe เพิ่มใบรับรองสแนปอิน (สำหรับฉันแล้วฉันเลือก 'เครื่องคอมพิวเตอร์') คลิกขวาที่ใบรับรองงานทั้งหมดจัดการคีย์ส่วนตัว เพิ่ม 'ทุกคน' (สำหรับผู้พัฒนาในท้องถิ่นนี่เป็นวิธีที่ง่ายที่สุด - ผลิตภัณฑ์ต้องมีแอพ / ผู้ใช้เว็บไซต์ IIS ที่ชัดเจน)
Ian Yates

@ lIan Yates โซลูชันนี้ใช้งานได้สำหรับฉันเท่านั้น (y)
Usman Younas

31

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

ทางออกที่ดีที่สุดคือการใช้ชุดเครื่องมือแก้ไขปัญหา SChannel SChannel เป็นผู้ให้บริการ SSPI ที่รับผิดชอบ SSL และ TLS และลูกค้าของคุณจะใช้มันสำหรับการจับมือกัน ลองดูที่TLS / เครื่องมือ SSL และการตั้งค่า

ยังเห็นวิธีการเปิดใช้การบันทึกเหตุการณ์ Schannel


เป็นที่เส้นทางสำหรับSchannel event loggingในของ Windows 7-8-10 ?
PreguntonCojoneroCabrón

แก้ปัญหา TLS / SSL โดยใช้ โปรแกรมใน C # หรือไม่
Kiquenet

27

ฉันมีปัญหานี้พยายามที่จะตีhttps://ct.mob0.com/Styles/Fun.pngซึ่งเป็นภาพที่จัดทำโดย CloudFlare บนมันเป็น CDN ที่รองรับสิ่งที่บ้าคลั่งอย่าง SPDY และ SSL SSL เปลี่ยนเส้นทางที่แปลก

แทนที่จะระบุ Ssl3 เช่นเดียวกับในคำตอบของ Simons ฉันสามารถแก้ไขได้โดยไปที่ Tls12 เช่นนี้:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
new WebClient().DownloadData("https://ct.mob0.com/Styles/Fun.png");

ขอบคุณ Lone ... นี่มันช่างบ้าที่ดูเหมือนว่าจะมีความเป็นไปได้ที่แตกต่างกันของปัญหาขึ้นอยู่กับสถานการณ์ ... และอย่างที่ฉันเห็นไม่มีเอกสารจริงของสิ่งนั้น ขอบคุณที่ชี้ให้เห็นสำหรับคนที่อาจประสบปัญหาเดียวกัน
Simon Dugré

สิ่งนี้ใช้ได้สำหรับฉัน ฉันประสบข้อผิดพลาดเมื่อฉันเปลี่ยนจาก LAN สำนักงานไปเป็นเครือข่ายในบ้านของฉัน รหัสเดียวกันแล็ปท็อปเดียวกัน!
Amal

คุณได้รับข้อผิดพลาดเสมอ (ในคำขอทั้งหมด) หรือบางครั้ง ?
PreguntonCojoneroCabrón

24

หลังจากผ่านไปหลายชั่วโมงด้วยปัญหาเดียวกันนี้ฉันพบว่าบัญชี ASP.NET ที่บริการไคลเอ็นต์กำลังทำงานอยู่ไม่มีสิทธิ์เข้าถึงใบรับรอง ฉันคงได้โดยไปลงในแอพลิเคชันที่ IIS เว็บแอปทำงานภายใต้จะเข้าสู่การตั้งค่าขั้นสูงและการเปลี่ยนแปลงรหัสประจำตัวไปจากบัญชีLocalSystemNetworkService

ทางออกที่ดีกว่าคือการทำให้ใบรับรองทำงานกับNetworkServiceบัญชีเริ่มต้นแต่ใช้งานได้สำหรับการทดสอบการทำงานที่รวดเร็ว


3
คำตอบนี้ควรมีการโหวตมากขึ้น หลังจากหนึ่งสัปดาห์ของการค้นคว้านี่เป็นทางออกเดียวที่เหมาะกับฉัน ขอบคุณ !!
224567893

สิ่งนี้ใช้ได้สำหรับฉัน ขอบคุณอย่างสมบูรณ์แบบ
Emy Stats

18

วิธีการที่มีการตั้งค่า

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

ดูเหมือนว่าจะใช้ได้เนื่องจาก Tls1.2 เป็นโปรโตคอลที่ปลอดภัยรุ่นล่าสุด แต่ฉันตัดสินใจที่จะมองลึกลงไปและตอบเราจำเป็นต้อง hardcode มันจริงๆ

รายละเอียด: Windows Server 2012R2 x64

จากอินเทอร์เน็ตจะมีการบอกว่า. NetFramework 4.6+ จะต้องใช้ Tls1.2 เป็นค่าเริ่มต้น แต่เมื่อฉันอัปเดตโครงการเป็น 4.6 ไม่มีอะไรเกิดขึ้น ฉันพบข้อมูลบางอย่างที่บอกว่าฉันต้องทำการเปลี่ยนแปลงบางอย่างด้วยตนเองเพื่อเปิดใช้งาน Tls1.2 โดยค่าเริ่มต้น

https://support.microsoft.com/en-in/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-default-secure-protocols-in-wi

แต่การอัพเดท windows ที่เสนอนั้นใช้ไม่ได้กับรุ่น R2

แต่สิ่งที่ช่วยฉันได้คือเพิ่มค่า 2 ค่าลงในรีจิสทรี คุณสามารถใช้สคริปต์ PS ถัดไปเพื่อเพิ่มสคริปต์เหล่านั้นโดยอัตโนมัติ

Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord

นั่นคือสิ่งที่ฉันกำลังมองหา แต่ฉันก็ยังตอบคำถามไม่ได้ว่าทำไม NetFramework 4.6+ ไม่ได้ตั้งค่า ... ค่าโปรโตคอลโดยอัตโนมัติ


17

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

ServicePointManager.Expect100Continue = true;
        ServicePointManager.DefaultConnectionLimit = 9999;
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;

8
ฉันจะไม่แนะนำโปรโตคอล SSL3 ที่เพิ่มเข้ามา
Peter de Bruijn

SSL3 มีปัญหาด้านความปลอดภัยที่รุนแรงที่เรียกว่า 'พุดเดิ้ล'
Peter de Bruijn

@PeterdeBruijn Tls and Tls11มีobsoletes ?
Kiquenet

1
@Kiquenet - ใช่ ตั้งแต่เดือนมิถุนายน 2561 PCI (อุตสาหกรรมบัตรชำระเงิน) จะไม่อนุญาตให้ใช้โปรโตคอลที่ต่ำกว่า TLS1.2 (แต่เดิมนี้ถูกกำหนดไว้สำหรับ 06/2017 แต่ถูกเลื่อนออกไปเป็นเวลาหนึ่งปี)
GlennG

มีห้าโพรโทคอลในตระกูลSSL / TLS: SSL v2, SSL v3, TLS v1.0, TLS v1.1 และ TLS v1.2 : github.com/ssllabs/research/wiki/… SSL v2 unsecure, SSL v3 is insecure when used with HTTP (the POODLE attack), TLS v1.0, TLS v1.1 obsoletes ตัวเลือกที่ถูกต้องเท่านั้นที่จะถูก ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12?
Kiquenet

14

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

กล่องโต้ตอบการนำเข้าใบรับรอง


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

11

ข้อยกเว้น "การร้องขอถูกยกเลิก: ไม่สามารถสร้างช่องทางที่ปลอดภัย SSL / TLS" สามารถเกิดขึ้นได้หากเซิร์ฟเวอร์ส่งคืนการตอบกลับHTTP 401 ที่ไม่ได้รับอนุญาตให้ร้องขอ HTTP

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

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

System.Net Information: 0 : [9840] Connection#62912200 - Received status line: Version=1.1, StatusCode=401, StatusDescription=Unauthorized.

ในสถานการณ์ของฉันฉันไม่สามารถตั้งค่าคุกกี้เฉพาะที่เซิร์ฟเวอร์คาดหวังนำไปสู่เซิร์ฟเวอร์ที่ตอบสนองต่อการร้องขอที่มีข้อผิดพลาด 401 ซึ่งนำไปสู่ข้อยกเว้น "ไม่สามารถสร้างช่องทางที่ปลอดภัย SSL / TLS"


1
ตัวกำหนดเวลางานของฉันดำเนินการทุกวัน (ไม่ใช่สุดสัปดาห์) ฉันได้รับข้อผิดพลาดเดียวกัน แต่บางครั้ง ( 2 errors in 2 months) เมื่อฉันได้รับข้อผิดพลาดหลังจากนั้นไม่กี่นาทีฉันลองอีกครั้งด้วยตนเองและทั้งหมดก็โอเค
Kiquenet

10

อีกสาเหตุที่เป็นไปได้ของThe request was aborted: Could not create SSL/TLS secure channelข้อผิดพลาดคือไม่ตรงกันระหว่างค่า cipher_suites ที่ไคลเอ็นต์พีซีของคุณกำหนดไว้และค่าที่เซิร์ฟเวอร์กำหนดค่าว่าเต็มใจและยอมรับได้ได้ ในกรณีนี้เมื่อลูกค้าของคุณส่งรายการค่า cipher_suites ที่สามารถรับได้ในการเริ่มต้น / การเจรจาต่อรอง SSL "Hand Hello" ข้อความเริ่มต้นการจับมือ / การเจรจาต่อรองเซิร์ฟเวอร์เห็นว่าไม่มีค่าที่ยอมรับได้และอาจส่งคืน "การแจ้งเตือน" "การตอบสนองแทนการดำเนินการขั้นตอน" เซิร์ฟเวอร์ Hello "ของ handshake SSL

เพื่อตรวจสอบความเป็นไปได้นี้คุณสามารถดาวน์โหลดMicrosoft Message Analyzerและใช้เพื่อรันการติดตามการเจรจา SSL ที่เกิดขึ้นเมื่อคุณพยายามและล้มเหลวในการสร้างการเชื่อมต่อ HTTPS ไปยังเซิร์ฟเวอร์ (ในแอป C # ของคุณ)

หากคุณสามารถทำการเชื่อมต่อ HTTPS ที่ประสบความสำเร็จจากสภาพแวดล้อมอื่น (เช่นเครื่อง Windows XP ที่คุณกล่าวถึง - หรืออาจกด HTTPS URL ในเบราว์เซอร์ที่ไม่ใช่ของ Microsoft ที่ไม่ได้ใช้การตั้งค่าชุดรหัสของระบบปฏิบัติการเช่น Chrome หรือ Firefox) เรียกใช้การติดตามวิเคราะห์ข้อความอื่นในสภาพแวดล้อมนั้นเพื่อจับภาพสิ่งที่เกิดขึ้นเมื่อการเจรจา SSL สำเร็จ

หวังว่าคุณจะเห็นความแตกต่างระหว่างสองข้อความสวัสดีลูกค้าที่จะช่วยให้คุณระบุสิ่งที่เกี่ยวกับการเจรจา SSL ที่ล้มเหลวทำให้เกิดความล้มเหลว จากนั้นคุณควรจะสามารถทำการเปลี่ยนแปลงการกำหนดค่าให้กับ Windows ที่จะทำให้มันประสบความสำเร็จ IISCryptoเป็นเครื่องมือที่ยอดเยี่ยมสำหรับการใช้งานนี้ (แม้สำหรับเครื่องพีซีไคลเอนต์แม้จะมีชื่อ "IIS")

คีย์รีจิสทรีของ Windows สองตัวต่อไปนี้ควบคุมค่า cipher_suites ที่พีซีของคุณจะใช้:

  • HKLM \ Software \ Policies \ Microsoft \ Cryptography \ Configuration \ SSL \ 00010002
  • HKLM \ SYSTEM \ CurrentControlSet \ Control \ Cryptography \ Configuration \ Local \ SSL \ 00010002

นี่คือการเขียนแบบเต็มของวิธีที่ฉันตรวจสอบและแก้ไขอินสแตนซ์ของปัญหาที่หลากหลายCould not create SSL/TLS secure channel: http://blog.jonschneider.com 2016/08/fix-ssl-handshaking-error-in-windows.html


1
ในกรณีของฉันคำตอบนี้มีประโยชน์ นอกจากนี้เนื่องจากฉันสงสัยว่าพีซีไคลเอ็นต์ของฉันพลาดชุดตัวเลขบางตัวฉันจึงใช้ทางลัดและติดตั้ง Windows Update นี้โดยตรงเพื่อลองเสี่ยงโชค ( support.microsoft.com/en-hk/help/3161639ต้องรีบูต Windows) ก่อนที่จะเริ่ม การค้นหาเครื่องมือวิเคราะห์ข้อความและกลายเป็นว่าฉันโชคดีและแก้ปัญหาของฉันได้ด้วยตัวเอง
sken130

1
โปรดทราบว่าเมื่อคุณทดสอบลิงก์ HTTPS ในเบราว์เซอร์เช่น Firefox แม้ว่าคุณจะได้รหัสลับที่แตกต่างจากที่ได้รับจาก Windows Update ใดก็ตาม Windows Update ก็ยังคุ้มค่าที่จะลองใช้เพราะการติดตั้ง ciphers ใหม่จะมีผลต่อการเจรจาเลขศูนย์ ระหว่างไคลเอนต์พีซีและเซิร์ฟเวอร์ซึ่งจะเป็นการเพิ่มความหวังในการค้นหาคู่ที่ตรงกัน
sken130

ไปยังจุดคำตอบสำหรับปัญหาของฉัน สองสิ่งที่ช่วยให้ฉันค้นหาการเปลี่ยนแปลงที่จะทำ 1. Cipher Suites ที่รองรับโดยเว็บเซิร์ฟเวอร์: ssllabs.com/ssltest 2. Cipher Suites ที่รองรับ Windows รุ่นต่าง ๆ : docs.microsoft.com/en-us/windows/win32/secauthn/ ......
Paul B.

10

รากของข้อยกเว้นนี้ในกรณีของฉันคือในบางจุดในรหัสต่อไปนี้จะถูกเรียกว่า:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

นี่มันแย่จริงๆ ไม่เพียง แต่จะสั่งให้. NET ใช้โพรโทคอลที่ไม่ปลอดภัยเท่านั้น แต่สิ่งนี้จะส่งผลต่อคำขอ WebClient (และที่คล้ายกัน) ใหม่ทุกครั้งที่เกิดขึ้นภายใน appdomain ของคุณ (โปรดทราบว่าคำขอเว็บขาเข้าจะไม่ได้รับผลกระทบในแอป ASP.NET ของคุณ แต่มีคำขอ WebClient ใหม่เช่นเพื่อพูดคุยกับบริการเว็บภายนอก)

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

  • นี่เป็นการตั้งค่าส่วนกลางใน appdomain ของคุณและหากคุณมีกิจกรรมที่เกิดขึ้นพร้อมกันคุณไม่สามารถตั้งค่าได้อย่างน่าเชื่อถือเป็นค่าเดียวทำการกระทำของคุณจากนั้นตั้งค่ากลับมา การกระทำอื่นอาจเกิดขึ้นระหว่างหน้าต่างเล็ก ๆ นั้นและได้รับผลกระทบ
  • การตั้งค่าที่ถูกต้องคือปล่อยให้มันเป็นค่าเริ่มต้น สิ่งนี้ทำให้. NET สามารถใช้สิ่งที่เป็นค่าเริ่มต้นที่ปลอดภัยที่สุดต่อไปเมื่อเวลาผ่านไปและคุณอัพเกรดเฟรมเวิร์ก การตั้งค่าให้ TLS12 (ซึ่งเป็นที่ปลอดภัยที่สุดเช่นการเขียนนี้) จะทำงานในขณะนี้แต่ใน 5 ปีอาจจะเริ่มก่อให้เกิดปัญหาลึกลับ
  • หากคุณจำเป็นต้องตั้งค่าจริง ๆ คุณควรพิจารณาดำเนินการในแอปพลิเคชันพิเศษหรือ appdomain แยกต่างหากและหาวิธีพูดคุยระหว่างมันกับพูลหลักของคุณ เนื่องจากเป็นค่าส่วนกลางเดียวการพยายามจัดการภายในพูลแอพที่ยุ่งจะทำให้เกิดปัญหา คำตอบนี้: https://stackoverflow.com/a/26754917/7656 มอบโซลูชันที่เป็นไปได้ผ่านทางพร็อกซีที่กำหนดเอง (หมายเหตุฉันยังไม่ได้นำไปใช้เป็นการส่วนตัว)

2
ขัดกับกฎทั่วไปของคุณฉันจะเพิ่มว่ามีข้อยกเว้นเมื่อคุณต้องตั้งค่าเป็น TLS 1.2 แทนที่จะปล่อยให้การเรียกใช้เริ่มต้น หากคุณอยู่ในกรอบเก่ากว่า. NET 4.6 และคุณปิดการใช้งานโปรโตคอลที่ไม่ปลอดภัยบนเซิร์ฟเวอร์ของคุณ (SSL หรือ TLS 1.0 / 1.1) คุณจะไม่สามารถออกคำร้องขอได้เว้นแต่คุณบังคับให้โปรแกรมเข้าสู่ TLS 1.2
Paul

10

ฉันมีปัญหานี้เพราะ web.config ของฉันมี:

<httpRuntime targetFramework="4.5.2" />

และไม่:

<httpRuntime targetFramework="4.6.1" />

ฉันมีปัญหาเดียวกันนี้และได้เพิ่มคำตอบโดยละเอียดมากขึ้นด้านล่างซึ่งมีส่วนเพิ่มเติมและลึกหนาบางของปัญหานี้
JLRishe

9

ในขณะที่คุณสามารถบอกได้ว่ามีสาเหตุมากมายที่อาจเกิดขึ้น คิดว่าฉันจะเพิ่มสาเหตุที่พบ ...

ถ้าคุณตั้งค่าของWebRequest.Timeoutไป0นี้เป็นข้อยกเว้นที่จะถูกโยนทิ้ง ด้านล่างเป็นรหัสที่ฉันมี ... (ยกเว้นแทนที่จะกำหนดค่าตายตัว0สำหรับค่าการหมดเวลาฉันมีพารามิเตอร์ที่ตั้งค่าไว้โดยไม่ตั้งใจ0)

WebRequest webRequest = WebRequest.Create(@"https://myservice/path");
webRequest.ContentType = "text/html";
webRequest.Method = "POST";
string body = "...";
byte[] bytes = Encoding.ASCII.GetBytes(body);
webRequest.ContentLength = bytes.Length;
var os = webRequest.GetRequestStream();
os.Write(bytes, 0, bytes.Length);
os.Close();
webRequest.Timeout = 0; //setting the timeout to 0 causes the request to fail
WebResponse webResponse = webRequest.GetResponse(); //Exception thrown here ...

2
ว้าว! ขอบคุณที่พูดถึงสิ่งนี้ ไม่สามารถเชื่อสิ่งนี้ในตอนแรกและลองสิ่งต่าง ๆ มากมายก่อน จากนั้นในที่สุดตั้งค่าการหมดเวลาเป็น 10 วินาทีและข้อยกเว้นหายไป! นี่คือทางออกสำหรับฉัน (y)
derFunk

9

คำตอบด้านบนลงมติอาจจะเพียงพอสำหรับคนส่วนใหญ่ อย่างไรก็ตามในบางกรณีคุณอาจได้รับข้อผิดพลาด "ไม่สามารถสร้างช่องทางที่ปลอดภัย SSL / TLS" ได้แม้จะบังคับใช้ TLS 1.2 ถ้าเป็นเช่นนั้นคุณอาจต้องการปรึกษาบทความที่เป็นประโยชน์นี้สำหรับขั้นตอนการแก้ไขปัญหาเพิ่มเติม ในการสรุป: เป็นอิสระจากปัญหารุ่น TLS / SSL ไคลเอนต์และเซิร์ฟเวอร์ต้องยอมรับใน "ชุดรหัส" ในช่วง "จับมือ" ของการเชื่อมต่อ SSL ลูกค้าจะแสดงรายการรหัสที่รองรับสำหรับเซิร์ฟเวอร์เพื่อตรวจสอบกับรายการของตัวเอง แต่สำหรับเครื่องที่ใช้ Windows บางรุ่น cipher-suites ทั่วไปบางตัวอาจถูกปิดการใช้งาน (ดูเหมือนจะเกิดจากการพยายาม จำกัด พื้นผิวการโจมตี) เพื่อลดโอกาสที่ลูกค้าและเซิร์ฟเวอร์จะเห็นด้วยกับชุดรหัส หากพวกเขาไม่เห็นด้วยคุณอาจเห็น "รหัสแจ้งเตือนร้ายแรง 40" ในตัวแสดงเหตุการณ์และ "ไม่สามารถสร้างช่องทางที่ปลอดภัย SSL / TLS" ในโปรแกรม. NET ของคุณ

บทความข้างต้นอธิบายถึงวิธีการแสดงรายการชุดรหัสที่ได้รับการสนับสนุนของเครื่องทั้งหมดและเปิดใช้งานชุดรหัสเพิ่มเติมผ่าน Windows Registry เพื่อช่วยตรวจสอบว่าชุดรหัสใดที่เปิดใช้งานบนไคลเอนต์ลองไปที่หน้าการวิเคราะห์นี้ใน MSIE (การใช้การติดตาม System.Net อาจให้ผลลัพธ์ที่ชัดเจนมากขึ้น) หากต้องการตรวจสอบเซิร์ฟเวอร์ชุดเข้ารหัสที่รองรับให้ลองใช้เครื่องมือออนไลน์นี้ (สมมติว่าเซิร์ฟเวอร์นั้นเข้าถึงอินเทอร์เน็ตได้) ควรดำเนินการโดยไม่บอกว่าการแก้ไขรีจิสทรีต้องกระทำด้วยความระมัดระวังโดยเฉพาะอย่างยิ่งในกรณีที่เกี่ยวข้องกับระบบเครือข่าย (เครื่องของคุณเป็น VM ที่โฮสต์จากระยะไกลหรือไม่หากคุณต้องการหยุดการเชื่อมต่อเครือข่าย VM จะสามารถเข้าถึงได้หรือไม่?)

ในกรณีของ บริษัท ของฉันเราเปิดใช้งานชุด "ECDHE_ECDSA" เพิ่มเติมหลายรายการผ่านการแก้ไขรีจิสทรีเพื่อแก้ไขปัญหาทันทีและป้องกันปัญหาในอนาคต แต่ถ้าคุณไม่สามารถ (หรือจะไม่แก้ไข) Registry การแก้ไขปัญหาจำนวนมาก (ไม่จำเป็นต้องสวย) เป็นสิ่งที่ควรคำนึงถึง ตัวอย่างเช่น: โปรแกรม. NET ของคุณสามารถมอบหมายการรับส่งข้อมูล SSL ให้กับโปรแกรม Python แยกต่างหาก (ซึ่งอาจทำงานได้ด้วยเหตุผลเดียวกันกับที่ Chrome ร้องขออาจประสบความสำเร็จเมื่อคำขอ MSIE ล้มเหลวในเครื่องที่ได้รับผลกระทบ)


9

หนึ่งในสาเหตุที่ใหญ่ที่สุดของปัญหานี้คือรุ่น. NET Framework ที่ใช้งานอยู่ รุ่นรันไทม์. NET Framework จะมีผลกับโปรโตคอลความปลอดภัยที่เปิดใช้งานตามค่าเริ่มต้น

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

  • .NET Framework 4.5 และรุ่นก่อนหน้า - SSL 3.0, TLS 1.0
  • .NET Framework 4.6.x - TLS 1.0, 1.1, 1.2, 1.3
  • .NET Framework 4.7+ - ค่าเริ่มต้นของระบบ (OS)

(สำหรับเวอร์ชั่นเก่าไมล์สะสมของคุณอาจแตกต่างกันไปขึ้นอยู่กับว่ารันไทม์. NET ใดติดตั้งอยู่บนระบบตัวอย่างเช่นอาจมีสถานการณ์ที่คุณกำลังใช้เฟรมเวิร์กที่เก่ามากและไม่รองรับ TLS 1.0 หรือ 4.6 ไม่รองรับ x และ TLS 1.3)

เอกสารของ Microsoftแนะนำอย่างยิ่งให้ใช้ 4.7+ และค่าเริ่มต้นของระบบ:

เราขอแนะนำให้คุณ:

  • กำหนดเป้าหมาย. NET Framework 4.7 หรือเวอร์ชันที่ใหม่กว่าในแอปของคุณ กำหนดเป้าหมาย. NET Framework 4.7.1 หรือเวอร์ชันที่ใหม่กว่าในแอพ WCF ของคุณ
  • อย่าระบุเวอร์ชัน TLS กำหนดค่ารหัสของคุณเพื่อให้ระบบปฏิบัติการตัดสินใจเกี่ยวกับเวอร์ชัน TLS
  • ดำเนินการตรวจสอบรหัสอย่างละเอียดเพื่อตรวจสอบว่าคุณไม่ได้ระบุรุ่น TLS หรือ SSL

สำหรับไซต์ ASP.NETให้ตรวจสอบเวอร์ชัน. NET Framework ใน<httpRuntime>องค์ประกอบของคุณเนื่องจากจะเป็นตัวกำหนดว่าไซต์ของคุณใช้งานจริงหรือไม่

<httpRuntime targetFramework="4.5" />

ที่ดีกว่า:

<httpRuntime targetFramework="4.7" />

8

อันนี้ใช้ได้สำหรับฉันใน MVC webclient

    public string DownloadSite(string RefinedLink)
    {
        try
        {
            Uri address = new Uri(RefinedLink);

            ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

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

            using (WebClient webClient = new WebClient())
            {
                var stream = webClient.OpenRead(address);
                using (StreamReader sr = new StreamReader(stream))
                {
                    var page = sr.ReadToEnd();

                    return page;
                }
            }

        }
        catch (Exception e)
        {
            log.Error("DownloadSite - error Lin = " + RefinedLink, e);
            return null;
        }
    }

2
จะแทนที่ ServerCertificateValidationCallback จะแนะนำช่องโหว่ด้านความปลอดภัยใหม่หรือไม่

7

ในกรณีที่ลูกค้าเป็นเครื่อง windows เหตุผลที่เป็นไปได้อาจเป็นได้ว่าโปรโตคอล tls หรือ ssl ที่ต้องการโดยบริการไม่ได้เปิดใช้งาน

สามารถตั้งค่าใน:

แผงควบคุม -> เครือข่ายและอินเทอร์เน็ต -> ตัวเลือกอินเทอร์เน็ต -> ขั้นสูง

เลื่อนการตั้งค่าลงไปที่ "ความปลอดภัย" และเลือกระหว่าง

  • ใช้ SSL 2.0
  • ใช้ SSL 3.0
  • ใช้ TLS 1.0
  • ใช้ TLS 1.1
  • ใช้ TLS 1.2

ป้อนคำอธิบายรูปภาพที่นี่


มีปัญหาอะไรในการฟ้องร้องพวกเขาทั้งหมด?
ไนเจล Fds

ไม่มีปัญหาเท่าที่ฉันรู้ว่า ... ยกเว้นว่า SSL จะไม่แนะนำอีกต่อไป ... พวกเขาจะถือว่าปลอดภัยไม่พอ
cnom

วิธีการทำโปรแกรมใน PowerShell?
Kiquenet

นี่คือสิ่งที่มีผลต่อ Windows รุ่นเก่าทำวิจัยบางอย่างค้นหาตัวเลือกความปลอดภัยที่ใช้งานอยู่ในปัจจุบัน ณ วันนี้ดูที่ลิงค์นี้: tecadmin.net/enable-tls-on-windows-server-and-iis
ท็อด

7

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

  1. MMC
  2. ใบรับรอง
  3. ขยายสู่ส่วนบุคคล
  4. เลือกใบรับรอง
  5. คลิกขวา
  6. งานทั้งหมด
  7. จัดการกุญแจส่วนตัว
  8. เพิ่ม

7

หากคุณใช้รหัสจาก Visual Studio ให้ลองใช้ Visual Studio ในฐานะผู้ดูแลระบบ แก้ไขปัญหาสำหรับฉัน


อนิจจาไม่ใช่สำหรับฉัน!
benedict_w

นี่เป็นสิ่งเดียวที่ช่วยฉันได้! ขอบคุณ !!!
alexander ostrikov

6

ฉันต่อสู้กับปัญหานี้มาทั้งวัน

เมื่อฉันสร้างโครงการใหม่ด้วย. NET 4.5 ในที่สุดฉันก็สามารถใช้งานได้

แต่ถ้าฉันลดระดับเป็น 4.0 ฉันได้รับปัญหาเดียวกันอีกครั้งและมันกลับไม่ได้สำหรับโครงการนั้น (แม้เมื่อฉันพยายามอัปเกรดเป็น 4.5 อีกครั้ง)

แปลกไม่มีข้อผิดพลาดอื่น ๆ แต่"ยกเลิกคำขอ: ไม่สามารถสร้างช่องทางที่ปลอดภัย SSL / TLS" เกิดขึ้นสำหรับข้อผิดพลาดนี้


5
เหตุผลที่ใช้งานได้อาจเป็นเพราะรุ่น. NET ที่แตกต่างกันรองรับรุ่นโปรโตคอล SSL / TLS ที่แตกต่างกัน ข้อมูลเพิ่มเติม: blogs.perficient.com/microsoft/2016/04/tsl-1-2-and-net-support
Jon Schneider

4

System.Net.WebException: การร้องขอถูกยกเลิก: ไม่สามารถสร้างช่องทางที่ปลอดภัย SSL / TLS

ในกรณีของเราเราอยู่ที่ไหนโดยใช้ผู้จำหน่ายซอฟต์แวร์ดังนั้นเราจึงไม่สามารถเข้าถึงเพื่อแก้ไขรหัส. NET Apparently .NET 4 จะไม่ใช้ TLS v 1.2 เว้นแต่ว่าจะมีการเปลี่ยนแปลง

การแก้ไขสำหรับเรากำลังเพิ่มคีย์ SchUseStrongCrypto ในรีจิสทรี คุณสามารถคัดลอก / วางรหัสด้านล่างลงในไฟล์ข้อความที่มีนามสกุล. reg และดำเนินการได้ มันทำหน้าที่เป็น "แพทช์" ของเรากับปัญหา

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319]
"SchUseStrongCrypto"=dword:00000001

3
นี่ PS สำหรับการแก้ไขอย่างรวดเร็ว: New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value "1" -Type DWord
Tilo

2
ที่นี่ PS สำหรับการแก้ไขอย่างรวดเร็ว 2: New-ItemProperty -Path "HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319" -Name "SchUseStrongCrypto" -Value "1" -Type DWord
Tilo


4

การแก้ไขนี้สำหรับฉันเพิ่มบริการเครือข่ายไปยังสิทธิ์ คลิกขวาที่ใบรับรอง> งานทั้งหมด> จัดการคีย์ส่วนตัว ... > เพิ่ม ... > เพิ่ม "บริการเครือข่าย"


3

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

จะให้การเข้าถึง ASP.NET กับไพรเวตคีย์ในใบรับรองในที่เก็บใบรับรองได้อย่างไร


ใช่แล้วเหมือนกัน เพื่อแก้ไขฉันได้ทำตามคำตอบของ Nick Gotch: เปลี่ยนข้อมูลประจำตัวของแอพเป็น LocalSystem วิธีนี้แก้ไขได้สำหรับฉัน
Judah Gabriel Himango

1
ขอบคุณสำหรับสิ่งนี้
Denis Pitcher

3

ฉันมีปัญหาเดียวกันนี้และพบว่าคำตอบนี้ทำงานได้อย่างถูกต้องสำหรับฉัน กุญแจคือ 3072 ลิงค์นี้ให้รายละเอียดเกี่ยวกับการแก้ไข '3072'

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

XmlReader r = XmlReader.Create(url);
SyndicationFeed albums = SyndicationFeed.Load(r);

ในกรณีของฉันฟีดสองต้องแก้ไข:

https://www.fbi.gov/feeds/fbi-in-the-news/atom.xml
https://www.wired.com/feed/category/gear/latest/rss

3

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

https://support.microsoft.com/en-us/help/4458166/applications-that-rely-on-tls-1-2-strong-encryption-experience-connect

โดยพื้นฐานแล้ว MS ถือว่าคุณต้องการการเข้ารหัสที่อ่อนแอกว่า แต่ระบบปฏิบัติการจะได้รับการแพตช์เพื่ออนุญาต TLS 1.2 เท่านั้นดังนั้นคุณจะได้รับข้อความ "การร้องขอถูกยกเลิก: ไม่สามารถสร้างช่องทางที่ปลอดภัยของ SSL / TLS"

มีการแก้ไขสามประการ

1) แก้ไขระบบปฏิบัติการด้วยการอัพเดทที่เหมาะสม: http://www.catalog.update.microsoft.com/Search.aspx?q=kb4458166

2) เพิ่มการตั้งค่าลงในไฟล์ app.config / web.config ของคุณ

3) เพิ่มการตั้งค่ารีจิสทรีที่กล่าวถึงแล้วในคำตอบอื่น

ทั้งหมดนี้กล่าวถึงในบทความฐานความรู้ที่ฉันโพสต์


ServicePointManager.SecurityProtocol เพียงครั้งเดียวในแอปของคุณ เราค้นพบการโทรครั้งที่สองในแอพของเรา (ซึ่งค่อนข้างซับซ้อนด้วยแอสเซมบลีที่เป็นตัวเลือกที่กำลังโหลดขณะรันไทม์) ซึ่งตั้งค่าเป็น SSL3 ซึ่งทำให้เกิดข้อผิดพลาดเดียวกัน
Michael Silver

3

ความเป็นไปได้อีกอย่างหนึ่งคือรหัสที่ถูกเรียกใช้ไม่มีการกำหนดล่วงหน้าที่ต้องการ

ในกรณีของฉันฉันได้รับข้อผิดพลาดนี้เมื่อใช้ดีบักเกอร์ Visual Studio เพื่อทดสอบการเรียกใช้บริการเว็บ Visual Studio ไม่ได้ทำงานเป็นผู้ดูแลระบบซึ่งทำให้เกิดข้อยกเว้นนี้


2

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


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