当前位置: 首页 > Linux

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

时间:2023-04-06 22:12:52 Linux

通过Certbot安装Let'sEncrypt证书,实现整个站点的HTTPS访问,CSS、JS等文件都通过HTTP协议传输到我们的浏览器,然后被我们看到。由于HTTP是明文传输的,通过HTTP协议传输的内容很容易被窥视和篡改。为了安全(你肯定不想被人偷看或者篡改网页内容,比如网站银行密码什么的。)然后为HTTP协议增加了一层SSL/TLS安全协议,于是就有了HTTPS.什么是SSL/TLS?SSL指的是安全套接字层(SecureSocketsLayer)。心地纯洁的同学也可以理解为“带安全套的HTTP”。因为有了避孕套,当然更安全了。TLS是一种传输层安全协议(TransportLayerSecurity)。SSL和TLS是同一事物的不同阶段。可以理解为同一个东西,只要都是安全协议即可。为什么要部署HTTPS?毕竟,HTTPS更安全。即使是为了安全,一个专业可靠的网站,HTTPS也是必须的。Firefox和Chrome都计划将没有配置SSL加密的HTTP网站标记为不安全,目前他们正在与其他相关基金会和公司合作,推动整个互联网以及现在大家访问的一些主要网站的HTTPSization。比如谷歌多年前就全面启用了HTTPS,国内的淘宝、搜狗、知乎、百度等也全面启用了HTTPS。甚至谷歌和百度的搜索结果都给予HTTPS网站更高的排名和优先权。如何部署HTTPS?你只需要有一个受信任的CA(CertificateAuthority),即证书颁发机构颁发的SSL安全证书,部署在你的网站服务器上。部署成功后,当用户访问你的网站时,浏览器会在显示的网址前加一个绿色的小锁,表示该网站是安全的。当然,你也会看到URL前面的前缀变成了HTTPS,不再是HTTP了。如何获得SSL安全证书?理论上我们也可以自己颁发SSL安全证书,但是我们自己颁发的安全证书是不会被主流浏览器信任的,所以我们需要有可信的证书颁发机构(CA)颁发的安全证书。一般的SSL安全证书颁发服务都比较昂贵。例如,Godaddy、GlobalSign等机构颁发的证书,一般每年要花费20或更多。不过,为了加速HTTPS的普及,EEF电子前沿基金会、Mozilla基金会和密歇根大学成立了一个名为ISRG(InternetSecurityResearchGroup)的非营利组织,从2015年开始推出Let'sEncrypt免费证书。这个免费的证书不仅免费,而且相当好用,所以我们可以使用Let'sEncrypt提供的免费证书来部署HTTPS。Let'sEncrypt简介前面提到,Let'sEncrypt是一个名为ISRG(InternetSecurityResearchGroup,互联网安全研究组)的组织推出的免费安全证书程序。参与这个计划的组织和公司可以说是互联网最重要的先行者。除了上面提到的三个激进的发起者之外,思科(全球网络设备制造商的领导者)、Akamai,甚至Linux基金会都加入了合作,这些大牌组织的参与确保了其可信度和可持续性。这个项目。Certbot简介ISRG的发起者EFF(ElectronicFrontierFoundation)为Let'sEncrypt项目发布了官方客户端Certbot,可用于全自动化安全证书的获取、部署和更新。虽然也可以使用第三方工具,但是官方工具更权威,风险更小,遇到问题也更容易解决,毕竟有官方支持。Certbot的实际操作Certbot的官网是https://certbot.eff.org/,我们打开这个链接,选择我们使用的web服务器和操作系统。选择后,官网会显示相应的安装步骤。以我目前使用的服务器为例,web服务器使用的是Nginx(1.12),操作系统是CentOS(7.3)。因为Certbot是打包在EPEL中的,所以在安装Certbot之前必须先安装EPELyum-yinstallepel-release,然后按照官网给出的步骤安装Certbotyuminstallpython2-certbot-nginx安装完成后继续进入官网提示命令certbot--nginx运行该命令会自动获取证书,Certbot会自动编辑Nginx配置文件配置HTTPS服务。这里运行配置命令的时候遇到了一个坑ImportError:Nomodulenamed'requests.packages.urllib3'。可以看到少了一个模块包。在命令控制台上查看配置命令的输出。Certbot使用python编写Nginx配置。由于使用了python,可以通过piplist命令查看python的依赖包列表。但是支票已经存在,这个问题很快就通过Certbot在github上的一个Issue得到了解答(LinktoIssues)。目前包的版本依赖有问题。执行以下命令重新安装依赖包。.命令执行后,首先会提示输入邮箱地址。主要功能是订阅一些通知,进入后回车。[root@izuf6fco0zwyipdq9485s2z~]#certbot--nginxSavingdebuglogto/var/log/letsencrypt/letsencrypt.logPluginsselected:Authenticatornginx,Installernginx▽Enteremailaddress(usedforurgentrenewalandsecuritynotices)(Enter'c'):demo@mail.com//演示邮箱开始新的HTTPS连接(1):acme-v02.api.letsencrypt.org-------------------------------------------回车后,Certbot会自动请求下载Let'sEncrypt证书并设置Nginx配置文件。期间会有一些同意相关协议和选择网站配置的交互,看输出文字就可以理解。...▽server{(A)gree/(C)ancel:a-------------------------------------您是否愿意与ElectronicFrontierFoundation分享您的电子邮件地址,ElectronicFrontierFoundation是Let'sEncrypt项目的创始合作伙伴和开发Certbot的非营利组织?我们想向您发送电子邮件,介绍我们的网络加密工作、EFF新闻、活动以及支持数字自由的方式。--------------------------------------(Y)es/(N)o:yStartingnewHTTPSconnection(1):supporters.eff.orgWhichnameswouldyouliketoactivateHTTPSfor?-------------------------------------1:kisstime.top-------------------------------------选择合适的数字,用逗号和/或空格分隔,或留空选择显示的所有选项(输入“c”取消):1获取新证书执行我ng以下挑战:http-01challengeforkisstime.topCleaningupchallenges...但是这里我在Certbot设置Nginx配置文件的时候遇到了一个坑,报如下错误:Anunexpectederroroccurred:UnicodeDecodeError:'ascii'codec无法解码位置2中的字节0xe5:序号不在范围内(128)请参阅/var/log/letsencrypt中的日志文件了解更多详细信息。熟悉python的同学应该对这个错误比较了解,不过博主还是比较少用python,花了点时间才明白。在解决错误之前,先了解一下unicode和utf-8的区别。Unicode指的是万能码,是一种“字符码表”。而utf-8就是这个字码表中存储的编码方式。Unicode不一定非得用utf-8存储成字节码,也可以使用utf-16、utf-7等其他方式。目前大部分都是转成utf-8形式的字节码。其次,Python中的字符串类型分为bytestring和unicodestring。如果在python文件中指定编码方式为utf-8(#coding=utf-8),那么所有带有汉字的字符串都会被认为是utf-8编码的字节串(例如:mystr="Hello"),但是函数中生成的字符串被认为是unicode字符串。问题就出在这里。Unicode字符串和字节串不能混用。一旦混合,就会出现这样的错误。例如:self.response.out.write("Hello"+self.request.get("argu"))其中"Hello"被认为是一个字节串,self.request.get("argu")的返回value被认为是一个unicode字符串。由于默认解码器是ascii,无法识别中文字节串。然后就报错了。了解了这个错误的原因后,这??里首先想到的是网站的Nginx配置文件是否有中文。打开一看,果然有中文评论。去掉注释,重新执行命令成功,没有报错。然后命令交互会提示是否将所有HTTP重定向到HTTPS。这里,我选择全部重定向,也就是“2”。CleaningupchallengesDeployingCertificatetoVirtualHost://Thiswilldisplayyourwebsiteconfigurationfiledirectory请选择是否将HTTP流量重定向到HTTPS,删除HTTP访问。------------------------------------------1:无重定向-不对网络服务器配置做进一步更改。2:重定向-将所有请求重定向到安全的HTTPS访问。为新网站选择此选项,或者如果您确信您的网站可以在HTTPS上运行。您可以通过编辑Web服务器的配置来撤消此更改。--------------------------------------选择合适的数字[1-2]then[enter](press'c'tocancel):2Redirectingalltr??afficonport80tosslin//Thiswillshowyourwebsiteconfigurationfiledirectory---------------------------------------恭喜!您已成功启用https://kisstime.top您应该在以下位置测试您的配置:https://www.ssllabs.com/ssltest/analyze.html?d=kisstime.top----------------------------------------重要提示:-恭喜!您的证书和链已保存在:.../fullchain.pem您的密钥文件已保存在:.../privkey.pem您的证书将于2019-02-14到期。要在将来获得此证书的新版本或调整版本,只需使用“certonly”选项再次运行certbot。要以非交互方式更新*所有*您的证书,请运行“certbotrenew”-如果您喜欢Certbot,请考虑通过以下方式支持我们的工作:捐赠给ISRG/Let'sEncrypt:https://letsencrypt.org/donate捐赠给EFF:https://eff.org/donate-leOK,完成上面最后一步后,输入以上信息,说明HTTPS配置成功!我们可以使用提示中的SSLServerTestURL来测试该网站是否可以通过HTTPS访问。您应该在以下位置测试您的配置:https://www.ssllabs.com/ssltest/analyze.html?d=kisstime.top事实证明现在高兴还为时过早。.通过测试网站,直接访问域名,发现无法访问网站。思前想后,查看了服务器的443端口是否开启。我用的是阿里云的服务器。我登录控制台查看安全组规则。我发现443端口没有开启。启用配置后,重访成功。其他Nginx设置说明基本上,Certbot会在相应的Nginx配置文件中添加以下参数:server{#...otherconfigs#SSLsettinglisten443ssl;#设置crt和密钥ssl_certificate.../fullchain.pem;ssl_certificate_key.../privkey.pem;#包括基本的ssl设置include.../options-ssl-nginx.conf;#Certbot还将生成一个Diffie-Hellman密钥ssl_dhparam.../ssl-dhparams.pem;#...otherconfigs}证书自动更新Let'sEncrypt免费SSL证书使用起来非常方便,但每次申请的有效期只有三个月,每次过期前都需要重新申请。Certbot已经提供一键更新命令certbotrenew我们可以通过添加这个命令的cron作业(或systemd定时器)来安排证书的自动更新SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/bin00,12***certbotrenew--quietCertbot的日志路径Certbot的日志默认路径为/var/log/letsencrypt,有需要的可以查看。相关的第三方certbot-auto是脚本certbot的封装,可以设置系统环境或者自动升级。参考资料牛顿曾经说过:如果我比别人看得更远,那是因为我站在巨人的肩膀上。(如果我看得更远,那就是站在巨人的肩膀上。)谢谢。https://certbot.eff.org/https://linuxstory.org/deploy-lets-encrypt-ssl-certificate-with-certbothttps://blog.csdn.net/use_my_heart/article/details/51303317https://blog.hellojcc.tw/2018/05/02/setup-https-with-letsencrypt-on-nginx/博客原链接原链接