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:2048yê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 ):
<VirtualHost _default_:443> . . . DocumentRoot "/var/www/example.com/public_html" ServerName www.example.com:443 Tiếp theo, tìm các dòng SSLProtocol và SSLCipherSuite 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:
. . . # SSLProtocol all -SSLv2 . . . # SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA Tìm các dòng SSLCertificateFile và SSLCertificateKeyFile và thay đổi chúng thành folder  mà  ta  đã tạo tại /etc/httpd/ssl :
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 :
    . . . </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 .
(Được khuyến nghị) Sửa đổi file server ảo không được mã hóa để chuyển hướng sang HTTPS
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:
<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.
Các tin liên quan
Cách bảo mật Apache bằng Let's Encrypt trên Debian 82016-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 tạo chứng chỉ SSL tự ký cho Apache trong Ubuntu 16.04
2016-04-21
 

