通过 Certbot 安装 Let's Encrypt 证书,实现免费的全站 HTTPS 访问

参考文献

通过 Certbot 安装 Let's Encrypt 证书,来实现全站的 HTTPS 访问

学院军 - 将博客应用从 HTTP 协议免费升级到 HTTPS

certbot官网地址

  • 打开首页先选择自己的系统版本 (我这里采用的 web 服务器是 nginx,系统是 centos7 )传输门
certbot页面选择自己的系统版本
  • 可以按照官网提供的操作文档执行命令

# 安装 certbot 客户端工具

sudo yum install certbot python2-certbot-nginx

# 自动检测 nginx 配置以及确定哪些网站需要配置 ssl (会列出全部的 nginx 配置信息)

sudo certbot --nginx

# 设置 crontab 计划任务,自动更新 ssl 证书

echo "0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null

以下记录本人安装 certbot 的整个过程

系统环境

服务器:阿里云服务器
系统: centos 7
web 服务器: nginx
安装过宝塔 (安装过宝塔后,nginx 的主配置文件位于 /www/server/nginx/conf/

整体流程是按照官网的流程来操作的,但是其中会遇到各种问题,出现的问题如下:

  1. 安装 certbot 客户端工具 (此流程正常),安装过程中,该直接回车的就回车,该直接选 Yes 的输入 Y 然后回车

sudo yum install certbot python2-certbot-nginx

  1. 配置 ssl 时,一路出错,如下:

sudo certbot --nginx

重要错误信息如下:


pkg_resources.ContextualVersionConflict: (cryptography 2.1 (/usr/lib64/python2.7/site-packages), Requirement.parse('cryptography>=2.3'), set(['PyOpenSSL']))

PyOpenSSL相关报错信息

查看 PyOpenSSL 版本信息,发现确实是版本过低的原因


pip show PyOpenSSL

解决方案:更新相应的 python 包


pip install -U PyOpenSSL

pip install -U cryptography

再次执行以下命令


sudo certbot --nginx

再次发现报错,错误信息如下:


ImportError: cannot import name UnrewindableBodyError

解决方案:安装相应的 python 包


# 更新 pip
pip install --upgrade pip

# 卸载 urllib3
pip uninstall urllib3

# 重新再次下载
pip install urllib3

再次执行以下命令


sudo certbot --nginx

再次发现报错,错误信息如下:


ImportError: No module named urllib3.exceptions  

解决方案:直接暴力下载相应的 pyOpenSSL 包


yum -y install http://cbs.centos.org/kojifiles/packages/pyOpenSSL/16.2.0/3.el7/noarch/python2-pyOpenSSL-16.2.0-3.el7.noarch.rpm

再次执行以下命令


sudo certbot --nginx

继续报错,如下:


Error while running nginx -c /etc/nginx/nginx.conf -t.

nginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)
nginx: configuration file /etc/nginx/nginx.conf test failed

The nginx plugin is not working; there may be problems with your existing configuration.
The error was: MisconfigurationError('Error while running nginx -c /etc/nginx/nginx.conf -t.\n\nnginx: [emerg] open() "/etc/nginx/nginx.conf" failed (2: No such file or directory)\nnginx: configuration file /etc/nginx/nginx.conf test failed\n',)

nginx 主配置文件 /etc/nginx/nginx.conf 没有检测到

原因是:宝塔将 nginx 的主配置文件安装在 /www/server/nginx/conf/ 目录下,然而 certbot 默认在扫描 /etc/nginx/nginx.conf 文件,故而找不到 nginx 的配置文件

解决方案:指定 nginx 的配置目录,执行以下命令


sudo certbot --nginx --nginx-server-root=/www/server/nginx/conf/

然而不幸的是,依然还是报错,报错信息如下:


An unexpected error occurred:
TypeError: from_buffer() cannot return the address of the raw string within a str or unicode or bytearray object

image.png

解决方案:更新 cffi 包,执行以下命令


pip install --upgrade cffi

安装完毕之后,再次执行以下命令


sudo certbot --nginx --nginx-server-root=/www/server/nginx/conf/

image.png
image.png

发现还是报错,报错信息如下:


An unexpected error occurred:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 310-328: ordinal not in range(128)

关于 ascii 报错,这篇文章有详细的介绍 通过 Certbot 安装 Let's Encrypt 证书,来实现全站的 HTTPS 访问

解决方案是:检查你选择的需要配置的 nginx 配置文件中是否含有中文,将所有的中文去掉就好了

去掉之后,再次执行以下命令


sudo certbot --nginx --nginx-server-root=/www/server/nginx/conf/

image.png

大功告成!

对比一下没有配置 ssl 之前的 nginx 配置

没有配置 ssl 之前的 nginx 信息


server
{
    server_name www.pudongping.com;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/www.pudongping.com;

    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }

}

配置 ssl 之后的配置信息 (现在配置文件中,默认强制性重定向了 https)


server
{
    server_name www.pudongping.com;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/www.pudongping.com;

    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }


    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/www.pudongping.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/www.pudongping.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}
server
{
    if ($host = www.pudongping.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name www.pudongping.com;
    return 404; # managed by Certbot


}


自动更新证书

由于 Let's Encrypt 默认的有效期是 90 天,所以如果你的应用需要在生产环境长期提供服务,还要在证书到期之后更新证书,我们可以通过 certbot renew 命令来更新证书,你可以通过如下命令来测试该命令是否生效:


sudo certbot renew --dry-run

如果在输出中看到如下字样,则表示生效:

Congratulations

当然,真实环境中通过手动维护是不现实的,我们可以借助 Crontab 来编写一个定时任务,每个月都强制更新一个这个证书,然后重启 Nginx:


0 0 1 * * certbot renew
5 0 1 * * service nginx restart

或者直接执行官方提供的命令


echo "0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew -q" | sudo tee -a /etc/crontab > /dev/null

关于目录

  • Certbot 的配置文件目录在 /etc/letsencrypt
  • Certbot 的 log 预设路径在 /var/log/letsencrypt
  • 网站对应的 .pem 文件路径在 /etc/letsencrypt/live/网站名称/privkey.pem
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容