Triển khai tính năng ghim khoá công khai bằng tính năng báo cáo HPKP

Emily Stark

Việc sử dụng SSL trên trang web của bạn là một cách quan trọng để bảo vệ tính bảo mật và quyền riêng tư cho người dùng của bạn. Nhưng bật SSL chưa phải là tất cả: có nhiều bước bạn có thể thực hiện để tăng cường hơn nữa khả năng bảo mật mà trang web của bạn cung cấp, từ việc đặt thuộc tính Secure (Bảo mật) trên cookie, bật HTTP Strict Transport Security đến sử dụng Chính sách bảo mật nội dung để khoá đặc quyền trang web của bạn. Tuy nhiên, việc triển khai các tính năng mạnh mẽ này đôi khi có thể khó khăn. Để giúp bạn triển khai một hình thức SSL nghiêm ngặt hơn, Chrome 46 cung cấp một tính năng có tên là báo cáo HPKP.

Tất cả các từ viết tắt này có nghĩa là gì?

Bảo mật trên web hiện nay phụ thuộc vào chứng chỉ SSL: chữ ký mã hoá chứng minh rằng trang web nói lên danh tính. Khi trình duyệt của bạn gửi yêu cầu đến một URL như https://developers.google.com, máy chủ sẽ cung cấp chứng chỉ SSL và nếu chứng chỉ hợp lệ, trình duyệt sẽ cho phép yêu cầu tiếp tục và hiển thị URL của trang web với ổ khóa màu xanh lục trên thanh địa chỉ.

Tuy nhiên, chứng chỉ hợp lệ là gì? Để được coi là hợp lệ, chứng chỉ phải có chữ ký của một tổ chức phát hành chứng chỉ (CA) hoặc bằng một chứng chỉ khác do một CA (được gọi là CA trung gian) ký. Các trình duyệt và hệ điều hành đi kèm một danh sách gồm hàng trăm CA được tin cậy để cấp chứng chỉ. Tuy nhiên, vấn đề là theo mặc định, bất kỳ CA nào trong số này đều có thể cấp chứng chỉ cho bất kỳ trang web nào. Nếu bất kỳ ứng dụng nào trong số này bị xâm phạm hoặc hoạt động không đúng cách, thì điều đó có thể gây thiệt hại cho toàn bộ web.

Nhập mã PIN công khai HTTP (HTTPKP). Tiêu chuẩn này cho phép các trang web gửi tiêu đề HTTP để hướng dẫn trình duyệt ghi nhớ (hoặc "ghim") các phần trong chuỗi chứng chỉ SSL của trình duyệt. Trình duyệt sẽ từ chối các kết nối tiếp theo không khớp với các ghim mà trình duyệt đã nhận trước đó. Dưới đây là ví dụ về tiêu đề HPKP:

Public-Key-Pins:  
       pin-sha256="d6qzRu9zOECb90Uez27xWltNsj0e1Md7GkYYkVoZWmM=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
       max-age=259200

Tiêu đề này chỉ định hai hàm băm chứng chỉ làm ghim. Một hàm băm của chứng chỉ trong chuỗi chứng chỉ của trang web và hàm còn lại là mã pin dự phòng hoặc hàm băm của chứng chỉ mà trang web có thể sử dụng trong trường hợp cần xoay vòng chứng chỉ. Tiêu đề cũng bao gồm giá trị max-age. Sau khi số giây đó trôi qua, trình duyệt sẽ quên mã PIN.

Để biết thêm về HPKP nói chung, hãy xem thông số kỹ thuật hoặc xem bài đăng trên blog rất xuất sắc của nhà phát triển Chrome Chris Palmer.

Tôi có nên bật HPKP ngay bây giờ không?

Không cần thiết. Khi bạn triển khai HPKP, bạn rất dễ mắc lỗi và vô tình thực hiện thay đổi cho trang web của mình. Nếu bạn ghim trang web của mình vào một bộ chứng chỉ rồi sau đó phải triển khai một bộ chứng chỉ mới, người dùng đã thấy ghim đó sẽ không thể truy cập vào trang web của bạn cho đến khi ghim hết hạn (dựa trên giá trị max-age trong tiêu đề).

