Bật HTTPS trên máy chủ của bạn

Chris Palmer
Chris Palmer

Trang này cung cấp hướng dẫn thiết lập HTTPS trên máy chủ của bạn, bao gồm các bước sau:

  • Tạo cặp khoá công khai/riêng tư RSA 2048 bit.
  • Đang tạo yêu cầu ký chứng chỉ (CSR) nhúng khoá công khai của bạn.
  • Chia sẻ CSR với Tổ chức phát hành chứng chỉ (CA) để nhận chứng chỉ cuối cùng hoặc một chuỗi chứng chỉ.
  • Cài đặt chứng chỉ cuối cùng ở một nơi không thể truy cập trên web, chẳng hạn như /etc/ssl (Linux và Unix) hoặc bất cứ nơi nào IIS yêu cầu (Windows).

Tạo khoá và yêu cầu ký chứng chỉ

Phần này sử dụng chương trình dòng lệnh openSSL, đi kèm với hầu hết các hệ thống Linux, BSD và Mac OS X, để tạo khoá riêng tư và công khai cũng như CSR.

Tạo một cặp khoá công khai/riêng tư

Để bắt đầu, hãy tạo một cặp khoá RSA 2.048 bit. Khoá ngắn hơn có thể bị hỏng do các cuộc tấn công đoán dựa trên brute-force và các khoá dài hơn sử dụng tài nguyên không cần thiết.

Hãy dùng lệnh sau để tạo một cặp khoá RSA:

openssl genrsa -out www.example.com.key 2048

Thao tác này sẽ cho ra kết quả sau:

Generating RSA private key, 2048 bit long modulus
.+++
.......................................................................................+++
e is 65537 (0x10001)

Tạo yêu cầu ký chứng chỉ

Trong bước này, bạn nhúng khoá công khai và thông tin về tổ chức cũng như trang web của bạn vào một yêu cầu ký chứng chỉ hoặc CSR. Lệnh openssl yêu cầu bạn cung cấp siêu dữ liệu cần thiết.

Chạy lệnh sau:

openssl req -new -sha256 -key www.example.com.key -out www.example.com.csr

Cho kết quả như sau:

You are about to be asked to enter information that will be incorporated
into your certificate request

What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CA
State or Province Name (full name) [Some-State]:California
Locality Name (for example, city) []:Mountain View
Organization Name (for example, company) [Internet Widgits Pty Ltd]:Example, Inc.
Organizational Unit Name (for example, section) []:Webmaster Help Center Example
Team
Common Name (e.g. server FQDN or YOUR name) []:www.example.com
Email Address []:webmaster@example.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Để đảm bảo tính hợp lệ của CSR, hãy chạy lệnh sau:

openssl req -text -in www.example.com.csr -noout

Phản hồi sẽ có dạng như sau:

Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=CA, ST=California, L=Mountain View, O=Google, Inc.,
OU=Webmaster Help Center Example Team,
CN=www.example.com/emailAddress=webmaster@example.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:ad:fc:58:e0:da:f2:0b:73:51:93:29:a5:d3:9e:
                    f8:f1:14:13:64:cc:e0:bc:be:26:5d:04:e1:58:dc:
                    ...
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         5f:05:f3:71:d5:f7:b7:b6:dc:17:cc:88:03:b8:87:29:f6:87:
         2f:7f:00:49:08:0a:20:41:0b:70:03:04:7d:94:af:69:3d:f4:
         ...

Gửi CSR của bạn đến tổ chức phát hành chứng chỉ

Các tổ chức phát hành chứng chỉ (CA) khác nhau yêu cầu bạn gửi CSR của mình cho họ theo những cách khác nhau. Những cách này có thể bao gồm việc sử dụng biểu mẫu trên trang web của họ hoặc gửi CSR qua email. Một số CA hoặc đại lý của họ thậm chí có thể tự động hoá một số hoặc toàn bộ quy trình, bao gồm (trong một số trường hợp) cặp khoá và tạo CSR.

Gửi CSR đến CA và làm theo hướng dẫn của họ để nhận chứng chỉ hoặc chuỗi chứng chỉ cuối cùng của bạn.

Các CA khác nhau sẽ tính số tiền khác nhau cho dịch vụ bảo lãnh cho khoá công khai của bạn.

Ngoài ra, bạn cũng có thể liên kết khoá của mình với nhiều tên DNS, bao gồm một số tên riêng biệt (ví dụ: tất cả example.com, www.example.com, example.net và www.example.net) hoặc tên "ký tự đại diện" như *.example.com.

Sao chép chứng chỉ vào tất cả máy chủ giao diện người dùng của bạn ở một nơi không thể truy cập trên web, chẳng hạn như /etc/ssl (Linux và Unix) hoặc ở bất cứ nơi nào IIS (Windows) yêu cầu.

