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

Chris Palmer
Chris Palmer

Trang này hướng dẫn cách 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.
  • 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 chuỗi chứng chỉ.
  • Cài đặt chứng chỉ cuối cùng ở một vị trí không truy cập được 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).

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ư, khoá công khai và CSR.

Tạo 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ị phá vỡ bằng các cuộc tấn công đoán bằng phương thức brute-force (thử và sai) và khoá dài hơn sẽ sử dụng tài nguyên không cần thiết.

Sử dụng lệnh sau để tạo 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 mình vào yêu cầu ký chứng chỉ hoặc CSR. Lệnh openssl sẽ yêu cầu bạn cung cấp siêu dữ liệu bắt buộc.

Chạy lệnh sau:

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

Kết quả đầu ra 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 CSR hợp lệ, 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 cho một tổ chức phát hành chứng chỉ

Mỗi tổ chức phát hành chứng chỉ (CA) yêu cầu bạn gửi CSR cho họ theo cách riêng. Các phương thức 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 email cho nhân viên hỗ trợ khách hàng. 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 cả việc tạo cặp khoá và CSR trong một số trường hợp.

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ác CA khác nhau sẽ tính phí khác nhau cho dịch vụ chứng thực khoá công khai của bạn.

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 cả 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 các chứng chỉ vào tất cả máy chủ giao diện người dùng của bạn ở một vị trí không truy cập được 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ủ

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

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

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

  • Chỉ định một địa chỉ IP riêng biệt cho mỗi tên máy chủ mà máy chủ web phân phát nội dung.
  • Sử dụng tính năng 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 từng 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 để tiết kiệm địa chỉ IP và vì dịch vụ này nói chung thuận tiện hơn.

Nếu bạn chưa có dịch vụ HTTPS trên máy chủ, hãy bật dịch vụ đó ngay (mà không cần chuyển hướng HTTP sang HTTPS. Hãy xem phần Chuyển hướng HTTP sang HTTPS để biết thêm thông tin). Định cấu hình máy chủ web để sử dụng các chứng chỉ 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ỉ.

Giờ đây 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 Bài kiểm tra máy chủ SSL của Qualys. Trang web của bạn phải đạt điểm A hoặc A+. Hãy coi mọi thứ khiến điểm số thấp hơn là lỗi và luôn cẩn thận vì các cuộc tấn công mới chống lại thuật toán và giao thức luôn được phát triển.

Đặt URL nội bộ tương đối

Giờ đây, bạn đang phân phát trang web của mình trên cả HTTP và HTTPS, mọi thứ cần hoạt động trơn tru nhất có thể bất kể giao thức. 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 trang.

Đảm bảo URL nội trang 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ỏ qua 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 an toàn 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 sẽ từ chối tải hoặc thực thi tài nguyên HTTP, khiến trang bị hỏng. Tuy nhiên, bạn có thể đưa các 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 các vấn đề này, hãy xem bài viết Khắc phục nội dung hỗn hợp.

Việc theo dõi 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ể làm giảm trải nghiệm người dùng từ HTTPS xuống HTTP. Để khắc phục vấn đề này, hãy đặt URL nội trang càng tương đối càng tốt bằng cách đặt URL tương đối theo giao thức (thiếu giao thức, bắt đầu bằng //example.com) hoặc tương đối theo máy chủ lưu trữ (chỉ bắt đầu bằng đường dẫ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>
Sử dụng URL tương đối trong trang web.
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 trang tương đối theo 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 HTTPS cho các đường liên kết đến các trang web khác nếu có thể.

Hãy cập nhật các đường liên kết bằng tập lệnh, chứ không phải thủ công để tránh mắc lỗi. Nếu nội dung của trang web nằm trong cơ sở dữ liệu, hãy kiểm thử tập lệnh trên bản sao phát triển của cơ sở dữ liệu. Nếu nội dung của trang web 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 phát triển của các tệp đó. Chỉ đẩy 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 kiểm thử chất lượng (QA) như bình thường. Bạn có thể sử dụng tập lệnh của Bram van Damme hoặc một 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ì đưa tài nguyên từ các trang web đó vào), đừng thay đổi giao thức. Bạn không kiểm soát được cách hoạt động của những trang web đó.

Để quá trình di chuyển diễn ra suôn sẻ hơn cho các trang web lớn, bạn nên sử dụng URL tương ứng với giao thức. Nếu bạn không chắc chắn liệu mình đã có thể triển khai đầy đủ HTTPS hay chưa, việc buộc trang web sử dụng HTTPS cho tất cả tài nguyên phụ có thể phản tác dụng. Có thể sẽ có một khoảng thời gian mà bạn thấy HTTPS mới mẻ và lạ lẫm, trong khi trang web HTTP vẫn hoạt động tốt như bình thường. Theo thời gian, bạn sẽ hoàn tất quá trình di chuyển và chuyển sang 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 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ó hai lựa chọn:

  • Sử dụng URL tương đối theo giao thức cho các 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 như vậy. Hầu hết các trang web đều đã làm như vậy, bao gồm cả 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ì bạn cũng nên tự lưu trữ vì khi đó, bạn có thể 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, đồng thời không cần phải tin tưởng bên thứ ba để bảo mật trang web.

