Total Pageviews

Monday, 12 June 2017

配置Let’s Encrypt的免费SSL证书以及自动续期的方法-Certbot

本文推荐的方式,应该是目前最简单的方式了!

Let’s Encrypt应该一款免费开源的SSL生成程序。操作相对比较容易,使用门槛不高。

网上有很多Let’s Encrypt部署方法,有兴趣可以去Google一下。

本文介绍Certbot 来生成HTTPS证书


官网:
https://certbot.eff.org/
https://github.com/certbot/certbot

部署:
本文演示以Centos为例!官方提供多种系统的配置说明,可以自行查阅。
安装certbot:
wget https://dl.eff.org/certbot-auto
chmod 755 certbot-auto
./certbot-auto

如果出现错误信息:
Failed to find apachectl in PATH: /usr/local/nginx/sbin:/usr/local/php/bin:/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

请执行以下代码安装:
yum -y install httpd httpd-devel

如果出现错误信息:
creating virtualenv failed(大意)
解决办法:
如果是Debian / Ubuntu系统,则
apt-get install python-pip
pip install virtualenv
如果是CentOS,则
yum install python-setuptools && easy_install pip
pip install virtualenv

先解析域名
生成证书前,需要将域名全部解析到相应的服务器上,否则生成证书会失败。
然后生成(针对具体的域名的)证书

下面的代码是生成 yourdomain.com / www.yourdomain.com / api.yourdomain.com
如果你要生成更多域名,直接后面再加 -d xxxxx.xx  即可:
./certbot-auto certonly --standalone -d yourdomain.com -d www.yourdomain.com -d api.yourdomain.com --no-bootstrap
(看到api.yourdomain.com了吗?说明Let’s Encrypt支持二级域名,事实上,支持n级域名。)

(注:如果在运行./certbot-auto certonly --standalone -d yourdomain.com后,遇到错误提示:
problem binding to port 443...
那么请先杀死占用443端口的那个进程
root@RegalMusty-VM:~# netstat -tnlp|grep :443    
tcp6       0      0 :::443                  :::*                    LISTEN      25341/goproxy-vps

root@RegalMusty-VM:~# kill 25341
然后再次运行./certbot-auto certonly --standalone -d yourdomain.com  --no-bootstrap,就不会遇错了。
成功运行此命令后,然后就可以再次运行占用443端口的那个进程了。这说明这条命令:
./certbot-auto certonly --standalone -d yourdomain.com其实根本不需要占用443端口,只是运行它时,出现了“problem binding to port 443”的提示而已。)

命令执行过程中,
需要填写你的邮箱 ,输入邮箱回车。
同意TOS条款 ,输入 Y 表示同意,回车。
还有一个同意分享邮箱,输入Y 回车。
生成成功,可到目录 /etc/letsencrypt/live/  查看我们的证书了!最后显示:
...
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/yourdomain.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/yourdomain.com/privkey.pem
   Your cert will expire on 2017-11-08. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot-auto
   again. To non-interactively renew *all* of your certificates, run
   "certbot-auto 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
root@default:~# cd /etc/letsencrypt/live/yourdomain.com/
root@default:/etc/letsencrypt/live/yourdomain.com# ls
README cert.pem  chain.pem  fullchain.pem  privkey.pem
root@default:/etc/letsencrypt/live/yourdomain.com#
(cert.pem和privkey.pem就是我们所需要的东西)

自动续期

首先我们需要将可执行文件 移动一个公共目录。

如果要放到root目录下,只要处理好权限问题也是可以的。


手动延期

./certbot-auto renew --dry-run


利用Cron自动延期

注意路径问题:

./certbot-auto renew --quiet


 Looking for Certbot support? Start here: https://certbot.eff.org/support/



配置网站的证书


我们以Nginx为例!


可参考以下配置哦~~

server

    {

        listen 443;

        server_name api.yourdomain.com;

        index index.html index.htm index.php;

        root  /home/wwwroot/api.cnsecer.com/;

        ssl on;

        ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;

        ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2; #可不要

        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:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-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_prefer_server_ciphers  on; #可不要

        ssl_session_cache    shared:SSL:10m;  #可不要

        ssl_session_timeout  24h; #可不要

        keepalive_timeout 300s; #可不要

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$

        {

            expires      30d;

        }


        location ~ .*\.(js|css)?$

        {

            expires      12h;

        }


        location ~ /\.

        {

            deny all;

        }


        access_log  /home/wwwlogs/yourdomain.com.log;

    }

------------------------


Automatic Dockerized ssl cert from  Let's Encrypt, https://hub.docker.com/r/pierreprinetti/certbot/

Dockerized certbot.
Obtaining certificates

The container will run certbot against all the domains provided with the environment variable domains.

If -e distinct=true is passed, certbot will be run separately for every listed domain.

docker volume create --name nginx-certs

# docker stop nginx