Bật HTTPS trên máy chủ của bạn

Việc bật HTTPS trên máy chủ là một bước quan trọng để mang lại tính bảo mật cho các trang web.

  • Sử dụng công cụ Cấu hình máy chủ của Mozilla để thiết lập máy chủ của bạn để hỗ trợ HTTPS.
  • Hãy thường xuyên kiểm tra trang web của bạn bằng quy trình Kiểm tra máy chủ SSL của Qualys và đảm bảo bạn nhận được ít nhất điểm A hoặc A+.

Tại thời điểm này, bạn phải đưa ra quyết định quan trọng về hoạt động. Chọn một trong các lựa chọn sau:

  • Dành riêng một địa chỉ IP riêng biệt cho mỗi tên máy chủ mà máy chủ web của bạn phân phát nội dung.
  • Sử dụng dịch vụ lưu trữ ảo dựa trên tên.

Nếu đang sử dụng các địa chỉ IP riêng biệt cho mỗi tên máy chủ, bạn có thể hỗ trợ cả HTTP và HTTPS cho tất cả ứng dụng. Tuy nhiên, hầu hết các nhà điều hành trang web đều sử dụng dịch vụ lưu trữ ảo dựa trên tên để bảo toàn địa chỉ IP vì nói chung thì phương thức này thuận tiện hơn.

Nếu bạn chưa có dịch vụ HTTPS trên máy chủ của mình, hãy bật dịch vụ này ngay (mà không cần chuyển hướng HTTP sang HTTPS. Hãy xem bài viết Chuyển hướng HTTP sang HTTPS để biết thêm thông tin). Định cấu hình máy chủ web của bạn để sử dụng các chứng chỉ mà bạn đã mua và cài đặt. Bạn có thể thấy trình tạo cấu hình của Mozilla rất hữu ích.

Nếu bạn có nhiều tên máy chủ hoặc miền con, thì mỗi tên máy chủ hoặc miền con đó cần sử dụng đúng chứng chỉ.

Bây giờ, và thường xuyên trong suốt thời gian hoạt động của trang web, hãy kiểm tra cấu hình HTTPS bằng công cụ Kiểm tra máy chủ SSL củaQualys. Trang web của bạn phải đạt điểm A hoặc A+. Hãy xem mọi vấn đề làm cho điểm thấp hơn là lỗi và tiếp tục cẩn trọng vì các cuộc tấn công mới nhằm vào thuật toán và giao thức luôn được phát triển.

Đặt các URL nội bộ có tính tương đối

Giờ đây, khi mà bạn đang phân phát trang web của mình trên cả HTTP và HTTPS, mọi thứ cần phải hoạt động suôn sẻ nhất có thể bất kể giao thức nào. Một yếu tố quan trọng là sử dụng URL tương đối cho các đường liên kết nội bộ.

Hãy đảm bảo URL nội bộ và URL bên ngoài không phụ thuộc vào một giao thức cụ thể. Sử dụng đường dẫn tương đối hoặc bỏ giao thức như trong //example.com/something.js.

Việc phân phát một trang chứa tài nguyên HTTP bằng HTTPS có thể gây ra sự cố. Khi gặp một trang bảo mật khác đang sử dụng tài nguyên không an toàn, trình duyệt sẽ cảnh báo người dùng rằng trang đó không hoàn toàn an toàn và một số trình duyệt từ chối tải hoặc thực thi các tài nguyên HTTP khiến trang bị hỏng. Tuy nhiên, bạn có thể đưa tài nguyên HTTPS vào một trang HTTP một cách an toàn. Để biết thêm hướng dẫn về cách khắc phục những vấn đề này, hãy xem bài viết Khắc phục nội dung hỗn hợp.

