Chứng chỉ SSL SNI và ký tự đại diện trên cùng một máy chủ với IIS


12

Tôi muốn lưu trữ một trang web nên lắng nghe các tên miền phụ (ví dụ: sub.domain.com) cùng với nhiều trang web sống dưới một tên miền cấp hai (ví dụ: domain2.com, domain3.com) với IIS và với SSL.

Đối với trang web có tên miền phụ, tôi có chứng chỉ ký tự đại diện (* .domain.com) và tôi cũng có chứng chỉ dành riêng cho các trang web khác (domain2.com và domain3.com).

Thiết lập như vậy có thể được lưu trữ trên cùng một IIS (nếu có vấn đề, trong vai trò web của Azure Cloud Service)?

Vấn đề chính xác là những gì Titobf đã giải thích ở đây : về mặt lý thuyết, chúng tôi cần các ràng buộc bằng SNI, với máy chủ được chỉ định cho domain2 / 3.com và sau đó là một trang web bắt tất cả với * host cho * .domain.com. Nhưng trong thực tế, bất kể các ràng buộc được thiết lập như thế nào nếu trang web bắt tất cả cũng sẽ nhận được tất cả các yêu cầu đến domain2 / 3.com (mặc dù được cho là chỉ phù hợp như là phương sách cuối cùng).

Bất kỳ trợ giúp sẽ được đánh giá cao.

Vẫn chưa giải quyết

Thật không may, tôi không thể giải quyết vấn đề này: dường như chỉ có thể giải quyết được bằng những cách cực kỳ phức tạp, như tạo một phần mềm nằm giữa IIS và internet (về cơ bản là tường lửa) và sửa đổi các yêu cầu đến (trước khi bắt tay SSL! ) để cho phép kịch bản. Tôi khá tự tin rằng điều này là không thể với IIS, bất kể là gì, thậm chí từ mô-đun gốc.

Tôi phải làm rõ: chúng tôi sử dụng Azure Cloud Services, vì vậy chúng tôi có một hạn chế hơn nữa là chúng tôi không thể sử dụng nhiều địa chỉ IP (xem: http://feedback.azure.com/forums/169386-cloud-service-web-and -worker-vai trò / đề xuất / 1259311-nhiều-ssl-và-domain-to-one-app ). Nếu bạn có thể trỏ nhiều IP đến máy chủ của mình thì bạn không gặp phải vấn đề này vì bạn cũng có thể tạo các ràng buộc cho IP và chúng sẽ hoạt động cùng với các ràng buộc ký tự đại diện. Cụ thể hơn, bạn cần một IP cho trang web ký tự đại diện (nhưng vì giờ bạn đã có một IP riêng nên bạn sẽ không phải định cấu hình ràng buộc tên máy chủ ký tự đại diện) và một IP khác cho tất cả các trang không phải ký tự đại diện khác.

Trên thực tế, cách giải quyết của chúng tôi là việc sử dụng cổng SSL không chuẩn, 8443. Vì vậy, ràng buộc SNI thực sự bị ràng buộc với cổng này, do đó nó hoạt động cùng với các ràng buộc khác. Không đẹp, nhưng một cách giải quyết có thể chấp nhận được đối với chúng tôi cho đến khi bạn có thể sử dụng nhiều IP cho các vai trò web.

Các ràng buộc không làm việc bây giờ

Liên kết https đầu tiên là SNI với chứng chỉ đơn giản, thứ hai không phải là SNI, với chứng chỉ ký tự đại diện.

Trang web http hoạt động, cũng như trang web SNI https, nhưng trang web có ràng buộc ký tự đại diện cho "Lỗi HTTP 503. Dịch vụ không khả dụng." (không có thêm thông tin, không có mục Yêu cầu theo dõi hoặc Nhật ký sự kiện không thành công). Ràng buộc

Cuối cùng, làm cho nó cơ bản hoạt động

Kích hoạt nhật ký theo dõi ETW như Tobias mô tả cho thấy lỗi gốc là như sau:

Yêu cầu (ID yêu cầu 0xF500000080000008) bị từ chối vì lý do: UrlgroupLookupFails.

Theo tôi hiểu điều này có nghĩa là http.sys không thể định tuyến yêu cầu đến bất kỳ điểm cuối có sẵn nào.

Kiểm tra các điểm cuối đã đăng ký netsh http show urlaclcho thấy thực sự đã có thứ gì đó được đăng ký cho cổng 443:

Reserved URL            : https://IP:443/
    User: NT AUTHORITY\NETWORK SERVICE
        Listen: Yes
        Delegate: No
        SDDL: D:(A;;GX;;;NS)

Loại bỏ điều này netsh http delete urlacl url=https://IP:443/cuối cùng đã kích hoạt ràng buộc SSL của tôi.


Bạn hoàn toàn có thể thực hiện việc này trên IIS bằng SNI mà không cần dùng đến nhiều IP hoặc cổng không chuẩn.
Joe Snerman

Bạn có nghĩa là IIS nên hỗ trợ này? Tôi đồng ý :-).
Piedone

