Chrome báo cáo ERRinksDY_INADEQUATE_TRANSPORT_SECURITY kết nối với máy chủ web cục bộ qua HTTPS


20

Tóm lược

Chrome đang báo cáo ERR_SPDY_INADEQUATE_TRANSPORT_SECURITYkhi tôi thử và kết nối với máy chủ web cục bộ của mình qua HTTPS. Tôi gần như chắc chắn vấn đề này liên quan đến bản nâng cấp Windows 10 gần đây của tôi, nhưng tôi không biết cách khắc phục.

Những gì đã làm việc

Đây là chuỗi sự kiện, với tôi đã cài đặt Windows 8.1 Pro khi bắt đầu:

  1. Tạo chứng chỉ tự ký dự định sử dụng làm CA gốc đáng tin cậy bằng lệnh sau: makecert.exe -pe -ss Root -sr LocalMachine -n "CN=local, OU=development" -r -a sha512 -e 01/01/2020
  2. Tạo chứng chỉ dành riêng cho ứng dụng từ CA gốc đáng tin cậy: makecert.exe -pe -ss My -sr LocalMachine -n "CN=myapp.local, OU=Development" -is Root -ir LocalMachine -in local -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 -a sha512 -e 01/01/2020 -sky -eku 1.3.6.1.5.5.7.3.1
  3. Đã thêm một HOSTSmục nhập tệp cho myapp.localcác điểm đó vào127.0.0.1
  4. Đã tạo một ứng dụng IIS 8.5 được liên kết với myapp.localmiền và chỉ lắng nghe các yêu cầu HTTPS
  5. Đã gán myapp.localchứng chỉ cho trang web

Với thiết lập này, tôi không gặp khó khăn khi truy cập trang web địa phương của mình từ Chrome mà không có bất kỳ cảnh báo chứng nhận hoặc bảo mật nào. Trình duyệt hiển thị ổ khóa màu xanh lá cây, như mong đợi.

Những gì không làm việc

Gần đây, tôi đã nâng cấp lên Windows 10. Lúc đó tôi không biết rằng Windows 10 có kèm theo IIS 10, hỗ trợ HTTP / 2. Bây giờ, khi tôi thử và truy cập các trang web địa phương của mình bằng Chrome, tôi đã ERR_SPDY_INADEQUATE_TRANSPORT_SECURITYgặp lỗi. Tôi nên lưu ý rằng cùng một yêu cầu được gửi từ Edge không gây ra lỗi và sử dụng HTTP / 2 cho kết nối. Một tìm kiếm đáng chú ý của Google đã không đưa ra bất cứ điều gì hứa hẹn, ngoại trừ gợi ý rằng vấn đề có thể là HTTP / 2 hoặc Chrome nghiêm ngặt về những mật mã mà nó sẽ chấp nhận trong chứng chỉ SSL.

Nghĩ rằng nó có thể là một vấn đề với các bộ mật mã được kích hoạt trong Windows (nhưng không phải là một chuyên gia về những thứ như vậy), tôi đã tải xuống phiên bản mới nhất của IIS Crypto . Tôi đã nhấp vào nút Thực tiễn tốt nhất, nhấp vào Áp dụng và khởi động lại máy của mình.

IIS Crypto báo cáo các cài đặt này là "thực tiễn tốt nhất":

  • Các giao thức được kích hoạt: TLS 1.0, TLS 1.1, TLS 1.2
  • Các mật mã được kích hoạt: Triple DES 168, AES 128/128, AES 256/256
  • Băm kích hoạt: MD5, SHA, SHA 256, SHA 384, SHA 512
  • Trao đổi khóa được kích hoạt: Diffie-Hellman, PKCS, ECDH
  • Thứ tự bộ mật mã SSL:

    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P521
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P521
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P284
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P521
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P284
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P521
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P284
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256
    TLS_RSA_WITH_AES_256_GCM_SHA384
    TLS_RSA_WITH_AES_128_GCM_SHA256
    TLS_RSA_WITH_AES_256_CBC_SHA256
    TLS_RSA_WITH_AES_256_CBC_SHA
    TLS_RSA_WITH_AES_128_CBC_SHA256
    TLS_RSA_WITH_AES_128_CBC_SHA
    TLS_RSA_WITH_3DES_EDE_CBC_SHA

Tôi cũng sẽ thêm rằng ứng dụng trình duyệt tôi đang phát triển không cần sử dụng được từ Windows XP. Tôi biết có một số vấn đề về Windows XP không hỗ trợ các giao thức mới hơn.

