不建议使用 CentOS 6 系统,系统有点老,有很多坑


简介

Let's Encrypt

Let's Encrypt 作为一个公共且免费SSL的项目逐渐被广大用户传播和使用,是由Mozilla、Cisco、Akamai、IdenTrust、EFF等组织人员发起,主要的目的也是为了推进网站从HTTP向HTTPS过度的进程,目前已经有越来越多的商家加入和赞助支持

什么是 HTTPS ?

1.HTTP表示超文本传输协议(HyperText Transfer Protocol),用来传输客户端(浏览器)和WEB服务器之间的内容。当你访问kplayer.me时,服务器就把html,css,js以及图像等文件通过该协议传输到你的浏览器,你的浏览器解析后就展现主页的内容。

2.但是HTTP协议有个问题就是它是明文的,这样就存在安全隐患,如传输内容会被偷窥和窃取;另外在HTTP中通信双方的身份没有进行验证,可能会出现伪装身份的情况,由于任何人都能对服务器发起请求,也使服务器易受DOS攻击;最后客户端无法确定接受报文的完整性,因为中途可能被篡改。

3.那么HTTPS呢?它表示HTTP over SSL,其中的S表示SSL:Secure Socket Layer,中文叫“安全套接层”。SSL利用数据加密技术,防止数据在网络传输过程中不会被截取及窃听。它最早为网景公司Netscape所研发,在IETF(国际互联网工程任务组)进行标准化后改名为 TLS(Transport Layer Security),中文叫做“传输层安全协议”,现在我们常能看到二者的合称SSL/TLS。


获取Let's Encrypt免费SSL证书

Let's Encrypt 考虑到推广HTTPS的普及让用户简单的获取和部署SSL证书,推出了一键部署获取证书

获取SSL证书,服务器需安装 git 和 python v2.7 及以上版本,不会的同学请自行百度哈。

# 使用 git 获取一键部署获取证书脚本 certbot(已更名,原 letsencrypt 项目)
git clone https://github.com/certbot/certbot

# 进入 certbot 目录
cd certbot

# 查看 certbot-auto 工具的用法
./certbot-auto --help all

如果安装出现错误,请查看文章最下面的一些错误,可能会有所帮助

certbot-auto 工具的用法如下:

[root@test certbot]# ./certbot-auto --help all
usage: 
  certbot-auto [SUBCOMMAND] [options] [-d DOMAIN] [-d DOMAIN] ...

Certbot can obtain and install HTTPS/TLS/SSL certificates.  By default,
it will attempt to use a webserver both for obtaining and installing the
certificate. The most common SUBCOMMANDS and flags are:

obtain, install, and renew certificates:
    (default) run   Obtain & install a certificate in your current webserver
    certonly        Obtain or renew a certificate, but do not install it
    renew           Renew all previously obtained certificates that are near expiry
    enhance         Add security enhancements to your existing configuration
   -d DOMAINS       Comma-separated list of domains to obtain a certificate for

  --apache          Use the Apache plugin for authentication & installation
  --standalone      Run a standalone webserver for authentication
  --nginx           Use the Nginx plugin for authentication & installation
  --webroot         Place files in a server's webroot folder for authentication
  --manual          Obtain certificates interactively, or using shell script hooks

   -n               Run non-interactively
  --test-cert       Obtain a test certificate from a staging server
  --dry-run         Test "renew" or "certonly" without saving any certificates to disk

manage certificates:
    certificates    Display information about certificates you have from Certbot
    revoke          Revoke a certificate (supply --cert-path or --cert-name)
    delete          Delete a certificate

manage your account with Let's Encrypt:
    register        Create a Let's Encrypt ACME account
  --agree-tos       Agree to the ACME server's Subscriber Agreement
   -m EMAIL         Email address for important account notifications

optional arguments:
  -h, --help            show this help message and exit
  -c CONFIG_FILE, --config CONFIG_FILE
                        path to config file (default: /etc/letsencrypt/cli.ini
                        and ~/.config/letsencrypt/cli.ini)
  -v, --verbose         This flag can be used multiple times to incrementally
                        increase the verbosity of output, e.g. -vvv. (default:
                        -2)
... ...
... ... 略

我们只需要关注几个重要的命令参数:

  • run:获取并安装证书到当前的Web服务器
  • certonly:获取或续期证书,但是不安装
  • renew:在证书快过期时,续期之前获取的所有证书
  • -d DOMAINS:一个证书支持多个域名,用逗号分隔
  • --apache:使用 Apache 插件来认证和安装证书
  • --standalone:运行独立的 web server 来验证
  • --nginx:使用 Nginx 插件来认证和安装证书
  • --webroot:如果目标服务器已经有 web server 运行且不能关闭,可以通过往服务器的网站根目录放置文件的方式来验证
  • --manual:通过交互式方式,或 Shell 脚本手动获取证书

上面提到了5种方式:--apache、--standalone、--nginx、--webroot、--manual,请根据实际情况选择其一

注意:certbot 的 --standalone 模式会自动启用服务器的 443 端口,来验证域名的归属。如果服务器有服务占用了 443 和 80,则必须先关掉。推荐使用 --webroot 方式