Tôi hoàn toàn đồng ý với bạn, Piedone. Tôi thực sự thất vọng vì IIS (hay chính xác hơn là http.sys) KHÔNG hỗ trợ kết hợp chứng chỉ ký tự đại diện làm chứng chỉ SSL mặc định và nhiều chứng chỉ cụ thể với SNI AS EXPECTED. Vấn đề được biết đến từ năm 2012 như bạn có thể thấy ở đây: forum.iis.net/t/1192170.aspx . Tôi vừa viết một email cho Microsoft và hy vọng sẽ sớm nhận được phản hồi.
Tobias J.

Cảm ơn Tobias. Vui lòng quay lại đây khi Microsoft trả lời.
Piedone

2
Có lẽ http.sys đang từ chối yêu cầu để không có Yêu cầu thất bại nào được đăng nhập vào IIS. Tạo nhật ký theo dõi http.sys ETW: 1) bắt đầu nhật ký theo dõi. chạy: logman start httptrace -p Microsoft-Windows-HttpService 0xFFFF -o httptrace.etl -ets2) làm yêu cầu 503 3) dừng nhật ký theo dõi. chạy: logman stop httptrace -ets4) ghi nhật ký theo dõi vào tập tin. chạy: tracerpt.exe httptrace.etl -of XML -o httptrace.xml5) kiểm tra lý do 503 trong tệp xml và đăng nó ở đây.
Tobias J.

Câu trả lời:


6

Baris nói đúng! Chứng chỉ SSL được định cấu hình trên ràng buộc IP: PORT (ví dụ: 100.74.156.187:443) luôn được ưu tiên trong http.sys! Vì vậy, giải pháp như sau:

Không định cấu hình ràng buộc IP: 443 cho chứng chỉ ký tự đại diện của bạn nhưng cấu hình ràng buộc *: 443 (* có nghĩa là "Tất cả chưa được gán") cho nó .

Nếu bạn đã định cấu hình chứng chỉ ký tự đại diện của mình trên điểm cuối SSL của Dịch vụ đám mây Azure (như tôi có), bạn phải thay đổi liên kết SSL được tạo bởi Thời gian chạy dịch vụ đám mây Azure (IISconfigurator.exe) từ IP: PORT thành *: PORT. Tôi đang gọi phương thức sau trong OnStart về vai trò web của mình:

public static void UnbindDefaultSslBindingFromIp()
{
    Trace.TraceInformation(">> IISTenantManager: Unbind default SSL binding from IP");
    using (var serverManager = new Microsoft.Web.Administration.ServerManager())
    {
        try
        {
            var websiteName = string.Format("{0}_Web", Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.CurrentRoleInstance.Id);
            var site = serverManager.Sites[websiteName];
            var defaultSslBinding = site.Bindings.Single(b => b.IsIPPortHostBinding && b.Protocol == "https");
            defaultSslBinding.BindingInformation = string.Format("*:{0}:", defaultSslBinding.EndPoint.Port);
            serverManager.CommitChanges();
        }
        catch (Exception ex)
        {
            Trace.TraceError(ex.ToString());
        }
    }
}

Ảnh chụp màn hình sau đây cho thấy cấu hình hoạt động của dịch vụ đám mây của chúng tôi. Xin đừng nhầm lẫn về các cổng không chuẩn. Ảnh chụp màn hình là từ dịch vụ đám mây giả lập.

cấu hình IIS làm việc

