Thứ tư, 04/01/2017 | 00:00 GMT+7

Cách tạo chứng chỉ SSL trên Apache cho CentOS 7

TLS hay còn gọi là “bảo mật lớp truyền tải” và SSL tiền nhiệm của nó, viết tắt của “ secure socket layer ”, là các giao thức web được sử dụng để bọc lưu lượng truy cập bình thường trong một shell bọc được mã hóa, được bảo vệ. Sử dụng công nghệ này, các server có thể gửi lưu lượng truy cập giữa server và client một cách an toàn mà không lo ngại rằng các thông điệp sẽ bị chặn và đọc bởi bên ngoài. Hệ thống certificate cũng hỗ trợ user xác minh danh tính của các trang web mà họ đang kết nối.

Trong hướng dẫn này, ta sẽ chỉ cho bạn cách cài đặt certificate SSL tự ký để sử dụng với web server Apache trên máy CentOS 7.

Lưu ý: Chứng chỉ tự ký sẽ mã hóa giao tiếp giữa server của bạn và bất kỳ client nào. Tuy nhiên, vì nó không được ký bởi bất kỳ tổ chức cấp certificate tin cậy nào có trong trình duyệt web, user không thể sử dụng certificate để xác thực danh tính server của bạn một cách tự động.

Chứng chỉ tự ký có thể phù hợp nếu bạn không có domain được liên kết với server của bạn và đối với các trường hợp giao diện web được mã hóa không hướng tới user . Nếu bạn có domain , trong nhiều trường hợp, tốt hơn là sử dụng certificate do CA ký. Bạn có thể tìm hiểu cách cài đặt certificate tin cậy miễn phí với dự án Let's Encrypt tại đây .

Yêu cầu

Trước khi bạn bắt đầu với hướng dẫn này, có một số bước cần được hoàn thành trước.

Bạn cần quyền truy cập vào server CentOS 7 với user không phải root có quyền sudo . Nếu bạn chưa cấu hình account này, bạn có thể chạy qua hướng dẫn cài đặt server ban đầu CentOS 7 để tạo account này.

Bạn cũng cần phải cài đặt Apache để cấu hình server ảo cho nó. Nếu bạn chưa làm như vậy, bạn có thể sử dụng yum để cài đặt Apache thông qua repository mặc định của CentOS:

  • sudo yum install httpd

Tiếp theo, kích hoạt Apache như một dịch vụ CentOS để nó sẽ tự động khởi động sau khi khởi động lại:

  • sudo systemctl enable httpd.service

Sau khi các bước này hoàn tất, bạn có thể đăng nhập bằng account user không phải root của bạn thông qua SSH và tiếp tục với hướng dẫn.

Bước một: Cài đặt Mod SSL

Để cài đặt certificate tự ký, trước tiên ta phải đảm bảo mod_ssl , một module Apache cung cấp hỗ trợ cho mã hóa SSL, đã được cài đặt server . Ta có thể cài đặt mod_ssl bằng lệnh yum :

  • sudo yum install mod_ssl

Mô-đun sẽ tự động được bật trong khi cài đặt và Apache sẽ có thể bắt đầu sử dụng certificate SSL sau khi nó được khởi động lại. Bạn không cần thực hiện thêm bất kỳ bước nào để mod_ssl sẵn sàng sử dụng.

Bước hai: Tạo certificate mới

Bây giờ Apache đã sẵn sàng để sử dụng mã hóa, ta có thể chuyển sang tạo certificate SSL mới. Chứng chỉ sẽ lưu trữ một số thông tin cơ bản về trang web và sẽ được kèm theo một file khóa cho phép server xử lý dữ liệu được mã hóa một cách an toàn.

Đầu tiên, ta cần tạo một folder mới để lưu trữ private key của bạn (thư mục /etc/ssl/certs đã có sẵn để chứa file certificate của ta ):

  • sudo mkdir /etc/ssl/private

Vì các file được lưu trong folder này phải được giữ riêng tư nghiêm ngặt, ta sẽ sửa đổi các quyền đảm bảo chỉ user root mới có quyền truy cập:

  • sudo chmod 700 /etc/ssl/private

Bây giờ ta đã có vị trí để đặt các file của bạn , ta có thể tạo khóa SSL và các file certificate với openssl :

  • sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