Thông tin chi tiết về đàm phán HTTPS

Tôi quyết định sử dụng Fiddler để chặn cuộc đàm phán HTTPS. Đây là những gì Fiddler đã báo cáo về yêu cầu:

Version: 3.3 (TLS/1.2)
Random: 6B 47 6D 2B BC AE 00 F1 1D 41 57 7C 46 DB 35 19 D7 EF A9 2B B1 D0 81 1D 35 0D 75 7E 4C 05 14 B0
"Time": 2/1/1993 9:53:15 AM
SessionID: 98 2F 00 00 15 E7 C5 70 12 70 CD A8 D5 C7 D4 4D ED D8 1F 42 F9 A8 2C E6 67 13 AD C0 47 C1 EA 04
Extensions: 
    server_name myapp.local
    extended_master_secret  empty
    SessionTicket   empty
    signature_algs  sha512_rsa, sha512_ecdsa, sha384_rsa, sha384_ecdsa, sha256_rsa, sha256_ecdsa, sha224_rsa, sha224_ecdsa, sha1_rsa, sha1_ecdsa
    status_request  OCSP - Implicit Responder
    NextProtocolNego    empty
    SignedCertTimestamp (RFC6962)   empty
    ALPN        http/1.1, spdy/3.1, h2-14, h2
    channel_id(GoogleDraft) empty
    ec_point_formats    uncompressed [0x0]
    elliptic_curves secp256r1 [0x17], secp384r1 [0x18]
Ciphers: 
    [C02B]  TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
    [C02F]  TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    [009E]  TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
    [CC14]  TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
    [CC13]  TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
    [CC15]  TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256
    [C00A]  TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
    [C014]  TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA
    [0039]  TLS_DHE_RSA_WITH_AES_256_SHA
    [C009]  TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
    [C013]  TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA
    [0033]  TLS_DHE_RSA_WITH_AES_128_SHA
    [009C]  TLS_RSA_WITH_AES_128_GCM_SHA256
    [0035]  TLS_RSA_AES_256_SHA
    [002F]  TLS_RSA_AES_128_SHA
    [000A]  SSL_RSA_WITH_3DES_EDE_SHA
    [00FF]  TLS_EMPTY_RENEGOTIATION_INFO_SCSV

Compression: 
    [00]    NO_COMPRESSION

và câu trả lời:

Version: 3.3 (TLS/1.2)
SessionID:  98 2F 00 00 15 E7 C5 70 12 70 CD A8 D5 C7 D4 4D ED D8 1F 42 F9 A8 2C E6 67 13 AD C0 47 C1 EA 04
Random:     55 C6 8D BF 78 72 88 41 34 BD B4 B8 DA ED D3 C6 20 5C 46 D6 5A 81 BD 6B FC 36 23 0B 15 21 5C F6
Cipher:     TLS_RSA_WITH_AES_128_GCM_SHA256 [0x009C]
CompressionSuite:   NO_COMPRESSION [0x00]
Extensions:
        ALPN        h2
        0x0017      empty
        renegotiation_info  00
        server_name empty

Làm việc gì

Dựa trên câu trả lời của Håkan Lindqvist và câu trả lời được nghiên cứu rất chi tiết và rõ ràng ở đây , tôi đã cấu hình lại IIS Crypto với các cài đặt sau, loại bỏ lỗi Chrome:

  • Các giao thức được kích hoạt: TLS 1.0, TLS 2.0, TLS 3.0
  • Mật mã được bật: AES 128/128, AES 256/256
  • Băm kích hoạt: SHA, SHA 256, SHA 384, SHA 512
  • Trao đổi khóa được kích hoạt: Diffie-Hellman, PKCS, ECDH
  • Thứ tự bộ mật mã SSL:

    TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
    TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
    TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P521
    TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384_P384
    TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P521
    TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P384
    TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_P256
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P521
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384_P384
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P521
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P384
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256_P256
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P521
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P384
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA_P256
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P521
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P384
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA_P256
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P521
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P521
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P384
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P521
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P256
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P521
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P384
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA_P256
    TLS_RSA_WITH_AES_256_GCM_SHA384
    TLS_RSA_WITH_AES_128_GCM_SHA256
    TLS_RSA_WITH_AES_256_CBC_SHA256
    TLS_RSA_WITH_AES_128_CBC_SHA256
    TLS_RSA_WITH_AES_256_CBC_SHA
    TLS_RSA_WITH_AES_128_CBC_SHA


