Cập nhật dịch vụ web .NET để sử dụng TLS 1.2


99

Tôi cần sử dụng TLS 1.2 để kết nối từ dịch vụ web .NET của mình với một dịch vụ web khác sẽ buộc TLS 1.2. Tôi đã tìm thấy một tài nguyên cho biết .NET 4.6 sử dụng TLS 1.2 theo mặc định nên đó có vẻ là giải pháp dễ dàng nhất. Tôi đã cập nhật khuôn khổ .NET trên máy chủ và khởi động lại. Trong IIS, tôi đã cố gắng tạo một nhóm ứng dụng bằng .NET 4.6 nhưng 4.0 là lựa chọn duy nhất. Sau đó, tôi tìm thấy một cái gì đó cho biết nó vẫn sẽ nói là 4.0 vì 4.6 là bản cập nhật "tại chỗ" cho .NET 4.0. Vì vậy, tôi nghĩ có lẽ tôi đã làm xong. Tuy nhiên, trên một trang báo lỗi mà tôi gặp phải vì những lý do không liên quan, nó cho biết Microsoft .NET Framework Version:4.0.30319có vẻ như tôi đã không nâng cấp thành công. Bất kỳ hướng dẫn nào về cách đảm bảo nhóm ứng dụng của tôi đang sử dụng .NET 4.6 hoặc nói chung là cách bật TLS 1.2?


4
Tôi tin rằng TLS12 phải được bật trên máy chủ. support.quovadisglobal.com/kb/a433/…
lcryder

4
Tại sao lại phản đối?
nasch

Câu trả lời:


140

Chúng tôi thực sự vừa nâng cấp dịch vụ web .NET lên 4.6 để cho phép TLS 1.2.

Những gì Artem đang nói là những bước đầu tiên chúng tôi đã thực hiện. Chúng tôi đã biên dịch lại khung của dịch vụ web thành 4.6 và chúng tôi đã thử thay đổi khóa đăng ký để kích hoạt TLS 1.2, mặc dù điều này không hoạt động: kết nối vẫn ở trong TLS 1.0. Ngoài ra, chúng tôi không muốn không cho phép SLL 3.0, TLS 1.0 hoặc TLS 1.1 trên máy: các dịch vụ web khác có thể đang sử dụng điều này; chúng tôi đã khôi phục các thay đổi của mình trên sổ đăng ký.

Chúng tôi thực sự đã thay đổi tệp Web.Config để nói với IIS: "này, làm ơn chạy tôi trong 4.6".

Đây là những thay đổi chúng tôi đã thêm trong bản biên dịch web.config + trong .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>

Và kết nối đã thay đổi thành TLS 1.2, vì IIS hiện đang chạy dịch vụ web trong 4.6 (được thông báo rõ ràng) và 4.6 đang sử dụng TLS 1.2 theo mặc định.


3
Dưới đây là những tài liệu chúng tôi sử dụng để nghiên cứu: httpRuntime , RenderingCompatibility
Etienne Faucher

1
Tôi đã tìm ra - tôi không yêu cầu HTTPS. Sau khi tôi sửa nó, nó đã hoạt động.
nasch

3
Thay đổi biên dịch thành 4.6 và thêm httpRuntime 4.6 là đủ trong trường hợp của chúng tôi, cảm ơn vì giải pháp!
krilovich

2
Đây hoàn toàn là câu trả lời đúng. Chỉ mới trải qua điều này gần đây. Dưới đây là một bài viết trên blog về nó: blog.thelevelup.com/pci-security-is-your-restaurant-ready và một dự án GitHub mà thực hiện điều này: github.com/TheLevelUp/pos-tls-patcher
user24601


88

Thêm mã sau trước khi bạn khởi tạo ứng dụng khách dịch vụ web của mình:

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

Hoặc để tương thích ngược với TLS 1.1 trở về trước:

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

2
Vâng, tôi đã làm điều đó, nhưng thông báo lỗi vẫn cho biết .NET 4.0.
nasch

12
Đó là phiên bản CLR của bạn. .Net CLR có hai phiên bản, 2.0 và 4.0. Trong IIS, bạn chỉ định phiên bản CLR, không phải phiên bản Framework. IIS sẽ không cho bạn biết .Net 4.6 vì nó không quan tâm đến điều đó. Nếu bạn biên dịch bằng 4.6, thì bạn đang sử dụng 4.6.
Amy

2
TLS 1.2 được hỗ trợ từ .NET 4.5 trở đi
Gilberto Alexandre

5
Trong trường hợp này, | = cao hơn chỉ =. Chúng là cờ nhị phân, không ghi đè lên mọi thứ khác một cách không cần thiết.
Izzy

