Perbarui layanan web .NET untuk menggunakan TLS 1.2

99

Saya perlu menggunakan TLS 1.2 untuk menyambung dari layanan web .NET saya ke layanan lain yang akan memaksa TLS 1.2. Saya menemukan sumber yang mengatakan .NET 4.6 menggunakan TLS 1.2 secara default sehingga terdengar seperti solusi termudah. Saya memperbarui kerangka kerja .NET di server dan memulai ulang. Di IIS saya mencoba membuat pool aplikasi menggunakan .NET 4.6 tetapi 4.0 adalah satu-satunya pilihan. Kemudian saya menemukan sesuatu yang mengatakan akan tetap mengatakan 4.0 karena 4.6 adalah pembaruan "di tempat" untuk .NET 4.0. Jadi saya pikir mungkin saya sudah selesai. Namun pada halaman kesalahan yang saya dapatkan karena alasan yang tidak terkait, dikatakan Microsoft .NET Framework Version:4.0.30319jadi sepertinya saya belum berhasil meningkatkan. Ada petunjuk tentang cara memastikan kumpulan aplikasi saya menggunakan .NET 4.6, atau secara umum cara mengaktifkan TLS 1.2?

nasch
sumber
4
Saya yakin TLS12 harus diaktifkan di server. support.quovadisglobal.com/kb/a433/…
lcryder
4
Mengapa suara negatif?
nasch

Jawaban:

140

Kami sebenarnya baru saja meningkatkan layanan web .NET ke 4.6 untuk memungkinkan TLS 1.2.

Apa yang dikatakan Artem adalah langkah pertama yang kami lakukan. Kami mengompilasi ulang kerangka layanan web menjadi 4.6 dan kami mencoba mengubah kunci registri untuk mengaktifkan TLS 1.2, meskipun ini tidak berhasil: sambungan masih dalam TLS 1.0. Selain itu, kami tidak ingin melarang SLL 3.0, TLS 1.0 atau TLS 1.1 pada mesin: layanan web lain dapat menggunakan ini; kami mengembalikan perubahan kami pada registri.

Kami benar-benar mengubah file Web.Config untuk memberi tahu IIS: "hei, jalankan saya di 4.6".

Berikut perubahan yang kami tambahkan di web.config + kompilasi ulang di .NET 4.6:

<system.web>
    <compilation targetFramework="4.6"/> <!-- Changed framework 4.0 to 4.6 -->

    <!--Added this httpRuntime -->
    <httpRuntime targetFramework="4.6" />

    <authentication mode="Windows"/>
    <pages controlRenderingCompatibilityVersion="4.0"/>
</system.web>

Dan koneksi berubah menjadi TLS 1.2, karena IIS sekarang menjalankan layanan web di 4.6 (diberitahu secara eksplisit) dan 4.6 menggunakan TLS 1.2 secara default.

Etienne Faucher
sumber
3
Berikut dokumentasi yang kami gunakan untuk penelitian: HTTPRuntime , RenderingCompatibility
Etienne Faucher
1
Saya menemukan jawabannya - Saya tidak meminta HTTPS. Setelah saya memperbaikinya, itu berhasil.
nasch
3
Mengubah kompilasi menjadi 4.6 dan menambahkan httpRuntime 4.6 sudah cukup dalam kasus kami, terima kasih atas solusinya!
krilovich
2
Ini benar-benar jawaban yang benar. Baru saja melalui ini baru-baru ini. Berikut entri blog tentangnya: blog.thelevelup.com/pci-security-is-your-restaurant-ready dan proyek GitHub yang melakukan ini: github.com/TheLevelUp/pos-tls-patcher
user24601
88

Tambahkan kode berikut sebelum Anda membuat contoh klien layanan web Anda:

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

Atau untuk kompatibilitas mundur dengan TLS 1.1 dan sebelumnya:

System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12; 
John Wu
sumber
2
Ya, saya sudah melakukan itu, tetapi pesan kesalahan masih menunjukkan .NET 4.0.
nasch
12
Itu adalah versi CLR Anda. CLR .Net memiliki dua versi, 2.0 dan 4.0. Di IIS Anda menentukan versi CLR, bukan versi Framework. IIS tidak akan memberi tahu Anda. Net 4.6 karena tidak peduli tentang itu. Jika Anda mengkompilasi menggunakan 4.6, maka Anda menggunakan 4.6.
Amy
2
TLS 1.2 didukung mulai .NET 4.5 dan seterusnya
Gilberto Alexandre
5
Dalam hal ini, | = lebih unggul dari just =. Itu adalah bendera biner, jangan menimpa yang lainnya jika tidak perlu.
Izzy
2
@JohnWu - harap perhatikan komentar Izzy di atas. Kode Anda memberi tahu .NET untuk HANYA menggunakan TLS 1.2 saat menyambungkan ke sumber daya HTTPS. Yaitu jika server hanya memiliki TLS 1.1, kode Anda akan menghentikannya terhubung karena hanya menggunakan TLS 1.2. Anda harus menggunakan | = untuk memberi tahu kode Anda "coba gunakan TLS 1.2 sebagai opsi juga" ketika klien dan server menegosiasikan protokol mana yang akan digunakan.
Don Cheadle
27