Chuyển hướng HTTP sang HTTPS

Để yêu cầu các công cụ tìm kiếm sử dụng HTTPS để truy cập vào 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 nghiêm ngặt trong quá trình truyền tải 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:

  • Sử dụng Bảo mật truyền tải nghiêm ngặt HTTP (HSTS) để tránh chi phí của 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 Strict Transport Security (Bảo mật nghiêm ngặt trong quá trình truyền tải) để cho ứng dụng biết rằng chúng phải luôn kết nối với máy chủ của bạn bằng HTTPS, ngay cả khi làm theo tham chiếu http://. Điều này giúp ngăn chặn các cuộc tấn công như Loại bỏ SSL và tránh chi phí đi và về của 301 redirect mà chúng ta đã bật trong phần 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 máy chủ web đều có khả năng tương tự để thêm tiêu đề tuỳ chỉnh.

Bạn cũng cần đảm bảo rằng ứng dụng khách không bao giờ gửi cookie (chẳng hạn như để xác thực hoặc ưu tiên trang web) qua HTTP. Ví dụ: nếu cookie xác thực của người dùng bị hiển thị ở 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 của họ sẽ bị huỷ bỏ, ngay cả khi bạn đã làm đúng mọi việc khác!

Để tránh điều này, hãy thay đổi ứng dụng web của bạn để 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 ứng dụng đều có cách để đặt cờ.

Hầu hết máy chủ web đều cung cấp tính năng chuyển hướng đơn giản. 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 và chuyển hướng người dùng từ HTTP đến phiên bản HTTPS của trang web.

Thứ hạng trên Google Tìm kiếm

Google sử dụng HTTPS làm chỉ báo tích cực về chất lượng tìm kiếm. Google cũng phát hành hướng dẫn về cách chuyển, di chuyển hoặc di chuyển trang web mà vẫn duy trì thứ hạng tìm kiếm của trang web. Bing cũng phát hành 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 điều chỉnh tốt (tham khảo sách của Steve Souders để được tư vấn), các vấn đề còn lại về hiệu suất TLS thường nhỏ so với chi phí tổng thể của ứng dụng. Bạn cũng có thể giảm và phân bổ những chi phí đó. Để được tư vấn về cách tối ưu hoá TLS, hãy xem cuốn High Performance Browser Networking (Mạng duyệt hiệu suất cao) của Ilya Grigorik, cũng như OpenSSL Cookbook (Sách dạy nấu ăn OpenSSL) và Bulletproof SSL And TLS (SSL và TLS 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à do hỗ trợ HTTP/2. Để biết thêm thông tin, hãy tham khảo bài nói chuyện của Chris Palmer's' về hiệu suất HTTPS và HTTP/2 tại Chrome Dev Summit 2014.

Tiêu đề giới thiệu

Khi người dùng nhấp vào đườ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 đề Trình giới thiệu. Nếu đây là vấn đề, bạn có thể giải quyết bằng một số cách sau:

  • Các trang web khác nên chuyển sang HTTPS. Nếu trang web giới thiệu hoàn tất phần Bật HTTPS trên máy chủ của hướng dẫn này, 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 của họ từ http:// thành https:// hoặc sử dụng đường liên kết tương ứng với giao thức.
  • Để giải quyết nhiều vấn đề liên quan đến tiêu đề Referrer, hãy sử dụng tiêu chuẩn mới về Chính sách liên kết giới thiệu.

Doanh thu quảng cáo

Những nhà điều hành trang web kiếm tiền bằng cách hiển thị quảng cáo muốn đảm bảo rằng việc chuyển sang HTTPS sẽ không làm giảm số lượt hiển thị quảng cáo. Tuy nhiên, do các vấn đề về bảo mật nội dung hỗn hợp, <iframe> HTTP không hoạt động trên trang HTTPS. Cho đến khi nhà quảng cáo xuất bản qua HTTPS, nhà điều hành trang web không thể di chuyển sang HTTPS mà không mất doanh thu từ 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 sẽ không có nhiều động lực để xuất bản qua 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 những nhà quảng cáo cung cấp dịch vụ quảng cáo qua HTTPS và yêu cầu những nhà quảng cáo không phân phát HTTPS chút nào ít nhất cũng phải cung cấp lựa chọn này. Bạn có thể cần phải trì hoãn việc hoàn tất bước Đặt URL nội trang web ở chế độ tương đối cho đến khi có đủ nhà quảng cáo tương tác đúng cách.