Autentikasi gagal karena pihak jarak jauh telah menutup aliran transportasi

87

Saya mengembangkan klien TCP untuk menghubungkan server OpenSSL dengan otentikasi sertifikat. Saya telah menggunakan file .crt dan .key yang dibagikan oleh tim server. Sertifikat ini dibuat oleh perintah OpenSSL.

Saya menggunakan SslStreamobjek untuk mengotentikasi klien Tcp dengan memanggil SslStream.AuthenticateAsClientmetode dengan melewati server IP, SslProtocols.Ssl3dan X509CertificateCollection.

Saya mendapatkan kesalahan berikut:

Autentikasi gagal karena pihak jarak jauh telah menutup aliran transportasi

Odelu
sumber
2
Penampilan ini seperti masalah di hari-hari pasca-POODLE: SslProtocols.Ssl3. Mungkin kamu harus mencobanya SslProtocols.Tls. Dalam .Net 4.5 dan yang lebih baru, Anda juga dapat menggunakan Tls11atau Tls12. Lihat Enumerasi SslProtocols . Anda mungkin memiliki masalah lain.
jww
Terima kasih. Masalah saya diselesaikan dengan melampirkan sertifikat dari jalur fisik sertifikat dan kata sandi alih-alih mencari nama subjek sertifikat dari penyimpanan sertifikat windows.
Odelu
Sekarang saya bisa mendapatkan hasil dari semua SslProtocols (SSL3, Tls1 dan Tls2). Terima kasih atas balasannya
Odelu
@Odelu, bagaimana Anda memperbaiki masalah? Di sisi klien atau sisi server?

Jawaban:

155

Saya akan menyarankan agar tidak membatasi SecurityProtocol ke TLS 1.1.

Solusi yang disarankan adalah dengan menggunakan

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

Pilihan lainnya adalah menambahkan kunci Registry berikut:

Key: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 
Value: SchUseStrongCrypto 

Perlu dicatat bahwa .NET 4.6 akan menggunakan protokol yang benar secara default dan tidak memerlukan solusi mana pun.

GuiSim
sumber
6
wow, Anda baru saja menyelesaikan masalah saya - saya mencoba segala macam hal - dan kemudian berakhir di sini melihat catatan di kerangka. Baru saja beralih ke 4.6.1 (sebelumnya menggunakan 4.5), berharap masalahnya adalah kerangka kerja mungkin menggunakan protokol keamanan yang salah - dan bingo, koneksi saya tidak ditolak, dan saya mendapatkan data saya!
Veverke
7
Penting untuk mengatakan bahwa System.Net.ServicePointManager.SecurityProtocol = ...itu harus dijalankan sebelum membuat permintaan.
Tonatio
2
bahwa pembaruan versi kerangka kerja target ke 4.6.1 menyelamatkan hidup saya :-)
Tunggu
Kerangka saya ditetapkan pada 4.6.2. Mungkin saya harus menggunakan solusi TLS sebagai gantinya
Luminous
Saya menggunakan Kerangka 4.7.2 juga situs yang saya kirim permintaan menggunakan TLS 1.2 tetapi seperti pada 6 permintaan dari 10 saya mendapatkan kesalahan ini. ada ide?
Davit Mikuchadze
16

Jika Anda ingin menggunakan versi .net yang lebih lama, buat bendera Anda sendiri dan transmisikan.

    //
    // Summary:
    //     Specifies the security protocols that are supported by the Schannel security
    //     package.
    [Flags]
    private enum MySecurityProtocolType
    {
        //
        // Summary:
        //     Specifies the Secure Socket Layer (SSL) 3.0 security protocol.
        Ssl3 = 48,
        //
        // Summary:
        //     Specifies the Transport Layer Security (TLS) 1.0 security protocol.
        Tls = 192,
        //
        // Summary:
        //     Specifies the Transport Layer Security (TLS) 1.1 security protocol.
        Tls11 = 768,
        //
        // Summary:
        //     Specifies the Transport Layer Security (TLS) 1.2 security protocol.
        Tls12 = 3072
    }
    public Session()
    {
        System.Net.ServicePointManager.SecurityProtocol = (SecurityProtocolType)(MySecurityProtocolType.Tls12 | MySecurityProtocolType.Tls11 | MySecurityProtocolType.Tls);
    }
Iguanaware
sumber
1
Anda tidak harus menggunakan kelas Anda sendiri, Anda dapat langsung mentransmisikan bilangan bulat ke SecurityProtocolTypeServicePointManager.SecurityProtocol = (SecurityProtocolType) 48 | (SecurityProtocolType) 192 | (SecurityProtocolType) 768 | (SecurityProtocolType) 3072;
Yan
13

Menambahkan kode di bawah membantu saya mengatasi masalah tersebut.

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;
muruge
sumber
8
using (var client = new HttpClient(handler))
            {
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
                var response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Get, apiEndPoint)).ConfigureAwait(false);
                await response.Content.ReadAsStringAsync().ConfigureAwait(false);
            }

Ini berhasil untuk saya

Sanket Sonavane
sumber
1
Bit kritis adalah baris berikut: ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; Jawaban ini bagus karena menunjukkan di mana garis itu harus sesuai dengan kasus penggunaan yang khas.
Nick Painter
5

Saya mengalami pesan kesalahan yang sama saat menggunakan ChargifyNET.dll untuk berkomunikasi dengan Chargify API. Menambahkan chargify.ProtocolType = SecurityProtocolType.Tls12;ke konfigurasi memecahkan masalah bagi saya.

Berikut cuplikan kode lengkapnya:

public ChargifyConnect GetChargifyConnect()
{
    var chargify = new ChargifyConnect();
    chargify.apiKey = ConfigurationManager.AppSettings["Chargify.apiKey"];
    chargify.Password = ConfigurationManager.AppSettings["Chargify.apiPassword"];
    chargify.URL = ConfigurationManager.AppSettings["Chargify.url"];

    // Without this an error will be thrown.
    chargify.ProtocolType = SecurityProtocolType.Tls12;

    return chargify;
}
Tod Birdsall
sumber
2

Untuk VB.NET, Anda dapat menempatkan yang berikut ini sebelum permintaan web Anda:

Const _Tls12 As SslProtocols = DirectCast(&HC00, SslProtocols)
Const Tls12 As SecurityProtocolType = DirectCast(_Tls12, SecurityProtocolType)
ServicePointManager.SecurityProtocol = Tls12

Ini memecahkan masalah keamanan saya di .NET 3.5.

pengguna1477388
sumber
0

Ini terjadi pada saya ketika titik akhir permintaan web dialihkan ke server lain yang hanya menerima permintaan TLS1.2. Mencoba begitu banyak upaya yang kebanyakan ditemukan di Stackoverflow seperti

  1. Kunci Registri,
  2. Ditambahkan:
    System.Net.ServicePointManager.SecurityProtocol | = System.Net.SecurityProtocolType.Tls12; ke Global.ASX OnStart,
  3. Ditambahkan di Web.config.
  4. Memperbarui .Net framework ke 4.7.2 Masih mendapatkan Pengecualian yang sama.

Pengecualian yang diterima tidak membuat keadilan untuk masalah sebenarnya yang saya hadapi dan tidak menemukan bantuan dari operator layanan.

Untuk mengatasi ini saya harus menambahkan Cipher Suite TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 baru Saya telah menggunakan IIS Crypto 2.0 Tool dari sini seperti yang ditunjukkan di bawah ini.

masukkan deskripsi gambar di sini

FunMatters
sumber