Việc truy cập các đường liên kết dựa trên HTTP đến các trang khác trên trang web của bạn cũng có thể hạ cấp trải nghiệm người dùng từ HTTPS xuống HTTP. Để khắc phục vấn đề này, hãy làm cho các URL nội bộ của bạn mang tính tương đối nhất có thể, bằng cách làm cho chúng trở thành giao thức tương đối (thiếu giao thức, bắt đầu bằng //example.com) hoặc tương đối với máy chủ (bắt đầu bằng đường dẫn, chẳng hạn như /jquery.js).

Nên
<h1>Welcome To Example.com</h1>
<script src="/jquery.js"></script>
<link rel="stylesheet" href="/assets/style.css"/>
<img src="/images/logo.png"/>;
<p>A <a href="/2014/12/24">new post on cats!</a></p>
Dùng URL tương đối nội bộ.
Nên
<h1>Welcome To Example.com</h1>
<script src="//example.com/jquery.js"></script>
<link rel="stylesheet" href="//assets.example.com/style.css"/>
<img src="//img.example.com/logo.png"/>;
<p>A <a href="//example.com/2014/12/24/">new post on cats!</a></p>
Hoặc sử dụng URL nội bộ tương đối với giao thức.
Nên
<h1>Welcome To Example.com</h1>
<script src="/jquery.js"></script>
<link rel="stylesheet" href="/assets/style.css"/>
<img src="/images/logo.png"/>;
<p>A <a href="/2014/12/24">new post on cats!</a></p>
<p>Check out this <a href="https://foo.com/"><b>other cool site.</b></a></p>
Sử dụng URL loại HTTPS cho đường liên kết đến các trang web khác nếu có thể.

Hãy cập nhật đường liên kết bằng một tập lệnh (chứ không phải theo cách thủ công) để tránh mắc lỗi. Nếu nội dung trang web của bạn có trong một cơ sở dữ liệu, hãy kiểm tra tập lệnh của bạn trên một bản sao đang phát triển của cơ sở dữ liệu. Nếu nội dung trang web của bạn chỉ bao gồm các tệp đơn giản, hãy kiểm thử tập lệnh trên bản sao đang phát triển của các tệp đó. Chỉ chuyển các thay đổi lên phiên bản chính thức sau khi các thay đổi vượt qua quy trình đảm bảo chất lượng, như bình thường. Bạn có thể sử dụng tập lệnh của Bram van Damme hoặc tập lệnh tương tự để phát hiện nội dung hỗn hợp trên trang web của mình.

Khi liên kết đến các trang web khác (thay vì bao gồm tài nguyên từ các trang web đó), bạn không nên thay đổi giao thức. Bạn không có quyền kiểm soát cách hoạt động của các trang web đó.

Để di chuyển suôn sẻ hơn cho các trang web lớn, bạn nên sử dụng URL giao thức tương đối. Nếu không chắc liệu bạn có thể triển khai HTTPS đầy đủ hay không, việc buộc trang web của bạn sử dụng HTTPS cho tất cả các nguồn phụ có thể gây phản hồi. Có thể có khoảng thời gian HTTPS còn mới và lạ lẫm với bạn, và trang web HTTP vẫn phải hoạt động hiệu quả như trước đây. Theo thời gian, bạn sẽ hoàn tất quá trình di chuyển và khoá trong HTTPS (xem hai phần tiếp theo).

Nếu trang web của bạn phụ thuộc vào tập lệnh, hình ảnh hoặc các tài nguyên khác do bên thứ ba phân phát, chẳng hạn như CDN hoặc jquery.com, thì bạn có 2 lựa chọn:

  • Sử dụng URL giao thức tương đối cho những tài nguyên này. Nếu bên thứ ba không phân phát HTTPS, hãy yêu cầu họ làm vậy. Hầu hết đều đã làm, bao gồm jquery.com.
  • Phân phát tài nguyên từ một máy chủ mà bạn kiểm soát, máy chủ này cung cấp cả HTTP và HTTPS. Dù sao thì đây cũng thường là ý tưởng hay, vì khi đó bạn sẽ kiểm soát tốt hơn giao diện, hiệu suất và tính bảo mật của trang web và không phải tin tưởng vào một bên thứ ba để giữ an toàn cho trang web của mình.

Chuyển hướng HTTP sang HTTPS

Để yêu cầu công cụ tìm kiếm sử dụng HTTPS để truy cập trang web của bạn, hãy đặt một đường liên kết chính tắc ở đầu mỗi trang bằng cách sử dụng thẻ <link rel="canonical" href="https://…"/>.

Bật tính năng Bảo mật truyền tải nghiêm ngặt và cookie bảo mật

Tại thời điểm này, bạn đã sẵn sàng để "khoá" việc sử dụng HTTPS:

  • Hãy sử dụng giao thức Bảo mật truyền tải nghiêm ngặt HTTP (HSTS) để tránh chi phí cho lệnh chuyển hướng 301.
  • Luôn đặt cờ Bảo mật trên cookie.

Trước tiên, hãy sử dụng Bảo mật truyền tải nghiêm ngặt để thông báo cho khách hàng biết rằng họ phải luôn kết nối với máy chủ của bạn bằng HTTPS, ngay cả khi theo tham chiếu http://. Điều này đánh bại các cuộc tấn công như Loại bỏ SSL và tránh chi phí khứ hồi của 301 redirect mà chúng tôi đã bật trong Chuyển hướng HTTP sang HTTPS.

Để bật HSTS, hãy đặt tiêu đề Strict-Transport-Security. Trang HSTS của OWASP có các đường liên kết đến hướng dẫn cho nhiều loại phần mềm máy chủ.

Hầu hết các máy chủ web đều có khả năng thêm tiêu đề tuỳ chỉnh tương tự.

Ngoài ra, bạn cũng phải đảm bảo ứng dụng không bao giờ gửi cookie (chẳng hạn như để xác thực hoặc lựa chọn ưu tiên cho trang web) qua HTTP. Ví dụ: nếu cookie xác thực của người dùng hiển thị dưới dạng văn bản thuần tuý, thì cam kết bảo mật của bạn cho toàn bộ phiên hoạt động của họ sẽ bị huỷ bỏ, ngay cả khi bạn đã làm đúng mọi thứ!

Để tránh điều này, hãy thay đổi ứng dụng web để luôn đặt cờ Bảo mật trên các cookie mà ứng dụng đặt. Trang OWASP này giải thích cách đặt cờ Bảo mật trong một số khung ứng dụng. Mỗi khung appl đều có một cách để đặt cờ.

Hầu hết các máy chủ web đều cung cấp tính năng chuyển hướng đơn giản. Hãy sử dụng 301 (Moved Permanently) để cho các công cụ tìm kiếm và trình duyệt biết rằng phiên bản HTTPS là phiên bản chính tắc, đồng thời chuyển hướng người dùng từ HTTP đến phiên bản HTTPS của trang web.

Thứ hạng tìm kiếm

Google sử dụng HTTPS làm chỉ báo chất lượng tìm kiếm tích cực. Google cũng xuất bản hướng dẫn về cách chuyển, di chuyển hoặc di chuyển trang web trong khi vẫn duy trì thứ hạng tìm kiếm của trang web. Bing cũng xuất bản các nguyên tắc dành cho quản trị viên trang web.

Hiệu suất

Khi các lớp nội dung và ứng dụng được tinh chỉnh (tham khảo sách của Steve Souders để biết lời khuyên), những vấn đề còn lại về hiệu suất TLS thường nhỏ so với tổng chi phí của ứng dụng. Bạn cũng có thể giảm và khấu hao các chi phí đó. Để biết lời khuyên về việc tối ưu hoá TLS, hãy xem bài viết Kết nối mạng cho trình duyệt hiệu suất cao của Ilya Grigorik, cũng như Sách dạy nấu ăn OpenSL SSLSSL và SSL chống đạn của Ivan Ristic.

Trong một số trường hợp, TLS có thể cải thiện hiệu suất, chủ yếu là nhờ việc có thể thực hiện HTTP/2. Để biết thêm thông tin, hãy tham khảo bài nói chuyện của Chris Palmer về hiệu suất của HTTPS và HTTP/2 tại Hội nghị Nhà phát triển Chrome năm 2014.

Tiêu đề tham chiếu

Khi người dùng theo các đường liên kết từ trang web HTTPS của bạn đến các trang web HTTP khác, tác nhân người dùng sẽ không gửi tiêu đề Referenceer. Nếu đây là vấn đề, có một số cách để giải quyết:

  • Các trang web khác nên di chuyển sang HTTPS. Nếu trang web được giới thiệu hoàn thành phần Bật HTTPS trên máy chủ của bạn của hướng dẫn này, thì bạn có thể thay đổi đường liên kết trong trang web của mình thành đường liên kết từ http:// thành https:// hoặc sử dụng đường liên kết tương đối đến giao thức.
  • Để giải quyết nhiều vấn đề về tiêu đề Người giới thiệu, hãy sử dụng tiêu chuẩn Chính sách giới thiệu mới.

Doanh thu từ quảng cáo

Những nhà điều hành trang web kiếm tiền từ trang web của họ bằng cách hiển thị quảng cáo đều muốn đảm bảo việc di chuyển sang HTTPS không làm giảm số lượt hiển thị quảng cáo. Tuy nhiên, do vấn đề bảo mật nội dung hỗn hợp, HTTP <iframe> không hoạt động trên trang HTTPS. Cho đến khi nhà quảng cáo phát hành qua HTTPS, nhà điều hành trang web không thể di chuyển sang HTTPS mà không mất doanh thu quảng cáo; nhưng cho đến khi nhà điều hành trang web di chuyển sang HTTPS, nhà quảng cáo ít có động lực xuất bản HTTPS.

Bạn có thể bắt đầu quá trình phá vỡ tình trạng bế tắc này bằng cách sử dụng các nhà quảng cáo cung cấp dịch vụ quảng cáo qua HTTPS và yêu cầu các nhà quảng cáo không phân phát HTTPS ít nhất đưa ra lựa chọn. Bạn có thể cần phải trì hoãn việc hoàn tất thao tác Tạo URL trong trang web tương đối cho đến khi có đủ các nhà quảng cáo tương tác đúng cách.