Sau khi bạn nhập yêu cầu, bạn sẽ được đưa đến một dấu nhắc nơi bạn có thể nhập thông tin về trang web của bạn . Trước khi xem xét điều đó, hãy xem điều gì đang xảy ra trong lệnh mà ta đang phát hành:

  • openssl : Đây là công cụ dòng lệnh cơ bản để tạo và quản lý certificate OpenSSL, khóa và các file khác.
  • req -x509 : Điều này chỉ định rằng ta muốn sử dụng quản lý yêu cầu ký certificate (CSR) X.509. “X.509” là tiêu chuẩn cơ sở hạ tầng public key mà SSL và TLS tuân theo để quản lý khóa và certificate .
  • -nodes : Điều này yêu cầu OpenSSL bỏ qua tùy chọn bảo mật certificate của ta bằng passphrase (password bảo vệ) . Ta cần Apache để có thể đọc file mà không cần sự can thiệp của user , khi server khởi động. Một passphrase (password bảo vệ) sẽ ngăn điều này xảy ra, vì ta sẽ phải nhập nó sau mỗi lần khởi động lại.
  • -days 365 : Tùy chọn này đặt khoảng thời gian mà certificate sẽ được coi là hợp lệ. Ta đặt nó trong một năm ở đây.
  • -newkey rsa: 2048 : Điều này chỉ định rằng ta muốn tạo certificate mới và khóa mới cùng một lúc. Ta đã không tạo khóa bắt buộc phải ký certificate ở bước trước, vì vậy ta cần tạo khóa cùng với certificate . Phần rsa:2048 yêu cầu nó tạo một khóa RSA dài 2048 bit.
  • -keyout : Dòng này cho OpenSSL biết nơi đặt file private key đã tạo mà ta đang tạo.
  • -out : Điều này cho OpenSSL biết nơi đặt certificate mà ta đang tạo.

Điền vào các dấu nhắc một cách thích hợp. Dòng quan trọng nhất là dòng yêu cầu Common Name . Bạn cần nhập domain mà bạn muốn liên kết với server của bạn . Thay vào đó, bạn có thể nhập địa chỉ IP công cộng nếu bạn chưa có domain .

Danh sách đầy đủ các dấu nhắc sẽ trông giống như sau:

Country Name (2 letter code) [XX]:US State or Province Name (full name) []:Example Locality Name (eg, city) [Default City]:Example  Organization Name (eg, company) [Default Company Ltd]:Example Inc Organizational Unit Name (eg, section) []:Example Dept Common Name (eg, your name or your server's hostname) []:example.com Email Address []:webmaster@example.com 

Cả hai file bạn đã tạo sẽ được đặt trong các folder con thích hợp của folder /etc/ssl .

Trong khi ta đang sử dụng OpenSSL, ta cũng nên tạo một group Diffie-Hellman mạnh mẽ, được sử dụng để đàm phán Perfect Forward Secrecy với khách hàng.

Ta có thể làm điều này bằng lệnh :

  • sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Quá trình này có thể mất vài phút, nhưng khi hoàn tất, bạn sẽ có một group DH mạnh tại /etc/ssl/certs/dhparam.pem mà ta có thể sử dụng trong cấu hình của bạn .

Vì version Apache đi kèm với CentOS 7 không bao gồm chỉ thị SSLOpenSSLConfCmd , ta sẽ phải nối file đã tạo theo cách thủ công vào cuối certificate tự ký của ta . Để làm điều này, hãy nhập:

  • cat /etc/ssl/certs/dhparam.pem | sudo tee -a /etc/ssl/certs/apache-selfsigned.crt

Tệp apache-selfsigned.crt bây giờ phải có cả certificate và group Diffie-Hellman được tạo.

Bước 3: Cài đặt certificate

Bây giờ ta có tất cả các thành phần cần thiết của giao diện hoàn thiện. Điều tiếp theo cần làm là cài đặt các server ảo để hiển thị certificate mới.

Mở file cấu hình SSL của Apache trong editor của bạn với quyền root:

  • sudo vi /etc/httpd/conf.d/ssl.conf

Tìm phần bắt đầu bằng <VirtualHost _default_:443> . Ta cần thực hiện một vài thay đổi ở đây đảm bảo rằng certificate SSL của ta được áp dụng chính xác cho trang web của ta .

Điều chỉnh chỉ thị VirtualHost

Đầu tiên, bỏ comment DocumentRoot và chỉnh sửa địa chỉ trong dấu ngoặc kép thành vị trí của root tài liệu trang web . Theo mặc định, dòng này sẽ nằm trong /var/www/html và bạn không cần phải thay đổi dòng này nếu bạn chưa thay đổi root tài liệu cho trang web của bạn . Tuy nhiên, nếu bạn đã làm theo hướng dẫn như hướng dẫn cài đặt server ảo Apache của ta , thì root tài liệu trang web có thể khác.

Tiếp theo, bỏ comment ServerName và thay thế www.example.com bằng domain hoặc địa chỉ IP server của bạn (bất kỳ cái nào bạn đặt làm tên chung trong certificate của bạn ):

/etc/httpd/conf.d/ssl.conf
<VirtualHost _default_:443> . . . DocumentRoot "/var/www/example.com/public_html" ServerName www.example.com:443 

Tiếp theo, tìm các dòng SSLProtocolSSLCipherSuite và xóa chúng hoặc comment chúng. Cấu hình mà ta sẽ dán trong giây lát sẽ cung cấp các cài đặt an toàn hơn so với cấu hình mặc định có trong Apache của CentOS:

/etc/httpd/conf.d/ssl.conf
. . . # SSLProtocol all -SSLv2 . . . # SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA 

Tìm các dòng SSLCertificateFileSSLCertificateKeyFile và thay đổi chúng thành folder mà ta đã tạo tại /etc/httpd/ssl :

/etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key 

Bây giờ ta đã thực hiện xong các thay đổi trong khối VirtualHost thực tế. Các thay đổi tiếp theo sẽ diễn ra sau </VirtualHost> kết thúc trong cùng file này.

Cài đặt thông số SSL an toàn

Tiếp theo, để cài đặt Apache SSL an toàn hơn, ta sẽ sử dụng các đề xuất của Remy van Elst trên trang Cipherli.st . Trang web này được thiết kế để cung cấp cài đặt mã hóa dễ sử dụng cho phần mềm phổ biến. Bạn có thể đọc thêm về các quyết định của anh ấy liên quan đến các lựa chọn Apache tại đây .

Lưu ý: Các cài đặt được đề xuất trên trang web được liên kết ở trên cung cấp khả năng bảo mật mạnh mẽ. Đôi khi, điều này phải trả giá bằng khả năng tương thích với client cao hơn. Nếu bạn cần hỗ trợ các ứng dụng client cũ hơn, có một danh sách thay thế có thể được truy cập bằng cách nhấp vào liên kết trên trang có nhãn “Có, hãy cung cấp cho tôi trang web mật mã hoạt động với phần mềm cũ / cũ”. Danh sách đó có thể được thay thế cho các mục được sao chép bên dưới.

Việc lựa chọn cấu hình nào bạn sử dụng sẽ phụ thuộc phần lớn vào những gì bạn cần hỗ trợ. Cả hai đều sẽ cung cấp bảo mật tuyệt vời.

Vì mục đích của ta , ta có thể sao chép toàn bộ các cài đặt được cung cấp. Ta sẽ chỉ thực hiện hai thay đổi nhỏ.

Hãy dành một chút thời gian để đọc về Bảo mật truyền tải nghiêm ngặt HTTP hoặc HSTS và cụ thể là về chức năng “tải trước” . Tải trước HSTS cung cấp khả năng bảo mật cao hơn, nhưng có thể gây ra hậu quả sâu rộng nếu vô tình được bật hoặc bật không đúng cách. Trong hướng dẫn này, ta sẽ không tải trước cài đặt, nhưng bạn có thể sửa đổi cài đặt đó nếu bạn chắc chắn rằng bạn hiểu các hàm ý.

Thay đổi khác mà ta sẽ thực hiện là comment chỉ thị SSLSessionTickets , vì điều này không có sẵn trong version Apache được cung cấp với CentOS 7.

Dán vào cài đặt từ trang web SAU KHI kết thúc khối VirtualHost :

/etc/httpd/conf.d/ssl.conf
    . . . </VirtualHost> . . .  # Begin copied text # from https://cipherli.st/ # and https://raymii.org/s/tutorials/Strong_SSL_Security_On_Apache2.html  SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH SSLProtocol All -SSLv2 -SSLv3 SSLHonorCipherOrder On # Disable preloading HSTS for now.  You can use the commented out header line that includes # the "preload" directive if you understand the implications. #Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains" Header always set X-Frame-Options DENY Header always set X-Content-Type-Options nosniff # Requires Apache >= 2.4 SSLCompression off  SSLUseStapling on  SSLStaplingCache "shmcb:logs/stapling-cache(150000)"  # Requires Apache >= 2.4.11 # SSLSessionTickets Off 

Khi thực hiện xong những thay đổi này, bạn có thể lưu file .

Như hiện tại, server sẽ cung cấp cả truy cập HTTP không được mã hóa và HTTPS được mã hóa. Để bảo mật tốt hơn, trong hầu hết các trường hợp, bạn nên tự động chuyển hướng HTTP sang HTTPS. Nếu bạn không cần chức năng này, bạn có thể bỏ qua phần này một cách an toàn.

Để chuyển hướng tất cả lưu lượng truy cập được mã hóa SSL, hãy tạo và mở file kết thúc bằng .conf trong folder /etc/httpd/conf.d :

  • sudo vi /etc/httpd/conf.d/non-ssl.conf

Bên trong, tạo một khối VirtualHost để khớp các yêu cầu trên cổng 80. Bên trong, sử dụng lệnh ServerName để khớp lại với domain hoặc địa chỉ IP của bạn. Sau đó, sử dụng Redirect để trùng với bất kỳ yêu cầu nào và gửi chúng đến SSL VirtualHost . Đảm bảo bao gồm dấu gạch chéo sau:

/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>         ServerName www.example.com         Redirect "/" "https://www.example.com/" </VirtualHost> 

Lưu file này khi bạn hoàn tất.

Bước 4: Kích hoạt certificate

Bây giờ, bạn đã tạo certificate SSL và cấu hình web server của bạn để áp dụng certificate đó cho trang web . Để áp dụng tất cả những thay đổi này và bắt đầu sử dụng mã hóa SSL của bạn, bạn có thể khởi động lại server Apache để reload cấu hình và module của nó.

Trước tiên, hãy kiểm tra file cấu hình của bạn để tìm lỗi cú pháp bằng lệnh :

  • sudo apachectl configtest

Miễn là kết quả kết thúc bằng Syntax OK , bạn có thể tiếp tục. Nếu đây không phải là một phần của kết quả kết quả của bạn, hãy kiểm tra cú pháp của file và thử lại:

Output
. . . Syntax OK

Khởi động lại server Apache để áp dụng các thay đổi bằng lệnh :

  • sudo systemctl restart httpd.service

Tiếp theo, đảm bảo cổng 80 và 443 đang mở trong firewall của bạn. Nếu bạn không chạy firewall , bạn có thể bỏ qua.

Nếu bạn có một bức firewall firewalld chạy, bạn có thể mở các cổng bằng lệnh :

  • sudo firewall-cmd --add-service=http
  • sudo firewall-cmd --add-service=https
  • sudo firewall-cmd --runtime-to-permanent

Nếu firewall iptables đang chạy, các lệnh bạn cần chạy phụ thuộc nhiều vào bộ luật hiện tại của bạn. Đối với bộ luật cơ bản, bạn có thể thêm quyền truy cập HTTP và HTTPS bằng lệnh :

  • sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
  • sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT

Trong trình duyệt web , hãy thử truy cập vào domain hoặc IP của bạn bằng https:// để xem certificate mới của bạn đang hoạt động.

https://example.com/ 

Trình duyệt web có thể sẽ cảnh báo bạn rằng certificate bảo mật của trang web không tin cậy . Vì certificate của bạn không được tổ chức cấp certificate mà trình duyệt tin cậy ký, nên trình duyệt không thể xác minh danh tính của server mà bạn đang cố gắng kết nối. Ta đã tạo certificate tự ký thay vì certificate tin cậy do CA ký, vì vậy điều này hoàn toàn hợp lý.

Khi bạn thêm một ngoại lệ vào xác minh danh tính của trình duyệt, bạn sẽ được phép tiếp tục đến trang web mới được bảo mật của bạn .

Kết luận

Bạn đã cấu hình server Apache của bạn để xử lý cả yêu cầu HTTP và HTTPS. Điều này sẽ giúp bạn giao tiếp với khách hàng một cách an toàn và tránh các bên ngoài có thể đọc được lưu lượng truy cập của bạn.

Nếu bạn đang lên kế hoạch sử dụng SSL cho một trang web công cộng, có lẽ bạn nên mua certificate SSL từ một tổ chức phát hành certificate tin cậy để ngăn những cảnh báo đáng sợ hiển thị cho mỗi khách truy cập của bạn.


Tags:

Các tin liên quan

Cách bảo mật Apache bằng Let's Encrypt trên Debian 8
2016-12-20
Cách cung cấp các ứng dụng Django với Apache và mod_wsgi trên Debian 8
2016-12-19
Cách tạo chuyển hướng tạm thời và vĩnh viễn với Apache
2016-12-15
Cách di chuyển web root Apache đến một vị trí mới trên Debian 8
2016-12-14
Cách thiết lập mod_rewrite cho Apache trên CentOS 7
2016-10-26
Cách di chuyển web root Apache đến vị trí mới trên Ubuntu 16.04
2016-07-27
Cách thiết lập xác thực mật khẩu với Apache trên Ubuntu 16.04
2016-07-26
Cách cung cấp các ứng dụng Django với Apache và mod_wsgi trên Ubuntu 16.04
2016-05-17
Cách mã hóa kết nối Tomcat 8 với Apache hoặc Nginx trên Ubuntu 16.04
2016-04-29
Cách bảo mật Apache bằng Let's Encrypt trên Ubuntu 16.04
2016-04-21