Linux CentOS 7 下 Nginx 安装使用 Let’ s Encrypt 证书的完整过程

samport · 发布于 2016年12月20日 · 最后由 artone 回复于 2016年12月30日 · 2985 次阅读
26232
本帖已被设为精华帖!

最近在项目上线过程中顺便整理了几篇原创文章,还没发到自己的博客上,先在这里分享了。

CentOS7下nginx安装使用Let’s Encrypt证书的完整过程

网站转成https是大势所趋。但是在国内,推进的过程显然要比国外慢很多。

现阶段如果将自己的网站改成https以后,会碰到这样的尴尬现象:如果在页面上引用了http://的链接或者图片,用户在浏览器上会看到类似该网站是非安全网站的警告,对于网站运营者来说可以说非常冤。由于很多链接是第三方的,没有办法去控制。

对于api接口类的网站,就不存在混合的问题,所以首先应该从api后台接口部分开始用https。(ios已经强制要求接口地址必须为https了)

大牌提供商的SSL证书可不便宜,对于大公司也许不算什么,但是对于小公司及个人来说贵了。现在国外出现的免费SSL服务商Let’s Encrypt,绝对是小公司或者开发者的福音。(现阶段在天朝也能够正常使用,但是未来不清楚。如果天朝有一天自绝于世界网络的话,没准这个证书也会被封堵。)

这里整理了在CentOS7 + nginx安装和使用Let’s Encrypt的完整过程。

官方网站:https://letsencrypt.org

申请let's encript 证书可以有三种方式:

  1. 通过certbot脚本
  2. 通过支持Letencript的虚拟主机提供商
  3. 手工申请manual mode

没有特殊情况,首选采用certbot脚本方式。

由于letsencrypt证书的有效期只有90天,需要长期使用的话,需要在失效前进行延长申请。用certbot脚本工具,可以将延期申请的脚本写到定时任务来自动完成,非常方便。

一、前提条件

  1. 拥有一个域名,例如mydomain.com (在国内主机的用的话,还需要通过ICP备案)
  2. 在域名服务器创建一条A记录,指向云主机的公网IP地址。例如demo.mydomain.com指向xxx.xxx.xxx.xxx的IP地址
  3. 要等到新创建的域名解析能在公网上被解析到。
  4. 据说国内的域名提供商对letsencrypt的支持非常差,但是经过试验,至少现阶段用dnspod解析的域名还没碰到问题。

二、在云主机上安装nginx服务器,配置好最基本的80口ngnix站点

例如,假设为demo.mydomain.com快速配置一个最简单的nginx站点

  1. 安装nginx服务器

    yum install -y nginx
    
  2. 配置一个nginx站点

    mkdir /opt/www/demo.mydomain.com -p
    chown nginx:nginx /opt/www/demo.mydomain.com/ -R
    vi /etc/nginx/conf.d/demo.mydomain.com.conf
    

    将以下内容复制到该文件中

    server {
    listen 80;
    server_name demo.mydomain.com;
    charset utf-8;
    
    root /opt/www/demo.mydomain.com;
    index index.html index.htm;
    
    access_log  /var/log/nginx/demo.mydomain.com_access.log;
    error_log  /var/log/nginx/demo.mydomain.com_error.log;
    }
    
  3. 启动nginx服务

    systemctl start nginx
    

    注意:要确认CentOS服务器开放80口及443端口

  4. 在浏览器上确认访问到http://demo.mydomain.com 如果没有页面的话,正常情况下应该会显示403错误。nginx站点配置完成。

三、安装certbot工具

yum install -y epel-release
yum install -y certbot

四、使用certbot命令初次申请证书

# 使用方法:certbot certonly --webroot -w [Web站点目录] -d [站点域名] -m [联系人email地址] --agree-tos
# 例如:
certbot certonly --webroot -w /opt/www/demo.mydomain.com -d demo.mydomain.com -m myname@gmail.com --agree-tos

注意:联系人email地址要填写真实有效的,letsencrypt会在证书在过期以前发送预告的通知邮件。 申请成功后,会显示以下Congratulations信息

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/[xxx.xxx.xxx]/fullchain.pem. Your cert will
   expire on 2017-03-20. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot again. To
   non-interactively renew *all* of your certificates, run "certbot
   renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