Trước khi bất cứ ai chỉ ra điều hiển nhiên: Có, tôi nhận thức makecert.exeđược sự phản đối. Tôi chỉ sử dụng nó cho các tình huống phát triển như thế này vì đây là tùy chọn dễ nhất mà [đã từng sử dụng?] Hoạt động.
NathanAldenSr

Trước đó không phải là mật mã mà là phiên bản ssl / tls được kích hoạt. Bạn đã kích hoạt tls v1.0 hoặc thấp hơn chưa?
Drifter104

Tôi đã cập nhật câu hỏi để bao gồm những gì tôi đã làm với IIS Crypto để kiểm soát các cài đặt đó. Bạn có biết nếu cài đặt quá cho phép đối với HTTP / 2 và Chrome không?
NathanAldenSr

stackoverflow.com/questions/31746620/ có thể giúp đỡ. Rõ ràng việc vô hiệu hóa spdy trong trình duyệt là cách tốt nhất
Drifter104 8/8/2015

1
IIS Crypto "Thực tiễn tốt nhất" trong phiên bản 2.0 đã sửa lỗi này cho tôi. Tôi đã thử sử dụng thứ tự bộ bạn chỉ định nhưng không có hiệu lực. Rõ ràng nó đã được sửa trong Windows hoặc IIS Crypto ở đâu đó trên đường đi. :)
ahwm

Câu trả lời:


21

Yêu cầu http / 2 theo https://http2.github.io/http2-spec/#rfc.section.9.2.2 :

9.2.2 Bộ mã hóa TLS 1.2

Việc triển khai HTTP / 2 qua TLS 1.2 KHÔNG NÊN sử dụng bất kỳ bộ mật mã nào được liệt kê trong danh sách đen của bộ mật mã ( Phụ lục A ).

Điểm cuối CÓ THỂ chọn tạo lỗi kết nối (Mục 5.4.1) loại INADEQUATE_SECURITY nếu một trong các bộ mật mã từ danh sách đen được đàm phán. Việc triển khai chọn sử dụng bộ mật mã được liệt kê đen có nguy cơ gây ra lỗi kết nối trừ khi tập hợp các đồng nghiệp tiềm năng được biết là chấp nhận bộ mật mã đó.

Việc triển khai PHẢI KHÔNG tạo ra lỗi này để phản ứng lại việc đàm phán một bộ mật mã không có trong danh sách đen. Do đó, khi khách hàng cung cấp một bộ mật mã không có trong danh sách đen, họ phải chuẩn bị để sử dụng bộ mật mã đó với HTTP / 2.

Danh sách đen bao gồm bộ mật mã mà TLS 1.2 đưa ra bắt buộc, điều đó có nghĩa là việc triển khai TLS 1.2 có thể có các bộ mật mã được phép không giao nhau. Để tránh sự cố này gây ra lỗi bắt tay TLS, việc triển khai HTTP / 2 sử dụng TLS 1.2 PHẢI hỗ trợ TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 [TLS-ECDHE] với đường cong elip P-256 [ERIC186].

Lưu ý rằng khách hàng có thể quảng cáo hỗ trợ các bộ mật mã nằm trong danh sách đen để cho phép kết nối với các máy chủ không hỗ trợ HTTP / 2. Điều này cho phép các máy chủ chọn HTTP / 1.1 với bộ mật mã nằm trong danh sách đen HTTP / 2. Tuy nhiên, điều này có thể dẫn đến việc HTTP / 2 được đàm phán với bộ mật mã được liệt kê màu đen nếu giao thức ứng dụng và bộ mật mã được chọn độc lập.


Mật mã TLS_RSA_WITH_AES_128_GCM_SHA256được đàm phán của bạn nằm trong danh sách đen http / 2 được đề cập ở trên (và được liên kết).

Tôi tin rằng bạn sẽ muốn điều chỉnh bộ mật mã của mình (đặt hàng?) Để đáp ứng các yêu cầu trên. Có thể chỉ đơn giản là đặt đường cong elip TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256NIST P-256(được xác định là TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256_P256trên Windows) ở đầu danh sách hoặc ít nhất là trước mọi thứ có trong danh sách đen?


