如何在Debian/Ubuntu Linux上使用Lets Encrypt配置Nginx

时间:2020-01-09 14:16:58  来源:igfitidea点击:

如何在Ubuntu Linux 14.04/16.04 LTS或Debian Linux 8.x/9.x服务器上使用Lets Encrypt免费的ssl证书保护Nginx Web服务器?

Lets Encrypt是您的网站或任何其他项目的免费,自动和开放的证书颁发机构。
您可以获取免费的TLS/SSL证书(包括通配符证书)来为站点访问者创建加密的HTTPS会话。
本教程显示如何使用Lets Encrypt为Nginx Web服务器安装免费的SSL证书,以及如何在nginx服务器上正确部署Diffie-Hellman以获得SSL Labs A +分数。

acme.sh客户端,以在Debian上使用Lets Encrypt保护Nginx

acme.sh是用于LetsEncrypt免费证书的Shell脚本客户端。
它非常易于使用,并且可以与Apache和Nginx一起很好地工作。
它在以下模式下工作:

  • Webroot模式(用于现有服务器)
  • 独立模式(未安装nginx)
  • Apache模式
  • Dns模式

我们的示例设置通过Ubuntu上的Lets Encrypt保护Nginx的安全

在Ubuntu Linux上使用Lets Encrypt的示例Nginx TLS/SSL安全

  • 默认的Nginx配置文件:/etc/nginx/sites-available/default
  • Nginx SSL认证目录:/etc/nginx/ssl/theitroad.com /
  • Nginx DocumentRoot(根)路径:/var/www/html /
  • Nginx TLS/SSL端口:443
  • 我们的示例域:theitroad.com
  • 专用公共IP:10.16.26.69

使用Lets Encrypt配置和保护Nginx的步骤