docker run \
  -v nginx-certs:/etc/letsencrypt \
  -e http_proxy=$http_proxy \
  -e domains="example.com,example.org" \
  -e email="me@example.com" \
  -p 80:80 \
  -p 443:443 \
  --rm pierreprinetti/certbot:latest

# docker start nginx

Renewing certificates

You can put in crontab a call to a script shaped like https://gist.github.com/pierreprinetti/f581915d8560533d4210991abb7b3676

With dockerized nginx

Spin your favorite reverse proxy with something like:

docker run \
  --name some-nginx \
  -v nginx-certs:/etc/nginx/certs:ro \
  -p 80:80 \
  -p 443:443 \
  --restart unless-stopped \
  -d nginx:mainline-alpine

Example configuration for example.com in your dockerized nginx:

server {
  listen      443 http2;
  listen      [::]:443 http2;
  server_name example.com;

  ssl on;
  ssl_certificate     /etc/nginx/certs/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/nginx/certs/live/example.com/privkey.pem;

  [...]



from https://github.com/pierreprinetti/certbot

------------

 如何获取Let's Encrypt的免费SSL证书

Let's Encrypt是国外一个公共的免费SSL项目,由 Linux 基金会托管,它的来头不小,由Mozilla、思科、Akamai、IdenTrust和EFF等组织发起,目的就是向网站自动签发和管理免费证书,以便加速互联网由HTTP过渡到HTTPS,目前Facebook等大公司开始加入赞助行列。

Let's Encrypt已经得了 IdenTrust 的交叉签名,这意味着其证书现在已经可以被Mozilla、Google、Microsoft和Apple等主流的浏览器所信任,你只需要在Web 服务器证书链中配置交叉签名,浏览器客户端会自动处理好其它的一切,Let's Encrypt安装简单,未来大规模采用可能性非常大。

Let's Encrypt虽然还在测试当中,但是市场需求非常大,已经有非常多的朋友迫不及待地安装并用上了Let's Encrypt。Let's Encrypt向广大的网站提供免费SSL证书,不管是对于网站站长、互联网用户,还是对整个Web互联网,都是非常有利的,它有利于整个互联网的安全。

本篇文章就来为大家讲解一下如何获取Let's Encrypt免费SSL证书.

一、 安装Let's Encrypt免费SSL准备

1、Let's Encrypt官网:

    1、官方网站:https://letsencrypt.org/
    2、项目主页:https://github.com/letsencrypt/letsencrypt

2、安装Let's Encrypt脚本依赖环境:(这一部分可以跳过,因为官方提供的Let's Encrypt脚本会自动检测并安装)


# Debian
apt-get install git

# CentOS 6
yum install centos-release-SCL && yum update
yum install python27
scl enable python27 bash
yum install python27-python-devel python27-python-setuptools python27-python-tools python27-python-virtualenv
yum install augeas-libs dialog gcc libffi-devel openssl-devel python-devel
yum install python-argparse

# CentOS 7
yum install -y git python27
yum install -y augeas-libs dialog gcc libffi-devel openssl-devel python-devel
yum install python-argparse

3、查看自己的VPS主机到底是安装了哪个操作系统版本,可以执行命令:cat /etc/issue 或者 cat /etc/redhat-release。

二、获取Let's Encrypt免费SSL证书

1、获取Let's Encrypt免费SSL证书很简单,你只需要执行以下命令,就会自动在你的VPS上生成SSL证书和私钥。

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto

2、经过部落测试,上述代码对于Debian系统支持最好,可以完成自动检测并安装相应的软件。如果你是使用其它的Linux系统,Redhat或CentOS 6可能需要配置EPEL软件源,Python需要2.7版本以上。


3、执行上述命令后,会弹出对话框,同意用户协议。


4、接着会提示让你关闭Nginx或者Apache。


5、Let's Encrypt需要用到80和443端口,所以你需要关闭那些占用这两个端口的应用。


6、当你看以下内容时,就表明你的Let's Encrypt免费SSL证书获取成功了。


IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/urdomain.com/fullchain.pem. Your cert will
   expire on 2016-03-09. To obtain a new version of the certificate in
   the future, simply run Let's Encrypt again.
 - If 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


三、利用脚本快速获取Let's Encrypt SSL证书

1、嫌上面的麻烦,不妨来试试利用脚本快速获取Let's Encrypt SSL证书,调用 acme_tiny.py 认证、获取、更新证书,不需要额外的依赖。

    1、项目主页:https://github.com/xdtianyu/scripts/tree/master/lets-encrypt

2、下载到本地:


wget https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.conf
wget https://raw.githubusercontent.com/xdtianyu/scripts/master/lets-encrypt/letsencrypt.sh
chmod +x letsencrypt.sh


3、配置文件。只需要修改 DOMAIN_KEY DOMAIN_DIR DOMAINS 为你自己的信息

ACCOUNT_KEY="letsencrypt-account.key"
DOMAIN_KEY="urdomain.com.key"
DOMAIN_DIR="/var/www/urdomain.com"
DOMAINS="DNS:urdomain.com,DNS:www.urdomain.com"

