安装让我们在Debian 9中使用SSL / TLS加密和保护Nginx

本教程将向您展示如何在Debian 9上安装和保护Nginx Web服务器,并使用Let's Encrypt Cer免费发布的TLS证书。

安装让我们在Debian 9中使用SSL / TLS加密和保护Nginx

本教程将向您展示如何使用Let's Encrypt认证中心免费发布的TLS证书在Debian 9上安装和保护Nginx Web服务器。 此外,我们将在证书过期之前使用cron作业配置Lets'加密TLS证书的自动续订。

TLS(也称为传输层安全性)是一种网络协议,它使用SSL证书来加密在服务器和客户端之间或在诸如Nginx服务器等网络服务器和浏览器之间流动的网络流量。 在这两个实体之间交换的所有数据都是安全的,即使使用诸如中间人攻击或包嗅探中的人的技术拦截连接也不能被解密。 certbot软件包是Let's Encrypt CA提供的官方客户端实用程序,可用于在Debian中生成和下载免费的Let's Encrypt证书。

要求

  • 在Debian 9中安装LEMP Stack。
  • 具有适当DNS记录的公共注册域名(子域的记录或CNAME记录)。
  • 直接访问服务器的控制台或远程SSH访问服务器。
  • 具有root权限的用户帐户或直接访问root帐户。

安装Certbot客户端实用程序

为了安装让我们从Debian官方存储库中加密Debian 9中的cerbot客户端实用程序,打开终端并使用root权限发出以下命令,如以下屏幕截图所示。

apt-get install certbot

在Debian 9上安装Certbot

Debian apt工具是Debian主软件包管理器的命令行界面,在初步检查之后,会询问您是否同意继续安装certbot软件包及其所需的所有依赖项。 要接受在服务器的控制台提示符下使用yes )安装软件答案的过程。

让我们加密证书

要生成并下载让我们为域加密证书,首先确保Nginx Web服务器已启动并运行,并且至少可以从Internet访问端口80。 要验证Nginx是否正在运行,请使用root权限执行以下命令。

sudo systemctl status nginx

如果服务器还没有运行,用下面的命令启动Nginx守护进程。

sudo systemctl start nginx

如果您在Debian中安装了通用防火墙(如UFW防火墙),并阻止端口80和443上的所有传入连接,请发出以下命令打开系统中的HTTP和HTTPS端口。

sudo ufw allow 80/tcp

sudo ufw allow 443/tcp

为了获取您的域的证书,请在控制台中执行cerbot命令,并使用以下参数和标志,如下所述。 使用root权限运行该命令,并使用-d标志提供您想要获取证书的域名和所有其他子域。 此外,请提供--standalone选项,以便certbot不会干扰Nginx配置文件。 使用此选项发出证书时,必须停止Nginx服务器。

cerbot命令语法:

sudo certbot certonly --standalone –d yourdomain.com –d www.yourdomain.com

当您第一次运行certbot命令并获取证书时,系统会提示您添加您的电子邮件地址并同意Let's Encrypt服务条款。 写' a '同意服务条款' 不' ,不与Let's Encrypt合作伙伴分享您的电子邮件地址。 最后,在获得域的证书之后,请阅读页脚注释以找到证书系统路径及其到期日期。

让我们加密SSL证书的另一种方法

要通过“ webroot ”插件获取Let's Encrypt证书,请使用以下语法。 添加Nginx Web根目录,默认位于/ var / www / html / system路径,同时使用--webroot-w标志签发certbot命令。 另外,请确保Nginx具有对web根目录的完全写入权限,以创建/.well-known目录。

--webrot   cerbot的选项还会要求您添加您的电子邮件地址以更新证书和安全通知。   Certbot   客户端具有可以检测虚假电子邮件地址的内置代码。 您必须提供可公开访问的电子邮件地址才能继续获得证书。

certbot certonly --webroot –w /var/www/html/ -d yourdomain.com –d www.yourdomain.com

 

Saving debug log to /var/log/letsencrypt/letsencrypt.log

Enter email address (used for urgent renewal and security notices) (Enter 'c' to

cancel):contact@yourdomain.com  #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):youremail@domain.com

 

-------------------------------------------------------------------------------

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 /var/www/html/  for all unmatched domains.

Waiting for verification...

Cleaning up challenges

 

IMPORTANT NOTES:

 - Congratulations! Your certificate and chain have been saved at

    /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 /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

 

用Certbot获得SSL证书

为TLS配置Nginx(SSL)

一个Nginx完全默认的TLS配置文件应该看起来像下面的文件摘录。

