更新: 如果运行certbot过程中出现 “ ImportError: ‘pyOpenSSL’ module missing required functionality. Try upgrading to v0.14 or newer.”的错误,请参考 这篇文章
certbot renew出现“Let’s Encrypt renew出现“Challenge failed for domain xxxx””的错误,请参考 这篇文章
2021.1.28更新:推荐使用acme.sh获取证书,操作请参考:使用acme.sh签发证书
https已经走向主流(那些烦人的运营商弹窗广告终于消停的差不多了),目前已经可以做到0成本获取SSL证书。国内的阿里云、腾讯云等云计算厂商提供了申请免费证书的服务(参考从阿里云获取免费SSL证书),按照官方给出的步骤即可在一天之内拿到免费的证书。如果你需要便宜一点的泛域名证书,可以参考 这篇文章。
本文介绍如何从Let’s Encrypt获取免费证书。Let’s Encrypt是一个免费、非营利性的开放证书权威中心,由互联网安全研究小组(ISRG)支持,签发的免费证书被各个主流浏览器认可。任何域名持有人均可使用Let’s Encrypt申请免费证书来加密网站流量,公司、机构则建议付费获取OV、EV证书。
本教程前提是有一个域名(例如tlanyan.pp.ua)和一台vps,基于CentOS 7/8操作系统。如果操作系统与本博客的有差异,请参考 官方指引 获取证书。
域名没备案且vps在国内,可能无法申请成功,解决办法请参考 这篇文章。
安装certbot
首先安装certbot
:yum install -y python3 && pip3 install certbot
(注意:该安装方式不是官方推荐的,但一直都很好使)
安装完毕后,运行certbot --help
可以查看该工具的用法。
接下来介绍 certbot
获取域名证书的步骤。
1. 解析域名
进入域名的dns解析后台,将申请证书的域名记录指向服务器IP。本人使用 DNSLA, 为tlanyan.pp.ua申请证书,DNS解析记录截图如下:
请在涂改部分填上你vps的IP。
2. 获取证书
certbot
默认使用http方式对域名所有权进行验证,该操作需要绑定vps的80端口。如果80端口已被占用,请先停止占用的进程,例如停止Nginx:systemctl stop nginx
。
阿里云、腾讯云等购买的服务器,还需要在vps网页后台的安全组中放行80端口。
接着运行命令为域名tlanyan.pp.ua和tlanyan.pp.ua获取证书: certbot certonly --standalone -d tlanyan.pp.ua -d tlanyan.pp.ua
。如果有其他二级域名,继续添加-d参数即可。
如果域名记录未指向服务器的IP,会报错并提示域名解析问题。
大概半分钟就拿到了免费的证书,运行 certbot certificates
命令可查看域名证书的路径和国旗时间。
3. 配置web服务器使用证书
各个web服务器的配置不一样,本文提供Nginx和Apache httpd的配置例子。
Nginx配置
本站的配置文件 /etc/nginx/conf.d/tlanyan.conf
文件,编辑其内容为:
server { listen 80; server_name tlanyan.pp.ua tlanyan.pp.ua; rewrite ^(.*) https://$server_name$1 permanent; } server { listen 443 ssl; server_name tlanyan.pp.ua tlanyan.pp.ua; charset utf-8; ssl_certificate /etc/letsencrypt/live/tlanyan.pp.ua/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/tlanyan.pp.ua/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; # TLSv1.3需要nginx 1.13.0以上版本 # 如果nginx版本低,建议使用这种加密算法配置 # ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384; ssl_ecdh_curve secp384r1; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_session_tickets off; keepalive_timeout 70; # 这里填写其他配置 }
配置分为两个server段,第一段是所有http请求都导向https;第二段以ssl开头的配置都和证书相关:设置证书和私钥的位置、证书采用的协议、证书的加密算法等信息。
为了增强安全性,ssl_protocols、ssl_ciphers和ssl_prefer_server_ciphers的配置建议采用以上配置。
配置好以后,运行nginx -t
命令查看有无错误。配置正确的话用systemctl restart nginx
重新启动nginx。
https使用443端口,如果开启了防火墙,记得放行https服务:
firewall-cmd --permanent --add-service=https # 如果监听了其他端口,使用下面的命令 # firewall-cmd --permanent --add-port=端口号/tcp firewall-cmd --reload
Apache httpd配置
编辑网站配置文件,例如 /etc/apache2/sites-enabled/tlanyan.conf
,添加443端口和相关配置:
<VirtualHost *:443> ServerName tlanyan.pp.ua // 日志等其他配置 // ssl配置 SSLEngine on SSLCertificateFile /etc/letsencrypt/live/tlanyan.pp.ua/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/tlanyan.pp.ua/privkey.pem </VirtualHost>
保存配置文件后, apachectl -t
检查有无语法问题,然后重启apache:apachectl restart
。
为了https能正常访问,开启了防火墙的情况下请参考上文Nginx中的方式放行端口。
4. 证书自动更新
Let’s Encrypt证书的有效期是三个月,超过期限则需要续签。证书续期可以手动完成,例如:
systemctl stop nginx
certbot renew
systemctl restart nginx
也可以配置crontab任务自动续签,在/etc/crontab文件末添加一行:
0 0 1 */2 0 root systemctl stop nginx; /usr/local/bin/certbot renew; systemctl restart nginx
pip3默认安装的certbot路径是/usr/local/bin/certbot
,可使用 which certbot
查看,如果输出不同,请记得替换。该配置将每两个月自动运行certbot并续签证书。如果你的证书快到期了还没有续签,贴心的EFF(电子前哨基金会)会发邮件提醒,记得到期前续签就行。
大佬你好,使用运行nginx -t命令查看返回正常。但是用systemctl restart nginx 重启nginx后,访问站点却直接去了Welcome to CentOS欢迎界面请问可能是什么原因哦?我又尝试了几次,总是出现这个提示~~
站点配置有问题,或者没有用域名访问
前几天看邮箱突然说证书快到期了,今天有空赶紧来看看有没有解决办法,果然是自己漏看了最后证书更新和自动更新
不知不觉白嫖了大佬的攻略两个月了,也正好回复一下,感谢大佬分享
感谢支持
Command “python setup.py egg_info” failed with error code 1 in /tmp/pip-build-farbfvkx/cryptography/
大佬这是什么意思
依赖缺失,推荐使用acme.sh
ssl_certificate /etc/letsencrypt/live/tlanyan.pp.ua/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/tlanyan.pp.ua/privkey.pem;
大佬 第二行最后的后缀是你笔误吗
不是,默认后缀就是pem
那应该就是我自己证书的问题了 我的证书一个是key一个是pem 但是都好使哈哈
后缀没影响的,显示什么就填什么好了
感谢大佬
大佬你好 我也出现了这个问题
[zs@localhost www]$ sudo certbot certonly –standalone -d 123zs4567.ml –agree-tos –email zszs43874@gmail.com
[sudo] zs 的密码:
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for 123zs4567.ml
Waiting for verification…
Challenge failed for domain 123zs4567.ml
http-01 challenge for 123zs4567.ml
Cleaning up challenges
Some challenges have failed.
IMPORTANT NOTES:
– The following errors were reported by the server:
Domain: 123zs4567.ml
Type: unauthorized
Detail: Invalid response from
http://123zs4567.ml/.well-known/acme-
challenge/8gl8sxY6XZsWKD6zlBBbaBceiJiPFVXGu9HO_ibKoIA
[104.156.244.174]: 404
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.
解析到的是境外服务器 ping也成功了 80端口也没被占用 防火墙也开着 但还是报这个错 只能换一家DNS吗?
解析还没生效
大佬你好 我也出现了这个问题 解析到境外的服务器 ping也成功了 80端口也没被占用 防火墙也开着 但还是报这个错
解析还没生效或者vps后台的网页防火墙没放行
ping 成功了也没生效吗?
大佬 ping 成功了也不一定生效吗?
ping 123zs4567.ml
正在 Ping 123zs4567.ml [104.156.244.174] 具有 32 字节的数据:
来自 104.156.244.174 的回复: 字节=32 时间=310ms TTL=37
来自 104.156.244.174 的回复: 字节=32 时间=273ms TTL=37
来自 104.156.244.174 的回复: 字节=32 时间=290ms TTL=37
来自 104.156.244.174 的回复: 字节=32 时间=315ms TTL=37
104.156.244.174 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 273ms,最长 = 315ms,平均 = 297ms
只是你成功了,其他地方可能没成功啊,要等同步过去
您好,我想请问一下怎么解决呢 我本地时间和服务器时间应该是同步的, 手机可以正常访问 但是电脑上会500
500 Internal Privoxy Error
Privoxy encountered an error while processing your request:
Could not load template file no-server-data or one of its included components.
Please contact your proxy administrator.
If you are the proxy administrator, please put the required file(s)in the (confdir)/templates directory. The location of the (confdir) directory is specified in the main Privoxy config file. (It’s typically the Privoxy install directory).
重启电脑试试
不行。需要每隔一段时间去重新安装V2ray 才能让电脑可以链接一段时间
80端口要给tomcat用怎么处理
用dns方式验证,参考这篇:let’s encrypt
请问如果我的域名已经用在github静态站点了,是不是就不能用于申请证书了?
可以,用dns方式验证获取证书就好了
使用let’ encrypt生成了
Certificate Path: /etc/letsencrypt/live/hzk.buzz/fullchain.pem
Private Key Path: /etc/letsencrypt/live/hzk.buzz/privkey.pem
启动trojan报了这个错误为什么呀
Jun 13 04:27:29 vultr.guest trojan[8170]: [2020-06-13 04:27:29] [FATAL] fatal: use_certificate_chain_file: Permission denied
试试root启动
博主好!我修改配置文件后运行nginx -t -c /etc/nginx/nginx.conf得到:
nginx: [emerg] “server” directive is not allowed here in /etc/nginx/nginx.conf:1
nginx: configuration file /etc/nginx/nginx.conf test failed,请问该怎么办?
server块的位置弄错了,必须要在http块里面
小白一个,不知道如何操作。另外,我将之前/etc/nginx/nginx.conf里面的配置全部删除了,修改成了您在上面提供的配置,不知道是否正确?恳请您的帮助,非常感谢!
另外,我将之前 /etc/nginx/nginx.conf里面的配置全部删除了,修改成了您提供的配置,不知是否正确?小白一个,让您见笑了!
不行的,nginx.conf中的内容应该保持默认的
也不是说保持默认的,而是里面要有内容,文中给出的配置是被加载到nginx.conf中使用的
chrome 提示证书无效,哪个环节出问题了呢?
域名和申请证书的不符合
一直报错,请问大佬怎么解决:
root@vultrguest ~]# certbot certonly –standalone -d http://www.xxxxx.top
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for http://www.xxxxxx.top
Waiting for verification…
Challenge failed for domain http://www.xxxxxx.top
http-01 challenge for http://www.xxxxxx.top
Cleaning up challenges
Some challenges have failed.
IMPORTANT NOTES:
– The following errors were reported by the server:
Domain: http://www.xxxxxx.top
Type: connection
Detail: Fetching
http://www.xxxxxx.top/.well-known/acme-challenge/m3bklb_m8cVwe4ic2Tj3CCE2OL7J_mRoJLSIQqBtadI:
Error getting validation data
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. Additionally, please check that
your computer has a publicly routable IP address and that no
firewalls are preventing the server from communicating with the
client. If you’re using the webroot plugin, you should also verify
that you are serving files from the webroot path you provided.
防火墙没打开或者解析到了错误的ip
ping的时候显示的ip是正确的,通过这个命令开启了防火墙firewall-cmd –zone=public –add-port=80/tcp –permanent,但还是出现这个问题
已解决
怎么解决的我的出现同样问题了,ping的IP正确防火墙也开着呢
换一家dns,或者不要在国内服务器上使用
怎么解决的呀
大佬能交一下吗?
就是让你多等等啊
请问我运行 nginx -t 命令显示没问题,但重启就会报错。
Job for nginx.service failed because the control process exited with error code. See “systemctl status nginx.service” and “journalctl -xe” for details.
这是我的配置,应该和本文写给出的是一样的。
server {
listen 80;
server_name http://www.XXX.XXX XXX.XXX;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
listen 443 ssl;
server_name http://www.XXX.XXX XXX.XXX;
charset utf-8;
ssl_certificate /etc/letsencrypt/live/XXX/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/XXX/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
keepalive_timeout 70;
}
我也找了些其他的教程,试着改过一些,但还是一样报错,只能来麻烦您了 _(:з」∠)_
tail /var/log/nginx/error.log,输出是什么?
感谢回复,不过我重装了系统,从新搞了一遍,就没问题了。可能是我之前瞎鼓捣什么东西导致的吧。
我看见你回复的时候已经重装系统了,也不知道log到底写的什么了,希望之后不会再有同样的问题出现吧……
再次感谢你的教程。