Tôi sẽ thử điều này ngay lập tức và cho bạn biết nó diễn ra như thế nào. Cảm ơn các câu trả lời chi tiết! :) Thành thật mà nói, có vẻ như sự cố bộ mật mã này có thể khiến việc sử dụng HTTP / 2 cùng lúc với HTTP / 1.1 thực sự khó khăn, nếu không nói là không thể, cho đến khi các trình duyệt được đảm bảo hoạt động xung quanh sự không nhất quán. IPv4 / IPv6, có ai không?
NathanAldenSr

Tôi đã so sánh danh sách bộ mật mã "thực tiễn tốt nhất" của IIS Crypto với danh sách đen. Những gì tôi tìm thấy là tất cả các bộ TLS_RSAmật mã thực hành tốt nhất đều nằm trong danh sách đen. Tôi vô hiệu hóa tất cả và khởi động lại. Tuy nhiên, bây giờ tôi không thể thiết lập kết nối an toàn đến trang web địa phương của mình với bất kỳ trình duyệt nào . Tôi chỉ nhận được ERR_CONNECTION_RESET. Điều này có thể có bất cứ điều gì để làm với các chứng chỉ?
NathanAldenSr

@NathanAldenSr Tôi không nghĩ bạn cần xóa các mật mã được liệt kê trong danh sách đen (chúng có thể hữu ích cho các mục đích tương thích cho các máy khách HTTP / 1.x) miễn là các mật mã không có trong danh sách đen có mức độ ưu tiên cao hơn. Cụ thể, một đề cập rằng tất cả các triển khai HTTP / 2 PHẢI hỗ trợ ( TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256).
Håkan Lindqvist

1
Cảm ơn bạn đã bắt đầu. Tôi đã cập nhật câu trả lời của mình để cho thấy những gì làm việc cho tôi.
NathanAldenSr

1
Lưu ý, thông số HTTP / 2 cho biết đó là TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 với đường cong elip P-256 [ERIC186], nghĩa là chuỗi: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256_P256cho Windows.
Bart Verkoeijen

2

Đây là một số PowerShell tôi đã tạo để tắt tạm thời HTTP / 2 trong IIS:

Set-ItemProperty -Path HKLM:\System\CurrentControlSet\Services\HTTP\Parameters -Name EnableHttp2Tls -Value 0 -Type DWord
Set-ItemProperty -Path HKLM:\System\CurrentControlSet\Services\HTTP\Parameters -Name EnableHttp2Cleartext -Value 0 -Type DWord

Tôi đang đưa ra câu trả lời vì vô hiệu hóa HTTP / 2 dường như là "giải pháp" duy nhất cho vấn đề. Mặc dù vậy, tôi sẽ không chấp nhận điều đó vì tôi thực sự muốn sử dụng HTTP / 2 trong IIS 10 một cách đáng tin cậy với tất cả các trình duyệt.


Điều chỉnh bộ mật mã của bạn (có thể chỉ là thứ tự) để đáp ứng thông số kỹ thuật http / 2 sẽ giải quyết vấn đề chính xác. (Xem câu trả lời riêng)
Håkan Lindqvist

3
Có vẻ như bạn phải khởi động lại Windows để những thay đổi này có hiệu lực. Chỉ gọi iisresetkhông làm cho tôi lừa.
Sebastian Krysmanski

-1

Chỉ cần nhận được chứng chỉ từ một CA thích hợp, có những chứng chỉ miễn phí ( StartSSL ) và không mất nhiều thời gian hơn để có được một chứng chỉ.

Khi sử dụng chứng chỉ phù hợp, tôi không gặp vấn đề gì với việc sử dụng IIS 10 trên Windows 10 và HTTP / 2 với Chrome.


1
Điều này sẽ không làm việc cho tôi, thật không may. Tôi có các tập lệnh tự động tạo các chứng chỉ này cho cả môi trường cục bộ và môi trường phát triển và mọi máy trạm của nhà phát triển đều cần chúng. Ngoài ra, tôi muốn sự linh hoạt để có thể thay đổi tên máy chủ mà không cần phải quay lại bên thứ ba để nhận chứng chỉ mới.
NathanAldenSr

@NathanAldenSr - Tôi hiểu. Đối với một quy trình hoàn chỉnh theo kịch bản, chúng tôi đang sử dụng một CA nội bộ cục bộ. Sẽ thật tuyệt khi biết liệu các makecert.execerts tự tạo có phải là vấn đề hay không. Tôi chưa bao giờ sử dụng makecert.exe, tôi luôn nghĩ rằng một CA cục bộ là một giải pháp sạch hơn nhiều.
Peter Hahndorf
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.