/ etc / nginx / sites-enabled / default-ssl文件示例:

    server {
                    listen 443 ssl default_server;
                    listen [::]:443 ssl default_server;
      
                server_name  www.yourdomain.com yourdomain.com;
                #server_name _;
                               
                root /var/www/html;
                               
                access_log /var/log/nginx/access.log;
                error_log /var/log/nginx/error.log;
              
               #SSL Certificates
                ssl_certificate "/etc/letsencrypt/live/www.yourdomain.com/cert.pem";
                ssl_certificate_key "/etc/letsencrypt/live/www. yourdomain.com/privkey.pem";
                ssl_dhparam /etc/nginx/dhparam.pem;
               
                ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                #ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
 
                ssl_session_cache shared:SSL:1m;
               ssl_session_timeout 10m;
                ssl_ciphers HIGH:!aNULL:!MD5;
                ssl_prefer_server_ciphers  on;
               
                add_header Strict-Transport-Security "max-age=31536000;
    #includeSubDomains" always;
 
                location / {
        index index.php index.html index.htm;
                    try_files $uri $uri/ /index.php?$args $uri/ =404;
                }
 
               
                set $cache_uri $request_uri;
               
                location ~ /.well-known {
                allow all;
                                }
              
                #
                #             # With php-fpm (or other unix sockets):
                                fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
                #             # With php-cgi (or other tcp sockets):
                #             fastcgi_pass 127.0.0.1:9000;
                }

               # deny access to .htaccess files, if Apache's document root
                # concurs with nginx's one
                #
                #location ~ /\.ht {
                #             deny all;
                #}
               
    }

通过FastCGI Process Manager处理PHP脚本的代码行也可以在这段摘录中找到,代码如下。

location ~ \.php$ {
                                include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
                }

安装让我们在Nginx中加密证书

让我们加密证书和密钥存储在Debian的/etc/letsencrypt/live/www.yourdomain.com/目录中。 针对上述目录的ls命令将显示所有证书组件,例如链文件,完整链文件,私钥和证书文件。

ls /etc/letsencrypt/live/www.yourdomain.com/

要在Nginx Web服务器TLS配置文件中安装Let's Encrypt证书,请打开Nginx的default-ssl文件,并更新以下代码以反映让我们为您的域加密证书文件路径,如下面的摘录所示。

nano /etc/nginx/sites-enabled/default-ssl

更改下面的行如下:

                ssl_certificate "/etc/letsencrypt/live/www.yourdomain.com/cert.pem ";
                ssl_certificate_key "/etc/letsencrypt/live/www.yourdomain.com /privkey.pem";

  设置让我们加密证书路径

另外,如果ssl_dhparam语句存在于Nginx SSL配置中,则必须通过发出以下命令来生成新的2048位Diffie-Hellman密钥。 根据您的系统随机性或熵,Diffie-Hellman密钥参数生成需要一段时间。

openssl dhparam –out /etc/nginx/dhparam.pem 2048

最后,在重新启动Nginx守护程序以反映更改来激活Nginx TLS配置之前,首先检查Nginx配置是否存在潜在的语法错误。 之后,如果Nginx配置文件测试成功,则重新启动Nginx守护程序,通过发出以下命令,加载新的配置以及Let's Encrypt证书。

nginx -t

service nginx restart

重新启动Nginx

为了验证nginx服务是否在端口443上拥有一个处于监听状态的打开的套接字,执行netstat命令,如下面的摘录所示。

netstat –tulpn | grep -e 443 -e LISTEN

您还应该打开浏览器并通过HTTPS协议导航到您的域名。 如果让我们的加密证书在Nginx中成功应用,那么SSL握手应该可以顺利运行而不会引发任何错误。

https://www.yourdomain.com

强制网络流量到HTTPS

要迫使你的域名访问者仅通过HTTPS协议浏览你的网站,打开Nginx站点启用的默认配置文件,并添加以下行,强制命中端口80的所有请求被重定向到301状态码(永久移动)到端口443。

nano /etc/nginx/sites-enabled/default

重定向语句应该看起来像下面的摘录所示。

server_name www.yourdomain.com yourdomain.com;
return         301 https://$server_name$request_uri;

强制HTTPS

随后,通过发出以下命令重新启动Nginx守护程序以应用更改。

service nginx restart

最终检查

要进一步调查让我们加密CA生成的证书,您可以使用现代的网络浏览器,如Chrome。 从Chrome浏览器访问您的域名,然后按F12功能键打开开发者工具。 导航到安全选项卡并点击查看证书按钮以打开证书,如以下屏幕截图所示。

验证SSL证书

在Chrome浏览器中显示的SSL证书详细信息

调查SSL证书的另一个有用的实用程序证明是openssl命令行实用程序。 为了显示Let's Encrypt CA证书的额外信息,请在Linux控制台中执行以下命令。

openssl s_client –connect www.yourdomain.com:443

使用OpenSSL命令检查SSL证书

自动更新让我们加密证书

为了自动更新在加密日期之前让我们加密CA颁发的证书,请通过发出以下命令来安排每天凌晨2:00运行一次crontab作业。 执行的cron作业的输出将被定向到一个日志文件,存储在/var/log/letsencrypt.log中

crontab –e

克朗工作更新证书。

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

就这样! 有关Let's Encrypt证书和实用程序的其他更高级配置,请访问以下Internet地址:https://certbot.eff.org/docs/