如何在Debian/Ubuntu Linux上使用Lets Encrypt配置Nginx
如何在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