证书的保存位置在:

/etc/letsencrypt/live/demo.mydomain.com/

五、查看证书有效期的命令

openssl x509 -noout -dates -in /etc/letsencrypt/live/[demo.mydomain.com]/cert.pem

显示的是格林威治时间,不知道怎么才能显示当前时区。

六、设置定时任务自动更新证书

letsencrypt证书的有效期是90天,但是可以用脚本去更新。

# 更新证书
certbot renew --dry-run 
# 如果不需要返回的信息,可以用静默方式:
certbot renew --quiet

注意:更新证书时候网站必须是能访问到的

# 可以使用crontab定时更新,例如:
# 每月1号5时执行执行一次更新,并重启nginx服务器
00 05 01 * * /usr/bin/certbot renew --quiet && /bin/systemctl restart nginx

七、应用实例:配置nginx使用证书开通https站点

  1. 生成Perfect Forward Security(PFS)键值

    mkdir /etc/ssl/private/ -p
    cd /etc/ssl/private/
    openssl dhparam 2048 -out dhparam.pem
    
    • Perfect Forward Security(PFS)是个什么东西,中文翻译成完美前向保密,一两句话也说不清楚,反正是这几年才提倡的加强安全性的技术。如果本地还没有生成这个键值,需要先执行生成的命令。
    • 生成的过程还挺花时间的,喝杯咖啡歇会儿吧。
  2. 配置nginx站点,例如/etc/nginx/conf.d/demo.mydomain.com.conf,样例内容如下:

    server {
    listen 80;
    server_name demo.mydomain.com;
    rewrite ^ https://$server_name$request_uri? permanent;
    }
    server {
      listen 443 ssl;
      server_name demo.mydomain.com;
    
      charset utf-8;
      root /opt/www/demo.mydomain.com;
      index index.html index.htm;
    
      access_log  /var/log/nginx/demo.mydomain.com_access.log;
      error_log  /var/log/nginx/demo.mydomain.com_error.log;
    
      # letsencrypt生成的文件
      ssl_certificate /etc/letsencrypt/live/demo.mydomain.com/fullchain.pem;
      ssl_certificate_key /etc/letsencrypt/live/demo.mydomain.com/privkey.pem;
    
      ssl_session_timeout 1d;
      ssl_session_cache shared:SSL:50m;
      ssl_session_tickets on;
    
      ssl_dhparam /etc/ssl/private/dhparam.pem;
    
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      # 一般推荐使用的ssl_ciphers值: https://wiki.mozilla.org/Security/Server_Side_TLS
      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:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK';
      ssl_prefer_server_ciphers on;
    }
    
  3. 在浏览器打开http://demo.mydomain.com, 如果正常跳转到https://demo.mydomain.com,就算成功了。 如果是chrome浏览器,在地址栏点击小锁的图标,可以查看证书的详情

共收到 5 条回复
De6df3 huacnlee 将本帖设为了精华贴 12月20日 15:08
11562

其实 这个脚本很好用的 比官方的程序好用 支持添加crontab 自动续签证书 acme.sh

De6df3
Building dependency tree       
Reading state information... Done
dialog is already the newest version.
gcc is already the newest version.
python is already the newest version.
python-dev is already the newest version.
augeas-lenses is already the newest version.
ca-certificates is already the newest version.
libaugeas0 is already the newest version.
libffi-dev is already the newest version.
libssl-dev is already the newest version.
python-virtualenv is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 217 not upgraded.
Creating virtual environment...
Installing Python packages...

Installing Python packages... 一直不过去,貌似也是和 RubyGems 一样,pip 访问困难

26232

我这边安装cerbot没发现问题。回头我试试这个sh脚本。

De6df3 huacnlee Letsencrypt 在服务器完成网站 HTTPS 配置 中提及了此贴 12月23日 15:33
3417

请问这种免费证书跟那些昂贵的证书有什么差别?

如果是安全等级有差,那么又差多少呢?怎么量化这个指标?

谢谢!

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册