更新: 如果运行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(电子前哨基金会)会发邮件提醒,记得到期前续签就行。
这玩意儿各种问题,生成不了,不如自己去阿里云申请免费的证书
那也可以
国内的VPS申请不了的,除非域名备案了
建议:
1:在配置crontab时提示用户先which certbot查看路径。
我的路径就不是/usr/bin/certbot,而是/usr/local/bin/certbot。
2:防火墙允许443端口
firewall-cmd –permanent –add-port=443/tcp
firewall-cmd –reload
非常感谢您的建议,已更新教程并做了补充🙏
crontab中,命令certbot的路径不一定是/usr/bin/certbot。
需要先which certbot查询一下这个命令的执行路径
例如,我的路径是/usr/local/bin/certbot
配置文件/etc/crontab有误
应该是
0 0 1 */2 0 root systemctl stop nginx; /usr/bin/certbot renew; systemctl restart nginx
day-of-month没有0
感谢指正,我之前一直用着0,貌似也没问题
文档中/etc/nginx/conf.d/tlanyan.conf配置文件第17行和第18行应该是一行。
否则会报错
nginx: [emerg] invalid number of arguments in “ssl_ciphers” directive in /etc/nginx/conf.d/xxx.conf:18
nginx: configuration file /etc/nginx/nginx.conf test failed
非常感谢你的提醒,已经改正了
文档中ssl_perfer_server_ciphers写错了
应该是ssl_prefer_server_ciphers
我给域名添加了一条txt记录,请问如何查看解析是否成功?
用dig命令检查:
dig 域名 TXT
谢谢
请问mac怎么搞?
服务器上一般没有mac系统,基本上不需要在mac上安装证书
感谢
输入nginx -t命令 出现nginx: [emerg] invalid number of arguments in “ssl_ciphers” directive in /etc/nginx/conf.d/ziniu.conf:18 nginx: configuration file /etc/nginx/nginx.conf test failed
这种情况怎么解决?
ssl_ciphers那一行配置有错误,注意一下逗号之类,不行就注释掉shi shi
申请证书的时候遇到这个问题的朋友:
usage:
certbot [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.
certbot: error: unrecognized arguments: certonly –standalone -d http://www.XXX
可以用这个命令:
certbot certonly –webroot -w /usr/local/html -d http://www.test.com
先进入下一步,然后回答一些问题之后 会遇到一个challenge
然后在用回
certbot certonly –standalone -d http://www.test.com
我是这样弄之后成功了,原因是什么我也不知道。。。
希望作者能帮忙解释下
没道理啊,除非两次命令的空格不对?
申请证书的时候遇到
请问:同一时间,Apache 和 nginx 能不能共存?(默认配置,占用80和443端口)。我发现,如果用nginx,就必须kill apache进程,如果用apache,就必须kill nginx进程。这样才能提供http和https服务?
换不同端口就可以
哦哦,好的,谢谢!刚刚开始学
能出一个apache版本的配置文件吗?
晚点我把文章改一下,加上apache的配置
已经添加了apache版本的配置文件
谢谢!
你好
出现以下问题是什么问题,尝试很多次都失败了
[root@ST ~]# certbot certonly?-standalone?-d j*****.info?-d http://www.j*****.info
usage:
certbot [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.
certbot: error: unrecognized arguments: certonly?-standalone?-d j*****.info?-d http://www.j*****.info
域名我打码了
参数错误,standalone前面是两个横杆
作者你好
两个–依然有问题,也是提示下面的报错
certbot certonly –standalone -d jasenwoo.info -d http://www.jasenwoo.info
错是由于参数错误,会不会是我certbot没安装好
后面那个的http是自动添加的还是你命令里有的?
是自动添加的,我的代码里面没有这个问题;卡在做这个证书和DNS了 很难过。
教程有些衔接不上,或者是我太小白没懂的一点就是
获取证书这边出现我说的上述问题。
我的域名能ping出ip但是不确定是否要更改DNSLA的配置进购买域名的网站中
参数错误和dns解析没关系
也许你用的版本不同,man certbot查看一下命令的用法
有证书了 可是网站怎么还是显示不安全呀
没有配置nginx或者没有重新加载吧
运行nginx -t报错,得到如下结果:
nginx: [emerg] invalid number of arguments in “ssl_ciphers” directive in /etc/nginx/conf.d/jasonl.conf:18
nginx: configuration file /etc/nginx/nginx.conf test failed
请问何解
是不是ssl_ciphers那一行有换行?用上面的那一行试试
是只需替换域名,将nginx中的配置文件内容全部删除替换成你展示的配置文件吗?nginx -t的命令可以在Xshell中运行查看配置吗?应该怎么输入命令呢?我的nginx客户端总是闪退,换了端口也不管用,有解决办法吗?但nginx可以正常启动
还有一个Xshell使用的问题,当界面是
#
#
#
①
~②
~
~
按下箭头一直到①处,继续按下箭头或回车不能到②处,应该怎样换行到②处?
不知道我表达清楚没有
你别折腾了,找个人逐步指导你吧,欠缺的东西太多
在Xshell中安装nginx,安装好配置好后,输入命令./nginx -s quit显示nginx: [error] open() “/usr/local/nginx/logs/nginx.pid” failed (2: No such file or directory)
下载nginx进入Nginx。exe闪退,修改nginx.conf文件中的 端口为8888仍闪退,但输入localhost显示welcome to Nginx,找不到闪退原因和解决办法
为什么在运行certbot certonly –standalone -d时,显示ww.0321.net.cn does not exist or is not a directory
域名解析错误
安装cerbot时显示Setting up Install Process
No package python36 available.
Error: Nothing to do
yum install -y python3,用这个
显示Setting up Install Process
No package python3 available.
Error: Nothing to do
你是不是用了宝塔?
什么是宝塔,我也不确定我用过没
我没有用过宝塔
你的系统是什么?CentOS 6?
CentOS 6
CentOS 6这两条命令用不了,不用管,把后续的pip3改成pip试试行不行
还是不行,显示Setting up Install Process
No package python3 available.
Error: Nothing to do
不用执行yum install -y python3这个命令了,直接pip install certbot看看行不行
我没有安装过pip,安装pip的网页出了问题Connecting to bootstrap.pypa.io|151.101.0.175|:443… connected.
HTTP request sent, awaiting response… 404 Not Found
2020-04-06 13:42:34 ERROR 404: Not Found.
–2020-04-06 13:42:34– http://pythonget-pip.py/
Resolving pythonget-pip.py… failed: Name or service not known.
wget: unable to resolve host address `pythonget-pip.py’
pip使用不了
那就别折腾了,换centos 7吧
老哥,证书的加密算法在哪找啊
nginx: [emerg] invalid value “ssl_ciphers” in /www/server/panel/vhost/nginx/blog.specialiang.tk.conf:17
nginx: configuration file /www/server/nginx/conf/nginx.conf test failed
在宝塔里修改,把第17行改成:
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
谢谢老哥,我把另一个域名的证书整个这一段都复制过来改了域名就搞定了,不知道为啥单独复制这一行就不行,内容都是一样的。感谢老哥
按您的教程安装好Encrypt后,打开 /etc/crontab后文件如下
————————————————————-
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .—————- minute (0 – 59)
# | .————- hour (0 – 23)
# | | .———- day of month (1 – 31)
# | | | .——- month (1 – 12) OR jan,feb,mar,apr …
# | | | | .—- day of week (0 – 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
0 3 1 */2 0 root systemctl stop nginx ; certbot renew ; systemctl restart nginx
——————————————————
请教下最后一句话是自动更新的命令吗?这种情况我还需要再配置证书自动更新吗?
对,自动更新
在Namesilo上买的域名已经解析到vps上了可以用这个教程获取证书吗?Namesilo上买的可以备案吗?已经用伪装一键脚本配置过了如何再获取证书配置?
1.可以;2.备案需要转移到国内注册商,并且复工后缀名有要求;3.按照这个教程可以再获取📄个查看证书
0 0 0 */2 0 root systemctl stop nginx; /usr/bin/certbot renew; systemctl restart nginx
请问,每隔两月不应该是 0 0 0 0 */2 ?么
如果按照脚本中的计算,是不是每2天就申请续签?
我的写法没问题,你的理解错了
老师,0 0 0 */2 0,如果按照“ 分 时 日 月 周 ”理解,“周”定值“0”,是否限定了每隔两月的周日执行任务?这个周日与日期的“0”是否会冲突?
不冲突
先申请证书还是要把nginx配置好再申请,为啥总是说我申请失败
申请证书不需要nginx
请问按上面的Nginx配置好证书后重启就是显示https了吗?
我的怎么没出现呢?还是http
配置中的server_name改成你的域名了吗?
版主提示的很对。
设置全站导向https,外加打开防火墙的https支持。
ok!
不好意思我刚开始接触这个. 想请教下 证书自动更新 那里:
“可以配置crontab任务自动续签,在/etc/crontab文件末添加一行”
请问这个可以使用Xshell之类的命令行软件操作吗? 如果可以具体又该如何操作? 或我应该通过别的什么方式?
可以的,用vim编辑就行了
运行certbot certonly命令报如下错误?请问如何处理,我的域名在 Namesilo中注册、且已添加A记录指向我虚机的public IP,ping域名可以显示IP地址,虚机的TCP 443/80端口均已开放入站。谢谢
IMPORTANT NOTES:
– The following errors were reported by the server:
Domain: xxxxxxx
Type: dns
Detail: No valid IP addresses found for xxxxxxx
用
ping 域名
看看是不是指向了你的服务器地址,如果是可能有延迟,如果不是请修改后再尝试您好,我在certbot certonly –standalone -d 这一步时一直报错,说connection有问题,请问该怎么解决…
这个域名是能ping通的
Challenge failed for domain xxxx.com
Challenge failed for domain http://www.xxxx.com
IMPORTANT NOTES:
– The following errors were reported by the server:
Domain: xxxx.com
Type: connection
Detail: Fetching
http://xxxx.com/.well-known/acme-challenge/27FKdk4LSJsPfd64ybIr_Sdnu-9svr3w2J1exuDslU0:
Error getting validation data
Domain: http://www.xxxx.com
Type: connection
Detail: Fetching
http://www.xxxx.com/.well-known/acme-challenge/QIUn-05oov5fKfnul1d8136T-r5duYGY-Usa3rF8Wuc:
Error getting validation data
弄好了,防火墙的问题…
大哥,这个问题是因为什么原因?我也遇到了
vps网页后台防火墙没开或者vps在国内但域名没备案