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


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.


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);
    }

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;

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


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;
}

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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.