使用Lets Encrypt保护Nginx的过程如下:

  • 获取acme.sh软件以获取SSL证书:git clone https://github.com/Neilpang/acme.sh.git
  • 创建/.well-known/acme-challenge/目录:mkdir -p/var/www/.well-known/acme-challenge /
  • 在您的域中获取SSL证书:acme.sh --issue -w/DocumentRootPath/-d your-domain
  • 在Nginx Web服务器上配置TLS/SSL:vi/etc/nginx/sites-available/default
  • 验证您域的自动续订Cron作业设置
  • 打开端口443(HTTPS):`ufw允许从任何协议到服务器IP的proto tcp,这里是端口443'。

安装acme.sh

首先,使用apt-get命令或apt命令安装git和bc软件包:

$ sudo apt-get install git bc wget curl socat

克隆Repo

接下来,克隆acme.sh客户端,执行:

$ cd /tmp/
$ git clone https://github.com/Neilpang/acme.sh.git

输出示例:

Cloning into 'acme.sh'...
remote: Counting objects: 1578, done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 1578 (delta 3), reused 0 (delta 0), pack-reused 1563
Receiving objects: 100% (1578/1578), 503.02 KiB | 0 bytes/s, done.
Resolving deltas: 100% (645/645), done.
Checking connectivity... done.

要将acme.sh客户端安装到您的系统,请执行:

$ cd acme.sh/
$ sudo -i
# ./acme.sh --install

输出示例:

[Fri Sep  2 13:08:52 UTC 2015] Installing to /root/.acme.sh
[Fri Sep  2 13:08:52 UTC 2015] Installed to /root/.acme.sh/acme.sh
[Fri Sep  2 13:08:52 UTC 2015] OK, Close and reopen your terminal to start using acme.sh
[Fri Sep  2 13:08:52 UTC 2015] Installing cron job
no crontab for root
no crontab for root
[Fri Sep  2 13:08:53 UTC 2015] Good, bash is installed, change the shebang to use bash as prefered.
[Fri Sep  2 13:08:53 UTC 2015] OK

确保将以下行添加到您的~/.bashrc文件中:

. "$HOME/.acme.sh/acme.sh.env"

安装后,必须关闭当前终端,然后再次重新打开以使别名生效。
或只需执行以下命令:

$ sudo source ~/.bashrc

测试一下(首先成为root用户):

$ sudo -i
# acme.sh

以root用户身份发出的以下所有命令,即首先执行以下命令:

$ sudo -i

创建/.well-known/acme-challenge/目录

执行以下命令(根据您的设置将" D"设置为实际的" DocumentRoot"路径):

# D=/var/www/html
# mkdir -vp ${D}/.well-known/acme-challenge/
###---[ NOTE: Adjust permission as per your setup ]---###
# chown -R www-data:www-data ${D}/.well-known/acme-challenge/
# chmod -R 0555 ${D}/.well-known/acme-challenge/

创建目录以存储SSL证书

# mkdir -p /etc/nginx/ssl/theitroad.com/

生成您的dhparams.pem文件

无论使用哪种服务器软件,都需要使用强大的Diffie-Hellman(DH)组。
生成新组的最简单方法是使用OpenSSL。
执行以下命令以创建dhparam.pem文件:

# cd /etc/nginx/ssl/theitroad.com/

我建议您生成一个4096位组:

# openssl dhparam -out dhparams.pem 4096

或使用以下命令加速dhparams的生成:

# openssl dhparam -out dhparams.pem -dsaparam 4096

输出示例:

Generating DH parameters, 4096 bit long safe prime, generator 2
This is going to take a long time
...............++*++*

为theitroad.com域颁发证书

语法如下

acme.sh --issue -w /DocumentRootPath/ -d example.com
acme.sh --issue -w /DocumentRootPath/ -d www.bar.com -d bar.com
acme.sh --issue -w /path/to/www/htmlRoot/ -d example.com -k 2048

其中:

  • --issue:颁发新证书。
  • -w/DocumentRootPath /:指定用于Web根模式的Web根文件夹。
  • -d example.com:指定一个域,用于发布,续订或撤销等。可以多次使用。
  • -k 2048:指定域密钥的长度。

要为theitroad.com和www.theitroad.com颁发证书,请执行:

# acme.sh --issue -w /var/www/html -d theitroad.com -d www.theitroad.com

例如,如果不给key-length设置,它将使用默认长度2048。
在此示例中,将key-length设置为4096。

# acme.sh --issue -w /var/www/html -d theitroad.com -d www.theitroad.com -k 4096

输出示例:
颁发证书

在Nginx Web服务器上配置TLS/SSL

如下编辑nginx.conf或/etc/nginx/sites-available/default:

# vi /etc/nginx/sites-available/default

添加以下配置指令

## START: SSL/HTTPS theitroad.com ###
server {
    #------- Start SSL config with http2 support ----#
    listen 10.16.26.69:443 http2;
    server_name theitroad.com;
    ssl on;
    ssl_certificate /etc/nginx/ssl/theitroad.com/theitroad.com.cer;
    ssl_certificate_key /etc/nginx/ssl/theitroad.com/theitroad.com.key;
    ssl_session_timeout 30m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
    ssl_session_cache shared:SSL:10m;
    ssl_dhparam /etc/nginx/ssl/theitroad.com/dhparams.pem;
    ssl_prefer_server_ciphers on;
 
    ## Improves TTFB by using a smaller SSL buffer than the nginx default
    ssl_buffer_size 8k;
 
    ## Enables OCSP stapling
    ssl_stapling on;
    resolver 8.8.8.8;
    ssl_stapling_verify on;
 
    ## Send header to tell the browser to prefer https to http traffic
    add_header Strict-Transport-Security max-age=31536000;
 
    ## SSL logs ##
    access_log /var/log/nginx/theitroad.com/ssl_access.log;
    error_log /var/log/nginx/theitroad.com/ssl_error.log;
    #-------- END SSL config -------##
 
    # Add rest of your config below like document path and more ##
}
## END SSL theitroad.com ######

保存并关闭文件。

将颁发的证书安装到Nginx Web服务器

执行以下命令:

# acme.sh --installcert -d theitroad.com --keypath /etc/nginx/ssl/theitroad.com/theitroad.com.key --fullchainpath /etc/nginx/ssl/theitroad.com/theitroad.com.cer --reloadcmd 'systemctl reload nginx'

或者

# acme.sh --install-cert -d theitroad.com \
--key-file /etc/nginx/ssl/theitroad.com/theitroad.com.key \
--fullchain-file /etc/nginx/ssl/theitroad.com/theitroad.com.cer \
--reloadcmd 'systemctl reload nginx'

输出示例:

[Fri Sep  2 15:19:56 UTC 2015] Installing key to:/etc/nginx/ssl/theitroad.com/theitroad.com.key
[Fri Sep  2 15:19:56 UTC 2015] Installing full chain to:/etc/nginx/ssl/theitroad.com/theitroad.com.cer
[Fri Sep  2 15:19:56 UTC 2015] Run Le_ReloadCmd: systemctl reload nginx
[Fri Sep  2 15:19:56 UTC 2015] Reload success

其中:

  • --install-cert:将发布的证书安装到nginx服务器
  • -d theitroad.com:指定一个域,用于发布,续订或撤销等
  • --key-file/etc/nginx/ssl/theitroad.com/theitroad.com.key:发行/续订后,密钥将被复制到该路径
  • --fullchain-file/etc/nginx/ssl/theitroad.com/theitroad.com.cer:发行/续订后,全链证书将被复制到此路径。
  • --reloadcmd'systemctl reload nginx':发布/续订后,用于重新加载服务器

打开TCP端口443

输入以下ufw命令:

# ufw allow proto tcp from any to 10.16.26.69 port 443

测试一下

输入以下网址:

https://theitroad.com

如何续订证书?

执行以下命令:

# acme.sh --renew -d theitroad.com

输出示例:

[Fri Sep  2 15:23:16 UTC 2015] Renew: 'theitroad.com'
[Fri Sep  2 15:23:16 UTC 2015] Skip, Next renewal time is: Mon Nov 21 15:07:55 UTC 2015
[Fri Sep  2 15:23:16 UTC 2015] Add '--force' to force to renew.

如何升级acme.sh客户端?

执行以下命令以将acme.sh客户端升级到来自https://github.com/Neilpang/acme.sh的最新代码

# acme.sh --upgrade

关于Cron工作的说明

计划任务也会尝试为您续订证书。
默认情况下按如下方式安装(您无需采取任何措施):

0 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null