如何使用SSL来保护Nginx,让我们在FreeBSD中加密

在本指南中,我们将讨论如何使用加密证书颁发机构提供的TLS / SSL证书在FreeBSD中保护Nginx Web服务器。

在本指南中,我们将讨论如何使用加密证书颁发机构提供的TLS / SSL证书在FreeBSD中保护Nginx Web服务器。 我们还会告诉您如何在到期日之前自动续订“加密”加密证书。

TLS传输层安全性的缩写,它是一种以HTTP协议运行的协议,它使用证书和密钥来封装数据包,并加密服务器和客户端之间交换的数据,或者在这种情况下, Nginx Web服务器与客户端浏览器,以保护连接,从而可能拦截流量的第三方无法解密传输。

另请阅读安装我们在FreeBSD上加密Apache

通过安装certboot客户端实用程序(这是用于生成和下载证书的官方使用加密客户端),可以大大简化在FreeBSD中获取免费“ Let's Encryption ”证书的过程。

要求

  1. 在FreeBSD中安装FBEMP(Nginx,MariaDB和PHP)

第1步:配置Nginx TLS / SSL

1.默认情况下, FreeBSD中未启用TLS / SSL服务器配置,因为TLS服务器块语句已在Nginx默认配置文件中注释。

为了激活Nginx中TLS服务器,打开nginx.conf配置文件,搜索定义SSL服务器启动的行,并将整个块更新为下面的示例。

# nano /usr/local/etc/nginx/nginx.conf

Nginx HTTPS块摘录:

Nginx HTTPS配置
server {
listen 443 ssl  default_server;
server_name  www.yourdomain.com;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
error_page   500 502 503 504  /50x.html;
location = /50x.html {
root   /usr/local/www/nginx-dist;
}
location / {
root   /usr/local/www/nginx;
index  index.html index.htm;
try_files $uri $uri/ /index.php?$args;
}
ssl_certificate "/usr/local/etc/letsencrypt/live/www.yourdomain.com/cert.pem";
ssl_certificate_key "/usr/local/etc/letsencrypt/live/www.yourdomain.com/privkey.pem";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_dhparam /usr/local/etc/nginx/dhparam.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers  on;
# Use gzip compression
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 5;
gzip_buffers 16 8k;
gzip_http_version 1.0;
# Set a variable to work around the lack of nested conditionals
set $cache_uri $request_uri;
location ~ /.well-known {
allow all;
}
location ~ \.php$ {
root	/usr/local/www/nginx;
fastcgi_pass   127.0.0.1:9000;
fastcgi_index  index.php;
#fastcgi_param  SCRIPT_FILENAME /scripts$fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $request_filename;    
include        fastcgi_params;
}	
}

除了SSL块之外,上述块还包含一些用于启用gzip压缩FastCGI Process Manager的语句,用于将PHP代码传递给PHP-FPM网关以运行动态Web应用程序。

将上述代码添加到Nginx主配置文件后,请不要重新启动守护程序或应用设置,然后再安装并获取域的加密证书。

第2步:在FreeBSD中安装Certbot Client

2.在FreeBSD中安装加密certbot客户端实用程序的过程涉及下载py-certbot的源代码,并通过下列命令进行本地编译。

# cd /usr/ports/security/py-certbot
# make install clean

编译py-certbot实用程序与安装常规二进制包相比需要很多时间。 在此期间,需要在FreeBSD中本地编译一系列依赖关系。

此外,您的屏幕上将出现一系列提示,要求您选择在编译时为每个依赖关系使用哪些软件包。 在第一个屏幕上,按[空格]键选择以下工具,以编译python27依赖关系,如下图所示。

  • IPV6
  • LIBFFI
  • NLS
  • PYMALLOC
  • THREADS
  • UCS4支持Unicode
启用UCS4的Unicode

启用UCS4的Unicode

4.接下来,为gettext-tools依赖选择DOCSTHREADS ,然后按OK继续,如下图所示。

安装文档

安装文档

5.在下一个屏幕上,禁用对于libffi-3.2.1TESTS选项,然后按OK进一步移动。

禁用用于libffi的TESTS

禁用用于libffi的TESTS

6.接下来,点击空格选择DOCS for py27-enum34依赖关系,这将安装此工具的文档,然后按OK继续,如下图所示。

安装Py27文档

安装Py27文档

最后,选择通过按[空格]键安装py27-openssl依赖关系的示例样例,然后点击“ 确定”完成py-certbot客户端的编译和安装过程。

安装Py27 Openssl

安装Py27 Openssl

8.在编译和安装py-certbot实用程序完成后,请运行以下命令,以便在最新版本的软件包中升级工具,如下图所示。

# pkg install py27-certbot
升级Py-certbot工具

升级Py-certbot工具

9.为了避免在获得免费的Let's Encrypt证书时可能发生的一些问题,最常见的错误是“ pkg_resources.DistributionNotFound ”,请确保系统中还存在以下两个依赖关系: py27-saltpy27-acme

# pkg install py27-salt
# pkg install py27-acme

第3步:安装我们在FreeBSD上加密Nginx证书

10.为了获取我们为您的域加密独立证书,请运行以下命令,并提供您希望通过暗示-d标志获取证书的域名和所有子域。

