之前我们有讲过如何给网站开启全站 SSL 现在我们就一起来看看如何在 vps 上给 Nginx 开启 Let’s Encrypt 证书并且自动更新。
这篇文章中的内容较旧,关于 letsencrypt 的配置文章,我写了一篇新的,或许你可以参考看看:letsencrypt 工具改名 certbot
设置环境
首先,我们要准备一下安装环境,这次我使用的是 CentOS 6.7 Final,如果你使用的是 Ubuntu ,那可能某些路径不同,但应该大同小异。首先我们准备需要的环境,这些内容你的vps有些已经内置,有些则需要更新,而有些则没有安装:
1 |
yum -y install git bc |
另外,你需要使用到 pip,如果你的vps并没有预装,请参照这篇文章来升级。
安装
这里我们假定你已经配置好了 Nginx ,现在我们来从 Github 克隆一份 Let’s Encrypt 包使用:
1 |
git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt |
现在,我们来进入 Let’s Encrypt 的目录执行一下 letsencrypt-auto 好让它自己完成初始化。
1 2 3 |
cd /opt/letsencrypt/ ./letsencrypt-auto |
这里你可能会遇到 virtualenv : command not found. 这个错误,那你就需要执行 pip install virtualenv 来安装缺失的包,然后再进行初始化。
一旦初始化完成,我们就可以进行证书签署了!
使用内置插件获取证书
使用内置插件 WebRoot 获取证书的好处是我们可以直接使用 Nginx 提供的 HTTP 服务而不需要关闭 Nginx 好临时让出 80 端口!
编辑 Nginx 配置文件 /usr/local/nginx/conf/nginx.conf ,在里边相应位置插入如下内容:
1 2 3 |
location ~ /.well-known { allow all; } |
修改后的配置文件应该类似这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
//部分隐去 server { listen 80 default_server; #listen [::]:80 default_server ipv6only=on; server_name www.lnmp.org; index index.html index.htm index.php; root /home/wwwroot/default; #error_page 404 /404.html; include enable-php.conf; location /nginx_status { stub_status on; access_log off; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location ~ /\. { deny all; } location ~ /.well-known { allow all; } access_log /home/wwwlogs/access.log access; } |
记住插入到 server 的大括号内部。
现在重启 Nginx 即可: nginx -t && service nginx restart ,如果报错,说明你的配置文件并没有改好。
接下来使用命令获取证书,期间会要求你同意协议以及输入一个邮箱,目的是将来用来升级和恢复密钥:
1 2 3 |
cd /opt/letsencrypt ./letsencrypt-auto certonly -a webroot --webroot-path=/home/wwwroot/default/your-web-home -d example.com -d www.example.com |
值得一提的是,你需要root权限来执行。另外,你的域名必须直接指向你的 vps 地址,如果你用了什么 DNS 加速之类的 CDN,需要取消掉才行,因为它们会隐藏你服务器的真实 IP。
成功完成后,你应该就可以在 /etc/letsencrypt/live/your_domain_name 这个目录里找到你的证书了!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
IMPORTANT NOTES: - If you lose your account credentials, you can recover through e-mails sent to lomyr.jo@gmail.com. - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/www.logcg.com/fullchain.pem. Your cert will expire on 2016-08-14. To obtain a new version of the certificate in the future, simply run Let's Encrypt again. - Your account credentials have been saved in your Let's Encrypt 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 Let's Encrypt so making regular backups of this folder is ideal. - If you like Let's Encrypt, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le |
接下来执行如下命令来生成 迪菲-赫尔曼密钥 以增强安全:
1 |
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 |
冗长的等待之后就是配置 Nginx 使用 SSL 了。
配置 Nginx 的 SSL
总之,在你 Nginx 网站配置目录下找到对应网站的配置文件,你会发现它们都只有关于 80 端口的监听,我们把它先改掉:
1 2 3 4 5 6 7 |
server { listen 80; #listen [::]:80; return 301 https://www.logcg.com$request_uri; server_name www.logcg.com logcg.com; } |
这样让 Nginx 遇到 HTTP 访问时自动转发给 HTTPS。
然后我们来添加 443 端口监听,这个配置就在同一个文件最顶一行开始即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
server { listen 443 ssl; server_name example.com www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl_dhparam /etc/ssl/certs/dhparam.pem; ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_stapling on; ssl_stapling_verify on; add_header Strict-Transport-Security max-age=15768000; location ~ /.well-known { allow all; } # The rest of your server block root /usr/share/nginx/html; index index.html index.htm index.php default.html default.htm default.php; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; # Uncomment to enable naxsi on this location # include /etc/nginx/naxsi.rules } } |
注意这里要把 example.com 换为你的域名,然后把 root /usr/share/nginx/html; 这一行换为你的网站目录。
现在,再次重启你的 Nginx nginx -t && service nginx restart 然后尝试用浏览器打开这个页面来测试结果吧:https://www.ssllabs.com/ssltest/analyze.html?d=www.logcg.com
别急,还有续期
由于 Let’s Encrypt 是免费签发的,为了安全,它只提供为期三个月的有效期——官方也鼓励使用自动化配置来完成续期,总之,你可以使用 ./letsencrypt-auto renew 来手动完成续期,或者你也可以使用 Linux 自己的任务计划功能。
1 |
crontab -e |
如果你在执行这个命令的时候出现找不到命令的情况,就使用如下命令安装它:
1 |
yum -y install vixie-cron crontabs |
总之,在打开的文件中写入如下内容:
1 2 |
30 3 * * 1 /opt/letsencrypt/letsencrypt-auto renew >> /var/log/le-renew.log 35 3 * * 1 service nginx restart |
添加的任务会在每周一凌晨三点半执行证书的更新操作,这样可以保证你的证书永远都是最新的。
本文由 落格博客 原创撰写:落格博客 » 使用 Let’s Encrypt 在 VPS 上为 Nginx 配置 SSL
转载请保留出处和原文链接:https://www.logcg.com/archives/1709.html
可以用一年!
感觉 Let’s Encrypt 麻烦呐, 我现在用 AlphaSSL 通配域名, 简单粗暴….反正也是免费…
我看了下,不是需要$149么???(泛域名证书)
你自己生成 csr 域名填 *.domain, 发我邮箱, 我帮你弄一个证书!
哈抱歉最近太忙了,没顾上搭理博客。。。话说这个证书会有效多久?
可以用一年!
哈,谢啦~暂时用这个也还好了。我做了计划任务每周自动检查续期的,而且目前也没有泛域名的需求,将来有的话再找你咯~XD
必需有 webmaster@logcg.com 或者 admin@logcg.com 企业邮箱, 有哪个你也一起发给我下.
那种用包管理器安装的nginx和apache的几乎是一键式的……
但是自己编译的,很多人尝试letsencrypt-auto都不行,于是只要certonly哈哈~
我都是certonly,一开始都是 standalone呢,嘿嘿。
我也是standalone,不过暂时关闭下web服务器而已。
如果使用CDN的话,其实我也不知道我那次是怎么配置好的证书(服务器上也是用真实的证书而不是自签)……
刚才去cf测试了下,开Development Mode和Pause website都不可以呢
应该是必须指向vps才行……?我也是猜的。
我觉得也是,毕竟CDN本质上也是一种中间人劫持嘛~
嗯呢。可以隐藏真实服务器IP,国内不是都把cloudflare的节点给屏蔽了么
没有吧Σ( ° △ °|||)︴只是cf偶尔会撞墙,刷新下就好了。万一这一天来了,我就得解析回IP了
我以前用cf,后来节点被墙了一大片就不用了。后来cf和国内百度还是谁的合作了,然后国际版好像都不行了我就放弃了。反正现在我的速度够快,就直接跑就好了
cf国内和百度合作的,叫“百度云加速”,你服务器在香港必然快啊~其实我在想,要不我解析回大陆也行的。因为我弄的me域名没备案就解析到腾讯云了。。
其实仔细优化一下的话,应该也不会慢的吧
就ssl的过程慢~/(ㄒoㄒ)/~~
哈哈
你网站评论和打开都有问题,咋上了cloudflare啊,快去修复吧
囧,刚才做透过CDN的let’s encrypt嘛,就暂时把web服务器停了,于是应该是503吧我猜~~
513好像,很奇怪的代码反正
必然,因为服务器关掉了,可能还有cache page吧