使用Ubuntu在Linux 18.04上通过DNS验证对Enginx进行加密

时间:2020-01-09 10:43:34  来源:igfitidea点击:

如何在具有DNS验证API的Ubuntu 18.04上使用Lets Encrypt安装和保护Nginx?
我的域DNS由Cloudflare托管。
如何安装Lets Encrypt以便在Ubuntu Linux 18.04 LTS服务器上运行的Nginx Web服务器上创建SSL证书?

说明:让Encrypt是一个SSL证书颁发机构。
可以免费获得SSL/TLS证书。
让我们加密根后,ISRG Root X1直接被Microsoft,Google,Apple,Mozilla,Oracle,Blackberry和其他供应商采用。
在本教程中我们学习了如何在Ubuntu 18.04上使用Lets Encrypt保护Nginx,并使用DNS验证您的域以获得SSL/TLS证书。

让Lets在Ubuntu 18.04上使用DNS验证加密Nginx

安装Lets Encrypt来创建SSL证书的过程如下:

  • 安装acme.sh客户端git clone https://github.com/Neilpang/acme.sh.git
  • 为SSL/TLS配置Nginx
  • 配置UFW(防火墙)以打开端口443
  • 使用DNS验证方法为您的域颁发SSL/TLS证书
  • 安装SSL/TLS证书并重新启动Nginx服务器
  • 验证将自动续订证书的cron作业

让我们详细了解所有步骤。

步骤1.安装acme.sh客户端

当然,第一步是安装acme.sh软件以获得SSL证书。
使用apt命令或者apt-get命令安装所需的软件:

$ sudo apt-get install git bc wget curl

克隆仓库

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

安装acme.sh客户端

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

安装后,必须关闭当前终端,然后再次重新打开以使别名生效。
或者简单地输入source命令:

$ sudo -i
# source ~/.bashrc
# acme --version

步骤2.为SSL/TLS配置Nginx服务器

使用mkdir命令创建目录以存储名为cms.theitroad.local的域的证书:

# mkdir -pv /etc/nginx/ssl/letsencrypt/cms.theitroad.local/

生成dhparams.pem文件

无论服务器软件如何,都将使用强大的Diffie-Hellman(DH)组。
运行openssl命令以加快Ubuntu 18.04 LTS上dhparams的生成:

# cd /etc/nginx/ssl/letsencrypt/cms.theitroad.local/
# openssl dhparam -out dhparams.pem -dsaparam 4096

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

使用文本编辑器(例如nano命令或者vim命令)为端口80和443更新名为http.cms.theitroad.local.conf的文件:

# nano /etc/nginx/sites-available/https.cms.theitroad.local.conf

或者

# vim /etc/nginx/sites-available/https.cms.theitroad.local.conf

追加以下配置:

##
## domain http://cms.theitroad.local/
## redirect all http traffic to https version
##
server {
    listen 80;
    listen [::]:80;
    server_name cms.theitroad.local;
    # Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
    return 301 https://$host$request_uri;
}
##
## domain https://cms.theitroad.local/
## Add all config here like root domain, log files, php config and more
##
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
 
    ## my server/domain name and webroot where files are stored
    server_name  cms.theitroad.local;
    root        /home/lighttpd/http;
 
    ## certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
    ssl_certificate /etc/nginx/ssl/letsencrypt/cms.theitroad.local/ssl.crt;
    ssl_certificate_key /etc/nginx/ssl/letsencrypt/cms.theitroad.local/ssl.key;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
 
    # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
    ssl_dhparam /etc/nginx/ssl/letsencrypt/cms.theitroad.local/dhparams.pem;
 
    # intermediate configuration
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
    ssl_prefer_server_ciphers on;
 
    # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
    add_header Strict-Transport-Security max-age=15768000;
 
    # OCSP Stapling --
    # fetch OCSP records from URL in ssl_certificate and cache them
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8;
 
    # log files
    access_log  /var/log/nginx/cms.theitroad.local_access.log;
    error_log   /var/log/nginx/cms.theitroad.local_error.lg;
    ############################
    # Add rest of config below #
    ############################
}

步骤3.使用DNS方法在Ubuntu上为Nginx发行和创建SSL证书

当多个Web服务器在负载均衡器后面运行时,DNS方法允许您颁发SSL/TLS证书。
您需要使用DNS服务提供商提供的API才能将Lets Encrypt使用DNS验证方法。
以下是受支持的DNS提供程序的列表:

  • GoDaddy,Cloudflare,Azure DNS,PowerDNS
  • OVH/kimsufi/soyoustart/runabove,DNSMadeEasy
  • AWS Route53,ISPConfig,Linode,Gandi,DigitalOcean,CloudDNS等
  • 在这里查看完整列表

Cloudflare DNS示例

出于演示目的,我将使用Cloudflare DNS。
首先,通过访问此页面获取Cloudflare API密钥。
执行以下命令:

export CF_Key="YOUR-API-KEY-HERE"
export CF_Email="YOUR-CLOUDFlARE-EMAIL-HERE"

让我们为域cms.theitroad.local颁发证书

语法为:

# acme.sh --issue --dns dns_cf -d www.example.com
# acme.sh --issue --dns dns_cf -d www.example.com -d subdomain.example.com
## wild card certicate
# acme.sh --issue --dns dns_cf -d *.example.com
# acme.sh --issue --dns dns_cf -d cms.theitroad.local

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

现在是时候安装证书并重新加载nginx服务器了:

# acme.sh --installcert -d cms.theitroad.local \
--keypath /etc/nginx/ssl/letsencrypt/cms.theitroad.local/ssl.key \
--fullchainpath /etc/nginx/ssl/letsencrypt/cms.theitroad.local/ssl.crt \
--reloadcmd 'systemctl reload nginx'

测试一下

如果尚未使用基于ufw命令的防火墙打开Nginx服务器tcp端口443,请执行以下操作:

$ sudo ufw allow https comment 'Open all to access Nginx port 443'

打开浏览器并输入网址:

https://cms.theitroad.local/

或者访问SSL实验室以测试您的TLS/SSL配置:

如何续订证书?

# acme.sh --renew -d cms.theitroad.local

关于Cron工作的说明

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

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

如何升级acme.sh客户端?

# acme.sh --upgrade