“ การเชื่อมต่อที่สำคัญถูกปิด: เกิดข้อผิดพลาดที่ไม่คาดคิดในการส่ง” ด้วยใบรับรอง SSL


120

ปัญหา: ฉันได้รับข้อยกเว้นนี้ "การเชื่อมต่อที่อยู่ระหว่างการปิด: ข้อผิดพลาดที่ไม่เห็นเกิดขึ้นในการส่ง" ในบันทึกของฉันและเป็นการทำลายการรวม OEM ของเรากับระบบการตลาดทางอีเมลในเวลาสุ่มซึ่งแตกต่างกันไปจาก [1 ชั่วโมง - 4 ชั่วโมง]

เว็บไซต์ของฉันโฮสต์บน Windows Server 2008 R2 ที่มี IIS 7.5.7600 เว็บไซต์นี้มีส่วนประกอบ OEM จำนวนมากและแดชบอร์ดที่ครอบคลุม ทุกอย่างทำงานได้ดีกับองค์ประกอบอื่น ๆ ทั้งหมดของเว็บไซต์ยกเว้นองค์ประกอบการตลาดทางอีเมลของเราซึ่งเราใช้เป็นโซลูชัน iframe ภายในแดชบอร์ดของเรา วิธีการทำงานคือฉันส่ง httpWebRequestobject พร้อมข้อมูลประจำตัวทั้งหมดและฉันได้รับ url กลับมาซึ่งฉันใส่ใน iframe และใช้งานได้ แต่ใช้งานได้เพียงบางครั้ง [1 ชั่วโมง - 4 ชั่วโมง] จากนั้นฉันได้รับข้อยกเว้นด้านล่าง "การเชื่อมต่อที่อยู่ระหว่างการปิดถูกปิด: ข้อผิดพลาดที่ไม่ได้รับการส่งมา" และแม้ว่าระบบจะพยายามรับ URL จาก httpWebRequest ก็ตาม ล้มเหลวด้วยข้อยกเว้นเดียวกัน วิธีเดียวที่จะทำให้กลับมาใช้งานได้อีกครั้งคือการรีไซเคิลพูลแอปพลิเคชันหรือสิ่งที่แก้ไขใน web.config

พยายามตัวเลือกแล้ว

เพิ่มอย่างชัดเจน keep-alive = false

keep-alive = true

เพิ่มเวลานอก: <httpRuntime maxRequestLength="2097151" executionTimeout="9999999" enable="true" requestValidationMode="2.0" />

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

ทุกทิศทางไปสู่ความละเอียดได้รับการชื่นชมอย่างมาก

รหัส:

Public Function CreateHttpRequestJson(ByVal url) As String
    Try
        Dim result As String = String.Empty
        Dim httpWebRequest = DirectCast(WebRequest.Create("https://api.xxxxxxxxxxx.com/api/v3/externalsession.json"), HttpWebRequest)
        httpWebRequest.ContentType = "text/json"
        httpWebRequest.Method = "PUT"
        httpWebRequest.ContentType = "application/x-www-form-urlencoded"
        httpWebRequest.KeepAlive = False
        'ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3

        'TODO change the integratorID to the serviceproviders account Id, useremail 
        Using streamWriter = New StreamWriter(httpWebRequest.GetRequestStream())
            Dim json As String = New JavaScriptSerializer().Serialize(New With { _
            Key .Email = useremail, _
            Key .Chrome = "None", _
            Key .Url = url, _
            Key .IntegratorID = userIntegratorID, _
            Key .ClientID = clientIdGlobal _
            })

            'TODO move it to the web.config, Following API Key is holonis accounts API Key
            SetBasicAuthHeader(httpWebRequest, holonisApiKey, "")
            streamWriter.Write(json)
            streamWriter.Flush()
            streamWriter.Close()

            Dim httpResponse = DirectCast(httpWebRequest.GetResponse(), HttpWebResponse)
            Using streamReader = New StreamReader(httpResponse.GetResponseStream())
                result = streamReader.ReadToEnd()
                result = result.Split(New [Char]() {":"})(2)
                result = "https:" & result.Substring(0, result.Length - 2)
            End Using
        End Using
        Me.midFrame.Attributes("src") = result
    Catch ex As Exception
        objLog.WriteLog("Error:" & ex.Message)
        If (ex.Message.ToString().Contains("Invalid Email")) Then
            'TODO Show message on UI
        ElseIf (ex.Message.ToString().Contains("Email Taken")) Then
            'TODO Show message on UI
        ElseIf (ex.Message.ToString().Contains("Invalid Access Level")) Then
            'TODO Show message on UI
        ElseIf (ex.Message.ToString().Contains("Unsafe Password")) Then
            'TODO Show message on UI
        ElseIf (ex.Message.ToString().Contains("Invalid Password")) Then
            'TODO Show message on UI
        ElseIf (ex.Message.ToString().Contains("Empty Person Name")) Then
            'TODO Show message on UI
        End If
    End Try