PS:关于通配符证书(泛域名)申请,请参考文章[Let's Encrypt通配符HTTPS证书][4]

## 获取证书
# admin@example.com 为 你的邮箱地址
# example.com 为 所要申请的域名
# -d 有两个,表示将要获取的SSL证书绑定两个域名

## 这里举例 --standalone 方式、–webroot 方式 二选一
# --standalone 方式
./certbot-auto certonly --standalone --email admin@example.com -d example.com -d www.example.com

# –webroot 方式
# /home/wwwroot/www.example.com 为网站目录
./certbot-auto certonly --webroot -w /home/wwwroot/www.example.com -d www.example.com

会有两次确认,分别输入A、Y

[root@test certbot]# ./certbot-auto certonly --standalone --email admin@example.com -d www.example.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y

命令执行完成后,如果看到提示信息 "Congratulations! Your certificate and ..." 就说明证书创建成功了,如下图所示:

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/www.example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/www.example.com/privkey.pem
   Your cert will expire on 2019-02-18. 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@test certbot]#

从证书获取成功的提示信息可以看出获取到的证书保存在 /etc/letsencrypt/live/www.example.com/ 目录下

# 相关的证书文件
.
└── www.example.com
    ├── cert.pem # 网站自身的证书
    ├── chain.pem # 网站证书链中的上级证书
    ├── fullchain.pem # 包含了网站自身证书和上级证书的完整证书链
    ├── privkey.pem # 网站自身证书对应的私钥
    └── README

如果我们使用 nginx 环境,那就需要用到 fullchain.pemprivkey.pem 两个证书文件,接下来演示用 nginx 来安装证书;如果没有使用 nginx 环境,仅仅是单独的 tomcat 或者 gitlab ,那么也是可以使用 SSL 的(gitlab支持反射代理,内置nginx),参考文章: 全民https时代,Let's Encrypt免费SSL证书的申请及使用(Tomcat版) Docker折腾记: (3)Docker Compose构建Gitlab,从配置(https,邮箱验证)到基本可用

配置 Nginx

在操作这一步前要安装好 nginx 环境,这里我以 一个静态页面来演示如何去配置 nginx 启用 https

新建 /etc/nginx/conf.d/default.conf

# example
server {
    listen    80;
    server_name www.example.com; ## 修改成自己的域名
    # 跳转到 https 站点
    rewrite ^(.*)$ https://$host$request_uri;
}

## Normal HTTP host
server {
    listen          443 ssl;
    ssl_certificate             /etc/letsencrypt/live/www.example.com/fullchain.pem; # 证书文件路径
    ssl_certificate_key         /etc/letsencrypt/live/www.example.com/privkey.pem; # 证书文件路径
    server_name www.example.com; ## 修改成自己的域名

    # 配置服务器可使用的加密算法
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;

    # 指定服务器密码算法在优先于客户端密码算法时,使用 SSLv3 和 TLS 协议
    ssl_prefer_server_ciphers on;

    # ssl 版本 可用 SSLv2,SSLv3,TLSv1,TLSv1.1,TLSv1.2 
    # ie6 只支持 SSLv2,SSLv3 但是存在安全问题, 故不支持
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    ## See app/controllers/application_controller.rb for headers set
    ## Individual nginx logs for this GitLab vhost
    access_log  /var/log/nginx/access.log; # 根据实际情况修改
    error_log   /var/log/nginx/error.log; # 根据实际情况修改

    location / {

        root /home/www.example.com/;
        try_files $uri /index.html;
        index index.html index.htm;
    }

}

续期

出于安全原因,Let's Encrypt 颁发的 SSL 证书有效期为90天,我们可以通过自动续期来解决。如果到期没有更新证书,Let's Encrypt 会向申请证书时提交的email发送提醒邮件。

进入到 certbot-auto 脚本所在目录,执行下面的命令即可完成 SSL 证书的续期。

./certbot-auto renew

默认情况下,在证书即将到期之前才能执行续期操作,否则会提示“Cert not yet due for renewal”,即证书尚未到期。如果需要强制执行续期操作,可以加上参数 --force-renew ,命令如下:

./certbot-auto renew --force-renew

同时因为更新证书要用到 80 端口,所以在更新之前要将 nginx 停掉,certbot 提供了两个钩子参数 --pre-hook--post-hook 让我们执行命令前后关闭或开启 nginx。

./certbot-auto renew --pre-hook "service nginx stop" --post-hook "service nginx start"

考虑到有可能会忘记续期,我们可以在 corntab 中加一个定时任务定期执行上面的 renew 命令

# 编辑 linux 自带的 cron
crontab -e

# 在打开的编辑器中添加如下内容
# 每月1日的凌晨4点执行
0 4 1 * * sh /home/certbot/certbot-auto renew --pre-hook "service nginx stop" --post-hook "service nginx start"

问题

如果使用 ubuntu16.04 系统出现报错:

OSError: Command /opt/eff.org/certbot/venv/bin/python2.7 - setuptools pkg_resources pip wheel failed with error code 2

执行下面的操作 :

apt-get purge python-virtualenv python3-virtualenv virtualenv
pip install virtualenv

results matching ""

    No results matching ""