使用Certbot获取免费泛域名(通配符)证书

Certbot是Let's Encrypt提供的一个获取证书的程序, 支持自动获取证书(不用注册用户), 自动续期证书(免费证书只有3个月有效期, 但可以无限续期)

安装cerbot

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot / certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx 

使用

入门版, 获取单个域名

生产环境使用nginx作为web服务器, 但我没有使用certbot提供的nginx插件一键安装证书, 第一是我怕搞坏了生产环境, 第二是好像certbot的nginx插件局限性很大, 并不能支持换个地方安装的nginx.

所以目前我需求就是获取nginx上使用的.pem.key两个文件.

challenge

Let's Encrypt需要验证网站的所有权才能颁发证书, 官方称之为challenge(挑战).

有三种方式可以实现验证: (官方文档在此)

  • 在网站上的指定位置发布指定文件(HTTP-01)
  • 在网站上提供指定的临时证书(TLS-SNI-01)
  • 在域名系统中发布指定的DNS记录(DNS-01)

在这里选用HTTP-01任务.

(后记: 推荐使用DNS认证方式和DNS插件自动模式, 本文后部分有讲. 手动是真的麻烦...)

HTTP-01

  • 确保域名存在并且已经指向您请求证书的服务器的公共IP地址。
  • 确保端口80处于打开状态,可从Internet公开访问,并且不会被路由器或防火墙阻止。
  • 当使用Webroot插件或手动插件时,请确保webroot目录存在并且您正确指定它。如果您为example.com设置了webroot目录,/var/www/example.com 那么放置的文件/var/www/example.com/.well-known/acme-challenge/testfile应该出现在您的网站上http://example.com/.well-known/acme-challenge/testfile(此处重定向到HTTPS是可以的,并且不应该阻止工作中的挑战)。
  • 在一些Web服务器配置中,所有页面都是由某种框架动态生成的,通常使用数据库后端。在这种情况下,Web服务器可能无法从中直接为文件提供特定的目录。在这种情况下使用Webroot插件需要首先更改Web服务器配置。
  • 确保您的网络服务器正确地将挑战文件所在的目录(例如/.well-known/acme-challenge)提供给网站上预期的位置,而无需添加页眉或页脚。
  • 使用独立插件时,请确保其他程序尚未侦听服务器上的端口80。
  • 使用Webroot插件时,确保有一个Web服务器在端口80上侦听。

说实话我看着也头大, 这么长篇大论. 所以实践出真知吧, 过一遍上面的说明就开始敲命令吧.

假如我的域名为: bysir.store

sudo certbot certonly --standalone --email 'zbysir@qq.com' -d 'bysir.store'

standalone 就是独立插件, 它需要绑定80端口, 所以先关掉机器上的80端口吧, 或者换一台主机安装.
不出意外的话, 会死在Waiting for verification...,

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for bysir.store
Waiting for verification...
Cleaning up challenges
Failed authorization procedure. bysir.store (http-01): urn:acme:error:unauthorized :: The client lacks sufficient authorization :: The key authorization file from the server did not match this challenge [r9NH9hle6_7L9avkG-ID6A1BI4h4IgFVn6nx3VQZRpI.IL3bE2eqHDs1k0Lmxm63CXpLvzmosMuUDIywEIBTPnG] != []


IMPORTANT NOTES:
 - The following errors were reported by the server:

   Domain: bysir.store
   Type:   unauthorized
   Detail: The key authorization file from the server did not match
   this challenge
   [r9NH9hle6_7L9avkG-ID6A1BI4h4IgFVn6nx3VQZRpI.IL3bE2eqHDs1k0Lmxm63CXpLvzmosMuUDIywEIBTPnG]
   != []

   To fix these errors, please make sure that your domain name was
   entered correctly and the DNS A/AAAA record(s) for that domain
   contain(s) the right IP address.

可以看到他会请求http://bysir.store/.well-known/acme-challenge/r9NH9hle6_7L9avkG-ID6A1BI4h4IgFVn6nx3VQZRpI以认证网站.
错误就是没认证通过, 期望得到的字符串是r9NH9hle6_7L9avkG-ID6A1BI4h4IgFVn6nx3VQZRpI.IL3bE2eqHDs1k0Lmxm63CXpLvzmosMuUDIywEIBTPnG但是你返回空串``