End Function


Public Sub SetBasicAuthHeader(ByVal request As WebRequest, ByVal userName As [String], ByVal userPassword As [String])
    Dim authInfo As String = Convert.ToString(userName) & ":" & Convert.ToString(userPassword)
    authInfo = Convert.ToBase64String(Encoding.[Default].GetBytes(authInfo))
    request.Headers("Authorization") = "Basic " & authInfo
End Sub`

คุณเคยคิดออกไหม?
Brett G

12
ใช่ฉันสามารถทำให้มันใช้งานได้กับรหัสนี้ ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls หรือ SecurityProtocolType.Ssl3
Arvind Morwal

ฉันกำลังจะตายด้วยปัญหาเดียวกัน ฉันใช้เวลาหลายชั่วโมงในการต่อสู้กับปัญหาเดียวกัน ขอบคุณสำหรับความคิดเห็นมันช่วยวันของฉัน
Sameers Javed

2
@ user3458212 คุณควรเพิ่มความคิดเห็นของคุณในคำตอบ
icc97

2
ในกรณีของฉันการเรียกใช้เว็บไซต์ใน Visual Studio 15 ทุกอย่างเป็นไปด้วยดี แต่ในตอนท้ายเนื่องจากฉันไม่สามารถอัปเกรดเฟรมเวิร์กในเซิร์ฟเวอร์ได้และการบังคับให้ TLS 1.2 และการปิดใช้งานการเก็บรักษาไม่ทำงานฉันต้องตั้งค่าตัวกลาง เว็บเซิร์ฟเวอร์เพื่อพร็อกซีเว็บเซิร์ฟเวอร์เป้าหมายที่หยุดการเชื่อมต่อ
José Roberto García Chico

คำตอบ:


194

สำหรับฉันมันคือ tls12:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

42
โปรดทราบว่าคุณต้องระวังให้ดีเนื่องจากการเปลี่ยนแปลงนี้เกิดขึ้นทั่วโลกสำหรับ AppDomain ของคุณและจะทำให้การเรียกไปยังไซต์ใด ๆ ที่ไม่มี TLS 1.2 ล้มเหลว (ซึ่งคุณอาจต้องการหากข้อมูลที่จะขนส่งมีความละเอียดอ่อนอย่างแท้จริง) หากต้องการใช้ TLS 1.2 แต่ยังคงอนุญาต 1.1 และ 1.0 คุณต้องหรือ:ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
ฝุ่น

เหมือนกันที่นี่คุณช่วยชีวิตฉันใช้เวลามากมายเพื่อคิดว่า RestSharp มีอะไรผิดปกติ
darul75

โซลูชันนี้ยังใช้ได้กับผู้ที่ไม่ได้ใช้ RestSharp เช่นเดียวกับผู้ที่ไม่ได้ใช้ ServicePointManager เพียงคัดลอกและวางบรรทัดด้านบนก่อนการเรียก WebRequest ของคุณหรือสิ่งที่คุณใช้ในการร้องขอ ตอนแรกฉันไม่สนใจวิธีแก้ปัญหานี้เนื่องจากเหตุผลข้างต้น
goku_da_master

หรือเพิ่มเข้าไปในสิ่งที่มีอยู่แล้ว ... System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;
uosjead

8
เมื่อต้องการทำสิ่งนี้ใน PowerShell ให้ "ไบนารีหรือ" รวมกันดังนี้[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls
Adam S

64

หากคุณติดอยู่กับ. Net 4.0 และไซต์เป้าหมายกำลังใช้ TLS 1.2 คุณต้องใช้บรรทัดต่อไปนี้แทน ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

แหล่งที่มา: TLS 1.2 และ. NET Support: วิธีหลีกเลี่ยงข้อผิดพลาดในการเชื่อมต่อ


5
! น่ากลัว ฉันจะเพิ่มที่(SecurityProtocolType)768สามารถใช้สำหรับ "Tls11" (เช่น TLS 1.1)
Solomon Rutzky

2
สิ่งนี้ช่วยได้จริงๆ มันช่วยวันของฉัน ผมต้องติด. Net 2.0
Hao Nguyen

24

โค้ดด้านล่างนี้ช่วยแก้ปัญหาได้

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls Or SecurityProtocolType.Ssl3

6
อย่างไรก็ตามสิ่งนี้จะได้ผลโปรดจำไว้ว่าServicePointManager.SecurityProtocolเป็นวัตถุคงที่ซึ่งหมายความว่าการเปลี่ยนค่านี้จะส่งผลต่อลำดับย่อยWebRequestหรือการWebClientเรียกทั้งหมด คุณสามารถสร้างแยกกันได้AppDomainหากต้องการServicePointManagerตั้งค่าต่างๆ ดูstackoverflow.com/questions/3791629/…สำหรับรายละเอียดเพิ่มเติม
stack247

1
อ่านเพิ่มเติมที่เป็นประโยชน์เพื่อทำความเข้าใจว่าโค้ดนี้ใช้ทำอะไร: stackoverflow.com/questions/26389899/…
Jon Schneider

@Marnee ฉันใส่ไว้ในรูทองค์ประกอบของแอปพลิเคชันดังนั้นจึงถูกตั้งค่าก่อนที่ I / O จะเกิดขึ้น
JG ใน SD

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

14

ฉันประสบปัญหาเดียวกันมาหลายวันแล้วด้วยการผสานรวมที่ "เคยใช้งานมาก่อน"

จากภาวะซึมเศร้าที่แท้จริงฉันเพิ่งลองทำ

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;

สิ่งนี้แก้ไขให้ฉันได้.. แม้ว่าการรวมอย่างเคร่งครัดจะใช้ SSLv3 เท่านั้น

ฉันตระหนักได้ว่ามีบางอย่างเกิดขึ้นเนื่องจาก Fiddler รายงานว่ามี "รหัสการเจรจา TLS ที่ว่างเปล่า" หรือสิ่งที่คล้ายกัน

หวังว่าจะได้ผลนะ!


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

13

ในกรณีของฉันไซต์ที่ฉันกำลังเชื่อมต่อได้อัปเกรดเป็น TLS 1.2 ด้วยเหตุนี้ฉันจึงต้องติดตั้ง. net 4.5.2 บนเว็บเซิร์ฟเวอร์ของฉันเพื่อรองรับ


สามารถทำได้ที่ระดับรีจิสทรีบนเครื่องหรือไม่? ฉันได้ปิดใช้งานโปรโตคอล SSL ทั้งหมดโดยปล่อยให้ TLS 1.0, 1.1, 1.2 อย่างไรก็ตามฉันเข้าใจว่าสิ่งที่น้อยกว่า TLS 1.2 ควรถูกลบออกในไม่ช้าเพื่อให้สอดคล้องกับ PCI
brendo234

13

ไปที่ web.config / App.config เพื่อตรวจสอบรันไทม์. net ที่คุณใช้

  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>

นี่คือวิธีแก้ปัญหา:

  1. .NET 4.6 ขึ้นไป คุณไม่จำเป็นต้องทำงานเพิ่มเติมใด ๆ เพื่อรองรับ TLS 1.2 ซึ่งรองรับโดยค่าเริ่มต้น

  2. .NET 4.5. รองรับ TLS 1.2 แต่ไม่ใช่โปรโตคอลเริ่มต้น คุณต้องเลือกใช้งาน รหัสต่อไปนี้จะทำให้ TLS 1.2 เป็นค่าเริ่มต้นตรวจสอบให้แน่ใจว่าได้ดำเนินการก่อนทำการเชื่อมต่อกับทรัพยากรที่ปลอดภัย:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

  1. .NET 4.0 ไม่รองรับ TLS 1.2 แต่ถ้าคุณติดตั้ง. NET 4.5 (หรือสูงกว่า) ในระบบคุณก็ยังสามารถเลือกใช้ TLS 1.2 ได้แม้ว่ากรอบงานแอปพลิเคชันของคุณจะไม่รองรับก็ตาม ปัญหาเดียวคือ SecurityProtocolType ใน. NET 4.0 ไม่มีรายการสำหรับ TLS1.2 ดังนั้นเราจึงต้องใช้การแสดงตัวเลขของค่า enum นี้:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

  1. .NET 3.5 หรือต่ำกว่า ไม่รองรับ TLS 1.2 (*) และไม่มีวิธีแก้ปัญหา อัปเกรดแอปพลิเคชันของคุณเป็นเวอร์ชันล่าสุดของเฟรมเวิร์ก

6

ฉันพบว่านี่เป็นสัญญาณว่าเซิร์ฟเวอร์ที่คุณกำลังปรับใช้โค้ดมี. NET framework เก่าติดตั้งที่ไม่รองรับ TLS 1.1 หรือ TLS 1.2 ขั้นตอนในการแก้ไข:

  1. การติดตั้ง. NET Runtimeล่าสุดบนเซิร์ฟเวอร์ที่ใช้งานจริงของคุณ (IIS & SQL)
  2. การติดตั้ง. NET Developer Packล่าสุดบนเครื่องพัฒนาของคุณ
  3. เปลี่ยนการตั้งค่า "กรอบเป้าหมาย" ในโครงการ Visual Studio ของคุณเป็นกรอบงาน. NET ล่าสุด

คุณสามารถรับ. NET Developer Pack และ Runtime ล่าสุดได้จาก URL นี้: http://getdotnet.azurewebsites.net/target-dotnet-platforms.html


เปลี่ยนกรอบเป้าหมายจาก 4.5.2 เป็น 4.6.1 และเริ่มทำงานขอบคุณ Patrick
Vivek Sharma

4

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

รหัสของพวกเขาเป็นแบบผสมระหว่าง. NET 3.x และ 2.2 ซึ่งตามที่ฉันเข้าใจหมายความว่าพวกเขากำลังใช้ TLS 1.0

คำตอบด้านล่างสามารถช่วยคุณวินิจฉัยปัญหาได้โดยการเปิดใช้งาน TLS 1.0, SSL 2 และ SSL3 แต่เพื่อให้ชัดเจนว่าคุณไม่ต้องการดำเนินการในระยะยาวเนื่องจากโปรโตคอลทั้งสามเหล่านี้ถือว่าไม่ปลอดภัยและไม่ควรเป็นอีกต่อไป ใช้แล้ว :

เพื่อให้ IIS ของเราตอบสนองต่อการเรียก API เราต้องเพิ่มการตั้งค่ารีจิสทรีบนเซิร์ฟเวอร์ของ IIS เพื่อเปิดใช้งาน TLS เวอร์ชันอย่างชัดเจน - หมายเหตุ: คุณต้องรีสตาร์ทเซิร์ฟเวอร์ Windows (ไม่ใช่เฉพาะบริการ IIS) หลังจากทำการเปลี่ยนแปลงเหล่านี้:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
1.0\Client] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
1.0\Server] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
1.1\Client] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
1.1\Server] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
1.2\Client] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS
1.2\Server] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001

หากไม่เป็นเช่นนั้นคุณสามารถทดลองเพิ่มรายการสำหรับ SSL 2.0:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server]
"DisabledByDefault"=dword:00000000
"Enabled"=dword:00000001

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

คุณสามารถเพิ่มความเร็วในการเพิ่มรายการ reg เหล่านั้นด้วยสคริปต์ powershell นี้:

$ProtocolList       = @("SSL 2.0","SSL 3.0","TLS 1.0", "TLS 1.1", "TLS 1.2")
$ProtocolSubKeyList = @("Client", "Server")
$DisabledByDefault = "DisabledByDefault"
$Enabled = "Enabled"
$registryPath = "HKLM:\\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\"

foreach($Protocol in $ProtocolList)
{
    Write-Host " In 1st For loop"
        foreach($key in $ProtocolSubKeyList)
        {         
            $currentRegPath = $registryPath + $Protocol + "\" + $key
            Write-Host " Current Registry Path $currentRegPath"
            if(!(Test-Path $currentRegPath))
            {
                Write-Host "creating the registry"
                    New-Item -Path $currentRegPath -Force | out-Null             
            }
            Write-Host "Adding protocol"
                New-ItemProperty -Path $currentRegPath -Name $DisabledByDefault -Value "0" -PropertyType DWORD -Force | Out-Null
                New-ItemProperty -Path $currentRegPath -Name $Enabled -Value "1" -PropertyType DWORD -Force | Out-Null    
    }
}
 
Exit 0

นั่นเป็นรุ่นล่าสุดของสคริปต์จากหน้าความช่วยเหลือของ Microsoft สำหรับการตั้งค่า TLS สำหรับการ VMM นี้บทความ basics.netเป็นเพจที่เดิมให้ฉันคิดที่จะมองไปที่การตั้งค่าเหล่านี้


ปัญหาของเราเกี่ยวกับขั้นตอนการเผยแพร่ผ่าน Team City ที่หยุดกะทันหันเมื่อเราเปลี่ยนใบรับรองสำหรับเซิร์ฟเวอร์ที่ใช้งานจริงของคุณ เราได้เปลี่ยนเซิร์ฟเวอร์ให้ใช้เฉพาะ TLS1.2 แล้วและไปป์ไลน์ Team City ของเราก็หยุดทำงาน ... ทำงานเหมือนฝัน ... เพิ่มรายการบันทึกและรีสตาร์ทเซิร์ฟเวอร์ ... บูม !!! ขอบคุณ tomRedox !!
Gwasshoppa

@Gwasshoppa เพียงเพื่อย้ำว่าข้างต้นเป็นเพียงข้อยุติในการวินิจฉัยปัญหาเท่านั้น ตอนนี้คุณรู้แล้วว่าเป็นปัญหาเวอร์ชัน TLS วิธีแก้ปัญหาคือการเปลี่ยนไปป์ไลน์การเผยแพร่เพื่อให้สามารถทำงานกับ TLS1.2 จากนั้นปิด TLS <1.2 และ SSL 2 และ 3 อีกครั้ง ฉันได้อัปเดตคำตอบข้างต้นเล็กน้อยเพื่อเน้นย้ำเช่นกัน
tomRedox

4

เพียงเพิ่ม:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;


1
โปรดให้คำอธิบายพร้อมคำตอบของคุณ
Word Rearranger

4
คำตอบนี้ไม่ได้เพิ่มอะไรให้กับคำตอบก่อนหน้านี้
Arvindh Mani

2

หากมีคนช่วยเรามีปัญหากับใบรับรองที่หายไป สภาพแวดล้อมคือ Windows Server 2016 Standard พร้อม. Net 4.6

มีบริการ WCF ที่โฮสต์เอง https URI ซึ่ง Service.Open () จะดำเนินการโดยไม่มีข้อผิดพลาด เธรดอื่นจะยังคงเข้าถึงhttps: // OurIp: 443 / OurService? wsdlเพื่อให้แน่ใจว่าบริการนั้นพร้อมใช้งาน การเข้าถึง WSDL เคยล้มเหลวด้วย:

การเชื่อมต่อที่สำคัญถูกปิด: เกิดข้อผิดพลาดที่ไม่คาดคิดในการส่ง

การใช้ServicePointManager.SecurityProtocolกับการตั้งค่าที่เกี่ยวข้องไม่ทำงาน การเล่นกับบทบาทและคุณสมบัติของเซิร์ฟเวอร์ไม่ได้ช่วยเช่นกัน จากนั้นก้าวเข้าไปในJaise George , SE เพื่อแก้ไขปัญหาในสองสามนาที Jaiseติดตั้งใบรับรองที่ลงนามด้วยตนเองใน IIS เพื่อแก้ไขปัญหา นี่คือสิ่งที่เขาทำเพื่อแก้ไขปัญหา:

(1) เปิดตัวจัดการ IIS (inetmgr) (2) คลิกที่โหนดเซิร์ฟเวอร์ในแผงด้านซ้ายและดับเบิลคลิก "ใบรับรองเซิร์ฟเวอร์" (3) คลิกที่ "Create Self-Signed Certificate" บนแผงด้านขวาและพิมพ์อะไรก็ได้ที่คุณต้องการสำหรับชื่อที่จำง่าย (4) คลิกที่ "เว็บไซต์เริ่มต้น" ในแผงด้านซ้ายคลิก "การเชื่อมโยง" ที่แผงด้านขวาคลิก "เพิ่ม" เลือก "https" เลือกใบรับรองที่คุณเพิ่งสร้างและคลิก "ตกลง" (5) การเข้าถึง https URL ควรเข้าถึงได้


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

2

คุณเพียงแค่เปลี่ยนเวอร์ชันแอปพลิเคชันของคุณเช่น 4.0 เป็น 4.6 และเผยแพร่โค้ดเหล่านั้น

เพิ่มบรรทัดรหัสด้านล่างด้วย:

httpRequest.ProtocolVersion = HttpVersion.Version10; 
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

1

การใช้พร็อกซีการดีบัก HTTP อาจทำให้เกิดสิ่งนี้ - เช่น Fiddler

ฉันกำลังโหลดใบรับรอง PFX จากไฟล์ในเครื่อง (การตรวจสอบสิทธิ์ไปยัง Apple.com) และล้มเหลวเนื่องจาก Fiddler ไม่สามารถส่งผ่านใบรับรองนี้ได้

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


0

รหัสด้านล่างช่วยแก้ปัญหาของฉัน:

request.ProtocolVersion = HttpVersion.Version10; // THIS DOES THE TRICK
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.