# certbot certonly --standalone -d yourdomain.com -d www.yourdomain.com
安装可以加密Nginx

安装可以加密Nginx

11.在生成证书时,您将被要求输入您的电子邮件地址,并同意我们加密服务条款。 键入键盘以同意并继续,您还将被问及是否愿意与我们的加密合作伙伴分享您的电子邮件地址。

如果您不想共享您的电子邮件地址,请在提示中输入no字词,然后按[Enter]键继续。 在您的域名证书成功获得后,您将收到一些重要的注释,通知您证书存储在系统中以及何时到期。

让加密摘要

让加密摘要

12.如果您希望通过添加您的域的Nginx服务器的webroot目录,使用“ webroot ”插件获取加密证书,请使用--webroot-w标志发出以下命令。 默认情况下,如果您没有更改Nginx webroot路径,则应该位于/ usr / local / www / nginx / system路径中。

# certbot certonly --webroot -w /usr/local/www/nginx/ -d yourdomain.com -d www.yourdomain.com

如在获得证书的--webroot程序中,-- --webroot程序还将要求您提供证书续展和安全通知的电子邮件地址,以便同意我们加密条款和条件, no或是或否则不共享电子邮件地址让我们加密合作伙伴,如下面的示例所示。

请注意,certbot客户端可以检测到假电子邮件地址,并且在您提供真实的电子邮件地址之前不会让您继续生成证书。

Cerbot样品:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):[email protected]  #A fake email address will be detected
There seem to be problems with that address. Enter email address (used for
urgent renewal and security notices)  If you really want to skip this, you can
run the client with --register-unsafely-without-email but make sure you then
backup your account key from /etc/letsencrypt/accounts   (Enter 'c' to cancel):[email protected]
-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel: a ------------------------------------------------------------------------------- Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about EFF and our work to encrypt the web, protect its users and defend digital rights. ------------------------------------------------------------------------------- (Y)es/(N)o: n Obtaining a new certificate Performing the following challenges: http-01 challenge for www.domain.com Using the webroot path /usr/local/www/nginx/ for all unmatched domains. Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /usr/local/etc/letsencrypt/live/www.yourdomain.com/fullchain.pem. Your cert will expire on 2017-12-28. To obtain a new or tweaked version of this certificate in the future, simply run certbot again. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /usr/local/etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le

第4步:更新Nginx TLS证书

13.获取的位置我们在FreeBSD中加密证书和密钥是/usr/local/etc/letsencrypt/live/www.yourdomain.com/系统路径。 问题ls命令为了显示您的Let's Encrypt证书的组件:链接文件,全链文件,私钥和证书文件,如下例所示。

# ls /usr/local/etc/letsencrypt/live/www.yourdomain.com/
列表加密域SSL密钥

列表加密域SSL密钥

14.为了安装我们在Nginx Web服务器中加密您的域的证书,请打开Nginx主配置文件或Nginx TLS服务器的配置文件,以防它是单独的文件,并修改以下行以反映让我们加密的路径颁发证书,如下图所示。

# nano /usr/local/etc/nginx/nginx.conf

将以下行更新为如下示例:

ssl_certificate "/usr/local/etc/letsencrypt/live/www.yourdomain.com/cert.pem";
ssl_certificate_key "/usr/local/etc/letsencrypt/live/www.yourdomain.com/privkey.pem";
配置Nginx的SSL

配置Nginx的SSL

另外,如果Nginx SSL配置中存在ssl_dhparam行,则应使用以下命令生成一个新的2048Diffie-Hellman密钥:

# openssl dhparam –out /usr/local/etc/nginx/dhparam.pem 2048 

16.最后,为了激活Nginx TLS配置,首先检查Nginx全局配置是否存在可能的语法错误,然后重新启动Nginx服务以通过发出以下命令来应用SSL配置。

# nginx -t
# service nginx restart

17.通过发出以下命令,确认Nginx守护程序是否绑定在443端口上,该命令可以列出系统中处于监听状态的所有打开的网络套接字。

# netstat -an -p tcp| grep LISTEN
# sockstat -4 
验证Nginx端口

验证Nginx端口

18.您还可以通过打开浏览器通过HTTPS协议访问您的域名地址,并键入以下地址,以确认我们的加密证书正常运行。 因为您正在使用有效的证书颁发机构生成的证书,浏览器中不应显示任何错误。

https://www.yourdomain.com

19. Openssl实用程序还可以通过运行带有以下选项的命令来帮助您查找从Let's Encrypt CA获取的证书的信息。

# openssl s_client -connect www.yourdomain.com:443
检查SSL证书

检查SSL证书

如果您想强制Nginx将您在80端口上的所有http到https请求定向到HTTPS ,请打开Nginx配置文件,找到80端口的服务器指令,并在server_name语句后加上下面的行,如下例所示。

rewrite ^(.*) https://www.yourdomain.com$1 permanent;
Nginx将HTTP重定向到HTTPS

Nginx将HTTP重定向到HTTPS

20.设置自动更新,让我们在过期之前加密权限可以通过安排cron作业每天运行一次,发出以下命令来完成。

# crontab -e

Cron任务更新证书。

0 0 * * * certbot renew >> /var/log/letsencrypt.log

就这样! Nginx现在可以使用我们加密免费证书为您的访问者提供安全的Web应用程序。