jika Anda menggunakan .Net sebelum 4.5 Anda tidak akan memiliki Tls12 dalam enum sehingga status disebutkan secara eksplisit di sini

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
bresleveloper
sumber
17

Tiga langkah yang dibutuhkan:

  1. Tandai secara eksplisit SSL2.0, TLS1.0, TLS1.1 sebagai terlarang di mesin server Anda, dengan menambahkan Enabled=0dan DisabledByDefault=1ke registri Anda (jalur lengkapnya adalah HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols). Lihat layar untuk detailnya registri

  2. Aktifkan secara eksplisit TLS1.2dengan mengikuti langkah-langkah dari 1. Cukup gunakan Enabled=1dan DisabledByDefault=0masing - masing.

CATATAN: verifikasi versi server: Windows Server 2003tidak mendukung TLS 1.2protokol

  1. Aktifkan TLS1.2hanya di level aplikasi, seperti yang disarankan @John Wu di atas.

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

Semoga panduan ini membantu.

UPDATE Seperti yang disebutkan @Subbu: Panduan resmi

Artem
sumber
1
Referensi resmi - technet.microsoft.com/en-us/library/...
Subbu
Hai @ Artem setelah menambahkan tls, apakah saya perlu memulai ulang server?
Simba
@Simba Anda mungkin menyelesaikan ini, tetapi melakukan ini sekarang saya TIDAK perlu memulai ulang server.
Matt N.
5

Bagi saya di bawah ini berhasil:

Langkah 1: Mengunduh dan menginstal exe Penginstal web dari https://www.microsoft.com/en-us/download/details.aspx?id=48137 di server aplikasi. Reboot server aplikasi setelah instalasi selesai.

Langkah 2: Ditambahkan di bawah perubahan di web.config

<system.web>
    <compilation targetFramework="4.6"/> <!-- Changed framework 4.0 to 4.6 -->
    <!--Added this httpRuntime -->
    <httpRuntime targetFramework="4.6" />
</system.web>

Langkah 3: Setelah menyelesaikan langkah 1 dan 2, muncul kesalahan, " WebForms UnobtrusiveValidationMode memerlukan ScriptResourceMapping untuk 'jquery'. Tambahkan ScriptResourceMapping bernama jquery (case-sensitive) " dan untuk mengatasi kesalahan ini, saya menambahkan kunci di bawah ini di appsettings di file web.config saya

<appSettings>
      <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
</appSettings>
KRM
sumber
Menambahkan kerangka target httpRuntime berhasil untuk saya.
Mark Redman
0

PowerBI Embedded membutuhkan TLS 1.2.

Jawaban dari Etienne Faucher di atas adalah solusinya. tautan cepat ke jawaban di atas ... tautan cepat ke jawaban di atas ... ( https://stackoverflow.com/a/45442874 )

PowerBI Memerlukan TLS 1.2 Juni 2020 - Ini Jawaban Anda - Pertimbangkan untuk Memaksa runtime IIS Anda hingga 4.6 untuk memaksa perilaku TLS 1.2 default yang Anda cari dari kerangka kerja. Jawaban di atas memberi Anda solusi hanya perubahan konfigurasi.

Gejala : Koneksi TCP / IP Ditutup Paksa ke Microsoft PowerBI Tertanam yang muncul tiba-tiba di seluruh sistem Anda.

Panggilan PowerBI ini hanya berhenti berfungsi dengan kesalahan Tutup TCP / IP Keras seperti firewall akan memblokir koneksi. Biasanya langkah autentikasi berfungsi - saat Anda menekan layanan untuk ruang kerja tertentu dan melaporkan id yang gagal.

Ini adalah catatan 2020 dari Microsoft PowerBI tentang TLS 1.2 yang diperlukan

PowerBIClient

metode yang menunjukkan masalah ini

GetReportsInGroupAsync GetReportsInGroupAsAdminAsync GetReportsAsync GetReportsAsAdminAsync Microsoft.PowerBI.Api HttpClientHandler Force TLS 1.1 TLS 1.2

Istilah Kesalahan Pencarian untuk membantu orang menemukan ini: System.Net.Http.HttpRequestException: Terjadi kesalahan saat mengirim permintaan System.Net.WebException: Sambungan yang mendasarinya ditutup: Terjadi kesalahan yang tidak terduga saat pengiriman. System.IO.IOException: Tidak dapat membaca data dari koneksi transport: Koneksi yang ada ditutup secara paksa oleh remote host.

Sql Surfer
sumber