使用Ubuntu在Linux 18.04上通过DNS验证对Enginx进行加密
如何在具有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