笨办法是在nginx配置中添加如下代码

location ~ "^/\.well-known/acme-challenge/(.*)$" {
    default_type text/plain;
    return 200 "$1.IL3bE2eqHDs1k0Lmxm63CXpLvzmosMuUDIywEIBTPnG";
}

访问一下路径http://bysir.store/.well-known/acme-challenge/r9NH9hle6_7L9avkG-ID6A1BI4h4IgFVn6nx3VQZRpI检查下是否按预期返回了.

重新执行certbot生成证书.

$ sudo certbot certonly --standalone  -d 'bysir.store'
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for bysir.store
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/bysir.store/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/bysir.store/privkey.pem
   Your cert will expire on 2018-09-11. 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

可以看到验证通过并成功生成了证书, 其中 privkey.pem就是nginx要的key, fullchain.pem就是nginx要的pem.

完成.

(ps: 使用DNS认证方式会简单很多, 推荐使用)

泛域名证书

免费泛域名证书真的良心...

手动模式

只需要:

certbot certonly --preferred-challenges dns --manual  -d *.bysir.cn --server https://acme-v02.api.letsencrypt.org/directory

讲解下参数:

  • --preferred-challenges dns: 认证方式选择DNS, 泛域名支持DNS
  • --manual: 手动模式, 这里为了简单就使用手动认证了, 下面会说自动模式的使用.
  • -d *.bysir.cn: 就是要申请的泛域名了
  • --server https://acme-v02.api.letsencrypt.org/directory: 泛域名证书是新功能, 如果要使用就得加上这个参数

敲下回车:

-------------------------------------------------------------------------------
NOTE: The IP of this machine will be publicly logged as having requested this
certificate. If you're running certbot in manual mode on a machine that is not
your server, please ensure you're okay with that.

Are you OK with your IP being logged?
-------------------------------------------------------------------------------
(Y)es/(N)o: y

再敲下y

-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.bysir.cn with the following value:

cuAVEgl69tzimaIm2ncIEIVeMLYnzw05JohSdXuAOAA

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue

注意这一步需要手动配置TXT记录, 在域名解析服务商添加一个泛解析就可以了, 设置好了再敲下回车.

最后就会将生成好的证书保存到本地.

自动模式

吸取到上面手动模式无比麻烦的教训, 咱们这次一定要使用自动模式.

查询官方文档, 使用一个合适的插件, dns-plugin

这里我使用的dns服务商的xns, 所以我选择了certbot-dns-cloudxns.

按照插件文档编写配置文件:

cloudxns.ini

# CloudXNS API credentials used by Certbot
dns_cloudxns_api_key = 1234567890abcdef1234567890abcdef
dns_cloudxns_secret_key = 1122334455667788

敲下命令:

certbot certonly --preferred-challenges dns --dns-cloudxns --dns-cloudxns-credentials ./cloudxns.ini  -d *.bysir.cn --server https://acme-v02.api.letsencrypt.org/directory

运行之 报错:

certbot: error: unrecognized arguments: --dns-cloudxns-credentials ./cloudxns.ini

仔细看上面的文档, 其实这些插件是没被发行的, 通过我之前的安装方式是不能使用这些插件的, 但可以使用docker运行方式来使用这些插件:

进入https://hub.docker.com/u/certbot/, 找到需要的镜像

然后使用以下命令行来运行certbot:

sudo docker run -it --rm --name certbot \
            -v "/etc/letsencrypt:/etc/letsencrypt" \
            -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
            -v "/workspace/certbot/cloudxns.ini:/cloudxns.ini" \
            certbot/dns-cloudxns certonly --preferred-challenges dns --dns-cloudxns --dns-cloudxns-credentials /cloudxns.ini  -d *.bysir.cn --server https://acme-v02.api.letsencrypt.org/directory

现在就可以自动完成申请证书了, 简单到感人. 申请下来的证书同样会放在/etc/letsencrypt/live下.

至此完成, 感谢letsencrypt.

后续可能会更新自动更新证书方案, 敬请期待.

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

推荐阅读更多精彩内容