4、本脚本在Debian下运行正常,但是如果你使用的是CentOS,你还需要修改letsencrypt.sh中openssl.cnf的位置,先找到你的CentOS的openssl.cnf位置。然后打开letsencrypt.sh,将路径/etc/ssl/openssl.cnf替换为你的新路径,例如/etc/pki/tls/openssl.cnf。

PS:20151214更新,该脚本已经更新,现在不需要对CentOS的openssl.cnf进行修改了.

5、执行过程中会自动生成需要的 key 文件。运行:
./letsencrypt.sh letsencrypt.conf

6、注意需要已经绑定域名到 /var/www/www.urdomain.com 目录,即通过 http://urdomain.com https://www.urdomain.com 可以访问到 /var/www/urdomain.com目录,用于域名的验证。


7、正常按照上面的操作即可成功获取到Let's Encrypt SSL证书,不过经过部落测试最大的问题就是“DNS query timed out”,由于域名DNS解析的问题导致无法验证域名从而获取SSL证书不成功。

Traceback (most recent call last):
  File "/tmp/acme_tiny.py", line 198, in
    main(sys.argv[1:])
  File "/tmp/acme_tiny.py", line 194, in main
    signed_crt = get_crt(args.account_key, args.csr, args.acme_dir, log=LOGGER, CA=args.ca)
  File "/tmp/acme_tiny.py", line 149, in get_crt
    domain, challenge_status))
ValueError: hkh.freehao123.info challenge did not pass: {u'status': u'invalid', u'validationRecord': [{u'url': u'http://hkh.freehao123.info/.well-known/acme-challenge/sikHlqvbN4MrWkScgr1oZ9RX-lR1l__Z7FWVLhlYR0Q', u'hostname': u'hkh.freehao123.info', u'addressUsed': u'', u'port': u'80', u'addressesResolved': None}],  u'https://acme-v01.api.letsencrypt.org/acme/challenge/5m1su6O5MmJYlGzCJnEUAnvhweAJwECBhEcvsQi5B2Q/1408863', u'token': u'sikHlqvbN4MrWkScgr1oZ9RX-lR1l__Z7FWVLhlYR0Q', u'error': {u'type': u'urn:acme:error:connection', u'detail': u'DNS query timed out'}, u'type': u'http-01'}

8、经过对比发现,国内的DNSPOD、阿里云DNS、CloudXNS等都会出现Let's Encrypt 验证域名超时的情况,

国外的Namecheap DNS、Linode DNS、Domain.com DNS等都是没有问题.

Let's Encrypt免费SSL证书续期
1、Let's Encrypt免费SSL证书有效期是90天,也就是每三个月你就得续期一次。采用官方的方法获取到的免费SSL证书,你不需要更改Apache和Nginx配置代码,执行以下代码即可自动替换证书为新的(注意修改域名和邮箱):

./letsencrypt-auto certonly --renew-by-default 
--email you@gmail.com -d urdomain.com -d www.urdomain.com
 
采用上面脚本快速获取Let's Encrypt免费SSL证书的,在90天内再次执行命令即可:
./letsencrypt.sh letsencrypt.conf。 

Let's Encrypt免费SSL证书使用小结

Let's Encrypt免费SSL证书获得方式比较简单,不管采用何种方式,只要能够得到证书和密钥,我们就可以在自己的服务器上配置好SSL。上面讲到了Apache和Nginx的配置方法,如果你有自己的虚拟主机面板,可以直接通过后台添加证书和私钥文件即可.
------------

由于项目本身的开放性,衍生了大量的客户端。官方客户端有certbot,第三方客户端则五花八门,各种编程语言所编写的客户端,林林总总的加起来差不多有上百款,其中有些知名度的被官方进行汇总。需要注意的是,官方并不检查第三方客户端的可用性、稳定性、安全性,所以对这方面不熟悉的,应该使用官方的客户端certbot,以免出现各种各样的意外状况。若是你不满足于官方客户端,可以查看官网罗列的第三方客户端列表,了解更加详细的信息。
certbot是一个非常小巧易用的Let’s Encrypt 证书自动安装客户端,可以傻瓜化的安装SSL证书并自动配置Web server,让没有电脑基础的人简单的安装并配置HTTPS,帮助有电脑基础的人节省时间,广泛支持各种常见的操作系统和Web server。
-------------

在线获取Let's Encrypt的免费SSL证书(在线获取的免费SSL证书好像不太靠谱,我试过)

1、SSL For Free
免费,私密,安全。

2、Get HTTPS for free
源码:https://github.com/diafygi/gethttpsforfree
https://github.com/diafygi/howtogetfreehttps
免费,私密,安全.
-------------

相关帖子:
http://briteming.blogspot.de/2017/04/ssl.html
http://briteming.blogspot.com/2017/08/lets-encrypt-shell-script.html
https://wiki.archlinux.org/index.php/Let’s_Encrypt

No comments:

Post a Comment

Note: only a member of this blog may post a comment.