2
@JohnWu - hãy lưu ý nhận xét của Izzy ở trên. Mã của bạn yêu cầu .NET CHỈ sử dụng TLS 1.2 một cách rõ ràng khi kết nối với tài nguyên HTTPS. Tức là nếu một máy chủ chỉ có TLS 1.1, mã của bạn sẽ ngăn nó kết nối vì nó chỉ sử dụng TLS 1.2. Bạn nên sử dụng | = để cho mã của mình biết "hãy thử sử dụng TLS 1.2 cũng như một tùy chọn" khi máy khách và máy chủ thương lượng giao thức nào sẽ sử dụng.
Don Cheadle

27

nếu bạn đang sử dụng .Net sớm hơn 4.5, bạn sẽ không có Tls12 trong enum nên trạng thái được đề cập rõ ràng ở đây

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

17

Ba bước cần thiết:

  1. Đánh dấu rõ ràng SSL2.0, TLS1.0, TLS1.1 là bị cấm trên máy chủ của bạn, bằng cách thêm Enabled=0DisabledByDefault=1vào sổ đăng ký của bạn (đường dẫn đầy đủ là HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols). Xem màn hình để biết chi tiết đăng ký

  2. Bật rõ ràng TLS1.2bằng cách làm theo các bước từ 1. Chỉ sử dụng Enabled=1DisabledByDefault=0tương ứng.

LƯU Ý: xác minh phiên bản máy chủ: Windows Server 2003không hỗ trợ TLS 1.2giao thức

  1. Kích hoạt tính năng TLS1.2chỉ vào mức độ ứng dụng, như @ John Wu gợi ý ở trên.

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

Hy vọng hướng dẫn này sẽ giúp.

CẬP NHẬT Như @Subbu đã đề cập: Hướng dẫn chính thức


1
Tham khảo chính thức - technet.microsoft.com/en-us/library/…
Subbu

Xin chào @Artem sau khi thêm tls, tôi có cần khởi động lại máy chủ không?
Simba

@Simba có thể bạn đã giải quyết được vấn đề này, nhưng thực hiện việc này ngay bây giờ tôi KHÔNG cần khởi động lại máy chủ.
Matt N.

5

Đối với tôi dưới đây đã hoạt động:

Bước 1: Tải xuống và cài đặt Trình cài đặt web exe từ https://www.microsoft.com/en-us/download/details.aspx?id=48137 trên máy chủ ứng dụng. Khởi động lại máy chủ ứng dụng sau khi cài đặt xong.

Bước 2: Đã thêm các thay đổi bên dưới trong web.config

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

Bước 3: "Sau khi hoàn thành bước 1 và 2, nó đã cho một lỗi, . WebForms UnobtrusiveValidationMode đòi hỏi một ScriptResourceMapping cho 'jquery' Xin thêm một ScriptResourceMapping tên jquery (case-sensitive) " và để khắc phục lỗi này, tôi đã thêm dưới đây chủ chốt trong appSettings trong tệp web.config của tôi

<appSettings>
      <add key="ValidationSettings:UnobtrusiveValidationMode" value="None" />
</appSettings>

Việc thêm khung đích httpRuntime phù hợp với tôi.
Mark Redman

0

PowerBI Embedded yêu cầu TLS 1.2.

Câu trả lời trên của Etienne Faucher là giải pháp cho bạn. liên kết nhanh đến câu trả lời trên ... liên kết nhanh đến câu trả lời trên ... ( https://stackoverflow.com/a/45442874 )

PowerBI Yêu cầu TLS 1.2 Tháng 6 năm 2020 - Đây là câu trả lời của bạn - Hãy cân nhắc Buộc thời gian chạy IIS của bạn lên đến 4.6 để buộc hành vi TLS 1.2 mặc định mà bạn đang tìm kiếm từ khuôn khổ. Câu trả lời trên cung cấp cho bạn một giải pháp chỉ thay đổi cấu hình.

Hiện tượng : Buộc đóng Kết nối TCP / IP bị từ chối với Microsoft PowerBI Embedded chỉ hiển thị đột ngột trên hệ thống của bạn.

Các cuộc gọi PowerBI này chỉ ngừng hoạt động với lỗi Đóng TCP / IP Cứng giống như tường lửa sẽ chặn kết nối. Thông thường, các bước xác thực hoạt động - đó là khi bạn nhấn dịch vụ cho không gian làm việc cụ thể và báo cáo id là nó không thành công.

Đây là ghi chú năm 2020 từ Microsoft PowerBI về yêu cầu TLS 1.2

PowerBIClient

phương pháp cho thấy vấn đề này

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

Lỗi Tìm kiếm Thuật ngữ để giúp mọi người tìm thấy điều này: System.Net.Http.HttpRequestException: Đã xảy ra lỗi khi gửi yêu cầu System.Net.WebException: Kết nối cơ bản đã bị đóng: Đã xảy ra lỗi không mong muốn khi gửi. System.IO.IOException: Không thể đọc dữ liệu từ kết nối truyền tải: Một kết nối hiện có đã bị buộc đóng bởi máy chủ từ xa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.