Một điều nữa cần đề cập: Không thay đổi tất cả các ràng buộc thành * vì liên kết HTTP (cổng 80) chỉ hoạt động với ràng buộc IP: PORT trong dịch vụ đám mây được triển khai. Một cái gì đó khác được liên kết với IP: 80 vì vậy *: 80 không hoạt động vì * là viết tắt của "tất cả chưa được gán" và IP đã được gán ở một nơi khác trong http.sys.


Cảm ơn câu trả lời chi tiết của bạn. Tôi đã cập nhật câu hỏi của mình: như tôi nhớ bây giờ có lẽ tôi đã không đi với thiết lập này vì tôi đã gặp lỗi tương tự như bây giờ.
Piedone

4

Đảm bảo rằng ràng buộc bắt tất cả của bạn không phải là loại IP: Cổng. Khi IP: Liên kết cổng tồn tại đối với liên kết HTTPS trong khi SNI không bắt buộc, ràng buộc đó sẽ luôn được ưu tiên. Đối với trường hợp bắt tất cả của bạn, hãy sử dụng ràng buộc *: Cổng (* là tất cả chưa được gán).


Cảm ơn, nhưng như bạn có thể thấy trong mô tả của mình, ban đầu tôi đã cố gắng thiết lập liên kết SNI không có cổng, nhưng vì nó không hoạt động nên tôi đã kết thúc bằng một ràng buộc cổng tùy chỉnh.
Piedone

Theo cổng, tôi hiểu rằng bạn có nghĩa là IP. Bạn không thể có một ràng buộc mà không có một cổng. Inetmgr sẽ không cho phép nó. Đối với các ràng buộc SNI, bạn có thể sử dụng IP cụ thể hoặc "Tất cả chưa được gán" và kết quả sẽ giống nhau. Đó là ràng buộc Catch All, mà bạn có chứng chỉ ký tự đại diện, cần phải có "Tất cả chưa được gán" và không phải trên một IP cụ thể.
bariscaglar

Tôi có nghĩa là cổng nhưng tôi muốn nói "cổng không chuẩn". IP không được chỉ định, như bạn nói và nó vẫn không hoạt động, cũng thấy liên kết của Tobias. Có hai cách để khắc phục hạn chế này của IIS: sử dụng cổng tùy chỉnh hoặc IP khác với các ràng buộc khác: trên các dịch vụ đám mây Azure không có sẵn vì vậy chúng tôi đã sử dụng cổng tùy chỉnh.
Piedone

bariscaglar là nhà phát triển Microsoft (làm việc trên IIS) Tôi đã có một cuộc trò chuyện rất hay và hữu ích với! Thx Baris! Chúng tôi đã cùng nhau phân tích hành vi và chúng tôi đi đến kết luận rằng hành vi được mô tả là hành vi mong muốn của http.sys. Nhưng có một cách giải quyết tốt đẹp. Xem câu trả lời của tôi để biết chi tiết.
Tobias J.

Chỉ cần một lưu ý cho bất kỳ ai đọc, gần đây tôi đã phát hiện ra rằng nếu bạn sử dụng Cổng thông tin Azure để định cấu hình dịch vụ cho Remote Desktop (hoặc thay đổi cấu hình chứng chỉ), nó có thể tự động tạo ra một ràng buộc IP: Cổng bị phá vỡ và phá vỡ tất cả SNI của bạn . Tôi không có giải pháp cho vấn đề cụ thể đó. Nó xảy ra sau RoleEn Môi trường. Thay đổi để tôi không thể bắt gặp nó trong WebRole.cs.
Mike

1

IIS không hỗ trợ SNI, ngay cả trong các vai trò web của dịch vụ đám mây màu xanh lam mặc dù bạn không thể truy cập cấu hình qua cổng và nếu bạn thực hiện trên hộp sau khi triển khai, nó sẽ bị xóa bằng triển khai tiếp theo của bạn. Giải pháp là tự động hóa cấu hình. Có một cái nhìn ở đây để biết chi tiết:

http://www.vic.ms/microsoft/windows-azure/multiples-ssl-certert-on-windows-azure-cloud-service/


Cảm ơn, nhưng như tôi đã giải thích, không có vấn đề gì với chính SNI (tôi đang sử dụng nó) mà là cách kết hợp tên máy chủ ký tự đại diện hoạt động trong IIS.
Piedone

Bài viết này không còn tồn tại, nhưng đây là trên Lưu trữ web: web.archive.org/web/20151020041907/http://www.vic.ms/microsoft/ Lỗi
Mike
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.