Pobieranie źródła strony

0

Witam

Może jakiś magik mi pomoże. Używałem poniższego kodu do pobierania źródła strony przez dobre 5 lat, ale jakieś 2-3 tygodnie temu ta metoda przestała działać. Teraz cały czas zwraca błąd: "The request was aborted: Could not create SSL/TLS secure channel.". W google znalazlem wszędzie jedno i to samo, żeby dodać SecurityProtocol dla tls 1.2, ale nic to nie dalo. Ma ktoś jakiś pomysł jak to naprawić?

Kod:

using System;
using System.IO;
using System.Net;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string jsonUrl = "https://store.playstation.com/store/api/chihiro/00_09_000/container/GB/en/999/EP0177-CUSA05674_00-SONIC20170000000/";

                ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; // win xp fix
                ServicePointManager.Expect100Continue = true;
                ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072 | (SecurityProtocolType)768 | SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;
                
                using (WebClient wc = new WebClient())
                {
                    wc.Proxy = null; // win xp fix
                    wc.Encoding = Encoding.UTF8;
                    //wc.Headers.Add(HttpRequestHeader.UserAgent, "My app.");
                    //wc.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0");

                    StringBuilder jsonSB = new StringBuilder(Convert.ToString(wc.DownloadString(jsonUrl)));

                    File.WriteAllText("jsonTest.txt", jsonSB.ToString());

                    jsonSB.Remove(0, jsonSB.Length);
                }
            }
            catch (WebException ex)
            {
                Console.WriteLine("BLAD: " + ex.Message);
                return;
            }

            Console.WriteLine("Gotowe.");
        }
    }
}

Curl pobiera źródło bez żadnych problemów na Win XP i Win 7

curl.exe --insecure --request GET "https://store.playstation.com/store/api/chihiro/00_09_000/container/GB/en/999/EP0177-CUSA05674_00-SONIC20170000000/" --output "json.txt"

Pozdrawiam

0

Spróbuj w ten sposób (Tls12 zamiast Tls):

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12;
0

Nie wiem na ile to będzie pomocne.

  1. Skompilowałem to na mono na linuxie. Wszystko działa.
  2. Sprawdziłem na win7 - nie działa
  3. Sprawdziłem certyfikat strony.
  4. Przeorałem komunikację snifferem
  5. Okazało się, że na windowsie brakuje Cipherów (w NET?).
  6. Dodałem brakujący cipher do SecurityProtocol i dostałem wyjątek, że jest nie obsługiwany.

Lekturka:
Cipher

0

Nie znam się za bardzo na tych połączeniach, certyfikatach itd., znalazlem jakas stronke, gdzie można uruchomić kod - dotnetfiddle.net i wszystko działa nawet jak usune wszystkie opcje ServicePointManager. Nic nie rozumiem.

2

W uproszczeniu:
Strona zmieniła certyfikat. Ten rodzaj certyfikatu nie jest obsługiwany przez XP ani 7.
Na win10 wszystko działa.
Możesz wykorzystać curl do pobierania, on ma wbudowaną obsługę certyfikatów.

0

Czyli rozumiem, że nie da rady nic zrobić, żeby to ruszyło w C# NET 4.0-4.5? Bedzie działać tylko z najnowszym frameworkiem .NET 4.7-4.8, czy chodzi jeszcze o cos innego? Tak dopytuje, bo jak pisałem nie znam się za bardzo na tym, a skoro stary curl z 2014 działa bez problemu na win xp i 7, to dziwi mnie, że nie można tego jakoś obejść, wychodzi z tego, że ograniczony nie jest sam system tylko .NET.

Pozdrawiam

0

Brak tutaj jest najważniejszej informacji - jaka to jest wersja .NET, na jaką to jest wersję .NET targetowane i jaki to jest system operacyjny?

W curl działa, bo po pierwsze robisz --insecure, a po drugie to curl sam sobie robi cała obsługę SSL/TLS - a w .NET używasz WebClient, który zrzuca to na system operacyjny.

Artykuł na ten temat: https://medium.com/@kyle.gagnet/your-net-code-could-stop-working-in-june-afb35fbf29ca

However, there is no patch to enable the protocols for code that targets 4.0. You will have to ensure .NET 4.5 is installed.

Możliwe opcje: targetować .NET Framework 4.5 lub nowszy. Dla 3.5.1 jest jeszcze opcja pt. https://support.microsoft.com/en-us/help/3154518/support-for-tls-system-default-versions-included-in-the-net-framework.

Przejrzyj również https://docs.microsoft.com/en-us/dotnet/framework/network-programming/tls#if-your-app-targets-a-net-framework-version-earlier-than-47

0

U mnie działa: https://pastebin.com/eHqZmDaf
Wymaga to 2 bibliotek:

  1. Newtonsoft.Json
  2. RestSharp
0

No i d_pa blada, sprawdziłem dosłownie wszystko co się dało i co znalazłem w google, dodałem wpisy do rejestru, żeby włączyć nowe TLSy, sprawdziłem programem WhatTLSSupport na Windows 7, niby wszystko ok:

.NET Runtime: 4.8.3761.0
Enabled protocols: Tls, Tls11, Tls12, Tls13

Available protocols: SystemDefault (0), Ssl3 (48), Tls (192), Tls11 (768), Tls12 (3072), Tls13 (12288)

Is Tls12 enabled: True

i cały czas to samo :-(


RestSharp niestety nie ma nowej wersji dla .Net 4.5, a przynajmniej mi nie chciało się zainstakiwać z nugeta, a starsza wersja zwraca ten sam błąd co mam od początku.


Czyli tak jak pisał @Riki, niestety to wina systemu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1