Bởi vì khó để chính xác, nên hiện nay HPKP chủ yếu được một số trang web quan trọng và nhạy cảm về bảo mật sử dụng. Nếu quyết định bật HPKP, bạn nên bắt đầu với một giá trị độ tuổi tối đa rất ngắn rồi tăng dần nếu không gặp vấn đề gì.

Báo cáo HPKP là gì và giúp ích như thế nào?

Báo cáo HPKP, thông tin vận chuyển trong Chrome 46, là tính năng mà bạn có thể sử dụng để phát hiện cấu hình sai khi triển khai HPKP.

Trước tiên, bạn có thể bắt đầu bằng cách gửi tiêu đề Public-Key-Pins-Report-Only thay vì tiêu đề Public-Key-Pins:

Public-Key-Pins-Report-Only: 
       max-age=2592000;  
       pin-sha256="E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=";  
       pin-sha256="LPJNul+wow4m6DsqxbninhsWHlwfp0JecwQzYpOLmCQ=";  
report-uri="https://example.net/pkp-report"

Khi trang web của bạn gửi một tiêu đề như vậy, Chrome sẽ xác minh xem kết nối hiện tại có khớp với các ghim hay không và gửi báo cáo cho report-uri nếu không có. Chrome sẽ không bao giờ chặn các yêu cầu dựa trên các ghim trong tiêu đề Chỉ báo cáo, vì vậy, đây là cách an toàn để dùng thử HPKP và xem liệu HPKP có gây ra sự cố cho người dùng của bạn mà không gặp rủi ro doSing trang web của bạn hay không.

Lưu ý rằng tiêu đề Chỉ báo cáo chỉ áp dụng cho yêu cầu nhận được tiêu đề đó. Trình duyệt không ghi nhớ ghim Chỉ báo cáo giống như ghim thực. Điều này cho phép bạn kiểm thử cấu hình mà không phải lo lắng về việc lưu các giá trị không hợp lệ vào bộ nhớ đệm trong trình duyệt của người dùng và bạn có thể triển khai dần dần (ví dụ: chỉ trên một tài nguyên) để tránh gửi quá nhiều báo cáo vào máy chủ của mình.

Khi triển khai tiêu đề Public-Key-Pins thực để bắt đầu thực thi ghim của mình, bạn cũng có thể đưa giá trị report-uri vào tiêu đề đó để tiếp tục nhận được báo cáo nếu có vấn đề xảy ra.

Báo cáo vi phạm HPKP có những gì?

Báo cáo vi phạm HPKP là một thông báo JSON được gửi qua yêu cầu POST HTTP tới report-uri mà bạn đã định cấu hình. Bạn có thể tìm thấy danh sách các trường trong phần spec, nhưng tôi sẽ làm nổi bật 2 trường trong số đó tại đây: served-certificate-chainvalidated-certificate-chain. served-certificate-chain là chứng chỉ đúng như Chrome đã nhận được khi thiết lập kết nối SSL cho yêu cầu. Mặt khác, validated-certificate-chain là chuỗi mà Chrome đã tạo lại khi cố gắng xác thực chứng chỉ của máy chủ. Thật đáng ngạc nhiên, có thể khác với served-certificate-chain. Các ứng dụng khác nhau sẽ xác thực chứng chỉ theo những cách khác nhau và đây có thể là nguyên nhân phổ biến gây ra lỗi cấu hình sai HPKP. Hãy nhớ kiểm tra trường này nếu bạn nhận được báo cáo không mong muốn.

Một "gotcha" cuối cùng

Nếu bạn đang triển khai báo cáo HPKP, hãy nhớ rằng Chrome thực hiện xác thực mã pin cho mọi yêu cầu — bao gồm cả yêu cầu gửi báo cáo. Vì vậy, nếu đã triển khai HPKP cho trang web của mình, bạn có thể muốn gửi báo cáo HPKP tới một miền khác mà bạn chưa ghim. Nếu không, lỗi vi phạm mã PIN trên trang web của bạn sẽ kích hoạt một báo cáo gửi đến cùng miền, và điều này cũng sẽ khiến bạn không nhận được báo cáo vi phạm, do đó, bạn sẽ không nhận được báo cáo.

Nếu không có sẵn một miền khác, bạn có thể thử dịch vụ (chẳng hạn như report-uri.io). Dịch vụ này giúp xử lý các báo cáo vi phạm cho bạn.