如何免费的让网站启用HTTPS
今天,我把CoolShell变成https的安全访问了。我承认这件事有点晚了,因为之前的HTTP的问题也有网友告诉我,被国内的电信运营商在访问我的网站时加入了一些弹窗广告。另外,HTTP的网站在搜索引擎中的rank会更低。所以,这事早就应该干了。现在用HTTP访问CoolShell会被得到一个 301 的HTTPS的跳转。下面我分享一下启用HTTPS的过程。
我用的是 Let’s Encrypt这个免费的解决方案。Let’s Encrypt 是一个于2015年推出的数字证书认证机构,将通过旨在消除当前手动创建和安装证书的复杂过程的自动化流程,为安全网站提供免费的SSL/TLS证书。这是由互联网安全研究小组(ISRG – Internet Security Research Group,一个公益组织)提供的服务。主要赞助商包括电子前哨基金会,Mozilla基金会,Akamai以及Cisco等公司(赞助商列表)。
2015年6月,Let’s Encrypt得到了一个存储在硬件安全模块中的离线的RSA根证书。这个由IdenTrust证书签发机构交叉签名的根证书被用于签署两个证书。其中一个就是用于签发请求的证书,另一个则是保存在本地的证书,这个证书用于在上一个证书出问题时作备份证书之用。因为IdenTrust的CA根证书目前已被预置于主流浏览器中,所以Let’s Encrypt签发的证书可以从项目开始就被识别并接受,甚至当用户的浏览器中没有信任ISRG的根证书时也可以。
以上介绍文字来自 Wikipedia 的 Let’s Encrypt 词条。
为你的网站来安装一个证书十分简单,只需要使用电子子前哨基金会EFF的 Certbot,就可以完成。
1)首先,打开 https://certbot.eff.org 网页。
2)在那个机器上图标下面,你需要选择一下你用的 Web 接入软件 和你的 操作系统。比如,我选的,nginx
和 Ubuntu 14.04
3)然后就会跳转到一个安装教程网页。你就照着做一遍就好了。
以Coolshell.cn为例 – Nginx + Ubuntu
首先先安装相应的环境:
$ 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
然后,运行如下命令:
$ sudo certbot --nginx
certbot
会自动检查到你的 nginx.conf
下的配置,把你所有的虚拟站点都列出来,然后让你选择需要开启 https 的站点。你就简单的输入列表编号(用空格分开),然后,certbot 就帮你下载证书并更新 nginx.conf
了。
你打开你的 nginx.conf
文件 ,你可以发现你的文件中的 server
配置中可能被做了如下的修改:
listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/coolshell.cn/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/coolshell.cn/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
和
# Redirect non-https traffic to https if ($scheme != "https") { return 301 https://$host$request_uri; } # managed by Certbot
这里建议配置 http2,这要求 Nginx 版本要大于 1.9.5。HTTP2 具有更快的 HTTPS 传输性能,非常值得开启(关于性能你可以看一下这篇文章)。需要开启HTTP/2其实很简单,只需要在 nginx.conf
的 listen 443 ssl;
后面加上 http2
就好了。如下所示:
listen 443 ssl http2; # managed by Certbot ssl_certificate /etc/letsencrypt/live/coolshell.cn/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/coolshell.cn/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
然后,就 nginx -s reload
就好了。
但是,Let’s Encrypt 的证书90天就过期了,所以,你还要设置上自动化的更新脚本,最容易的莫过于使用 crontab
了。使用 crontab -e
命令加入如下的定时作业(每个月都强制更新一下):
0 0 1 * * /usr/bin/certbot renew --force-renewal 5 0 1 * * /usr/sbin/service nginx restart
当然,你也可以每天凌晨1点检查一下:
0 1 * * * certbot renew
注:crontab 中有六个字段,其含义如下:
- 第1个字段:分钟 (0-59)
- 第2个字段:小时 (0-23)
- 第3个字段:日期 (1-31)
- 第4个字段:月份 (1-12 [12 代表 December])
- 第5个字段:一周当中的某天 (0-7 [7 或 0 代表星期天])
- /path/to/command – 计划执行的脚本或命令的名称
这么方便的同时,我不禁要问,如果是一些恶意的钓鱼网站也让自己的站点变成https的,这个对于一般用来说就有点难以防范了。哎……
当然,在nginx或apache上启用HTTPS后,还没有结束。因为你可能还需要修改一下你的网站,不然你的网站在浏览时会出现各种问题。
启用HTTPS后,你的网页中的所有的使用 http://
的方式的地方都要改成 https://
不然你的图片,js, css等非https的连接都会导致浏览器抱怨不安全而被block掉。所以,你还需要修改你的网页中那些 hard code http://
的地方。
对于我这个使用wordpress的博客系统来说,有这么几个部分需要做修改。
1)首先是 wordpress的 常规设置中的 “WordPress 地址” 和 “站点地址” 需要变更为 https 的方式。
2)然后是文章内的图片等资源的链接需要变更为 https 的方式。对此,你可以使用一个叫 “Search Regex” 插件来批量更新你历史文章里的图片或别的资源的链接。比如:把 http://coolshell.cn
替换成了 https://coolshell.cn
3)如果你像我一样启用了文章缓存(我用的是WP-SuperCache插件),你还要去设置一下 “CDN” 页面中的 “Site URL” 和 “off-site URL” 确保生成出来的静态网页内是用https做资源链接的。
基本上就是这些事。希望大家都来把自己的网站更新成 https 的。
嗯,12306,你什么时候按照这个教程做一下你的证书?
(全文完)
(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)
《如何免费的让网站启用HTTPS》的相关评论
开启https以后,建议启用http/2
谢谢,文章已更新
只是3个月有效期 不方便部署cdn,头疼
我是用的又拍云的Let’s Encrypt , 证书自动续期了,部署倒是挺方便的。不过免费的证书的书,只能用他们家的CDN。
你可以继续启用HSTS
HSTS 要野卡, LE明年才会出免费野卡
前几天路过铁道部证书授权中心,门头紧闭,门外无人……
我站在马连道的大街上,看着这个孤傲的部门,独自凌乱
不妨试试caddy,比nginx简单多了,省心
这已经不是有一点晚了,我收藏夹近千网址里只有90多个还是HTTP,其中技术水平较高的网站中仅剩贵站、CSDN和OpenJDK。现在又少一个。
以腾讯旗下腾讯动漫为例,腾讯现在一部分游戏和动漫网站,开启https以后,服务就和瘫痪一样,无法和用户正常交互,资源无法正常提供,客服给的回答是,继续使用http访问,如果被强制跳转https,就自己手动改成http。或许这也是CSDN考虑的问题,他们可能也面临一样的技术问题,即实现https以后,他们自己很多网站没法继续正常工作,。
Let’s Encrypt 的根证书是自签名的,IdenTrust 和 Let’s Encrypt 根证书交叉签名中间证书,中间证书一个用于签发证书,一个用于备份。证书链的关系可以参考 https://letsencrypt.org/certificates/
请问一下,如果http网站之前已经被运营商长期劫持,一旦开启https后,好像用户就直接无法访问了,因为证书无法验证通过。有没有这样的情况呢?
https://imququ.com/post/sth-about-switch-to-https-3.html
关于你说的,ququ也写到过,“最常见的干扰是运营商劫持了域名 DNS 解析,这种劫持服务器一般会将用户请求反代到源网站,再在响应里夹带私货。在 HTTP 时代,这种劫持多半只会造成页面出现广告,网站还能用;而升级到 HTTPS 后,由于身份认证机制的存在,劫持服务器无法成功反代第三方网站(成功实施 HTTPS 中间人攻击的条件请看《三种解密 HTTPS 流量的方法介绍》),从而导致网站完全不可用。”
事实上ququ写了很多关于nginx, http/2, https的文章,而且如果你第一次访问这个网站的话,会发现好快…希望能帮到你
还有一个更懒的方法,就是用 Caddy 代替 nginx 做 server,可以自动获取并按时更新 Let’s Encrypt 证书。
自动更新证书可以试一试 ![acme.sh](https://github.com/Neilpang/acme.sh) ,是不是又发现新大陆了,哈哈。
有兴趣的话,建议启用 TLS 1.3,更快,并且证书会加密发送了。(当然它还是草案阶段,客户端这边,火狐 nightly 默认启用,别的也可以由关注的用户手动启用。)
我用的 Cloudflare 也挺省心的,还自动帮我改了网页内的 http://。
如果是用的GitHub page搭建的静态博客站点,通过腾讯云域名解析CNAME解析到GitHub page怎么设置成https,在云服务器上启动nignx做转发么,这个是不是不需要了,现在GitHub 就是https的了,不过我的域名访问的时候还是http
你的域名是不是 HTTPS 跟 GitHub没有任何关系,如果你的网站需要启用HTTPS,就需要反向代理指向github.io,参考我的博客https://lxwu.me/2017/10/09/nginx-proxy-pass-github-page/
你可以改http://为//
例:把
http://example.com
改为
//example.com
可以防止以后出现httpss和httpsss
HTTPS证书不是要限定域名的么?
为什么办法给 cocre.com 的证书,但是域名是coolshell.cn 也认为是安全的证书?
因为证书里面还有一个字段 Subject Alternative Name, 这里也可以写多个域名
同时可以在Let’s Monitor网站上监控证书的有效期
https://letsmonitor.org
http访问https会出现跨域访问的问题,这个要改服务器配置和程序的,可能腾讯觉得改起来比较麻烦吧
12306是因为其它因素
还有个点要注意下,关于 nginx 支持 HTTP/2 时,需要使用 openssl 1.0.2+
阿里云也可以申请免费证书,还会手把手教你各个服务器平台和web环境的安装方式
HTTPS只是代表传输安全,跟网站本身安不安全并没有绝对的关系,现在的浏览器在左上角显示安全完全是在误导用户。
无意间发现这个链接在chrome下报危险连接:
/category/proglanguage/phpdev
我的小站,昨晚也是刚刚启用https。启用的还不算晚
按着老师的教程,也给网站做了升级…
把 hard code 的 http 改成 https,应该用 nginx 把指向 80 的重定向到 443 就好了吧
这样做的话,用certbot renew更新证书会提示80端口被占用,导致无法更新证书
对 Let’s Encrypt 最不满(很简单的小改进,偏偏没有做)的是:它的认证及更新,只能通过80端口。
为什么不把80作为可配置的,没配置才默认80?
请问皓哥,为什么改完了在访问都变成不安全的访问了呢
教你一招:用 CloudFlare 的 Flexible SSL, 一键开启,不需要在你的源服务器配置任何SSL相关的的操作。
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 这个错误可能是什么问题
12306 又中抢
我也是用的Let’s Encrypt 签发的证书,最初正常,后来firefox和chrome浏览器更新后,提示不安全,好像是因为中间证书的原因,不知道如何处理,请耗子哥指点
好像只支持CentOS 6,没看到CentOS 7,不开心。
皓哥,请问下,我的域名(https://www.ihnbc.cn/)已经是https的了,但是确没显示“安全”和锁的图标?
可以了,网页里面http://连接替换就好了
可以到这个网站申请:https://freessl.org
Google Chrome 已是最新版本
版本 61.0.3163.91(正式版本) (64 位)
环境: Mac OS X El Capitan
版本: 10.11.6
Need Fix: 谷歌浏览器报出:此网站正试图从未经验证的来源加载脚本
参考解决方案: 找个来源可靠的 CDN 做代理
12306你什么时候更新你的证书,哈哈?
想请问看看如果我用的hosting是CPanel的话,方法也是一样的吗?
12306说自己等着工信部给出CA证书……是不是他们没能力?国家级的电子证书颁发机构还是很重要的吧….
我用的vultr的vps,ubuntu 17,按照官网的教程安装之后,发现不挂vpn访问不了了;(,有人遇到类似的问题么?
SSL大势所趋啊 赶紧把他提上日程~
“启用HTTPS后,你的网页中的所有的使用 http:// 的方式的地方都要改成 https:// 不然你的图片,js, css等非https的连接都会导致浏览器抱怨不安全而被block掉。所以,你还需要修改你的网页中那些 hard code http:// 的地方。”
有另一种更好的方式是 “http://” 改成 “//”
我的新博客https://blog.pythonwood.com,个人手工运维部署。
https大势所趋
12306的证书弄好了。
nginx才更新到nginx-1.13.8 吧。没有1.9.5
我安装之后无法访问,浏览器看是timeout,nginx 都没有 access log.
网上有说国内的NS服务商,比如:hichina、dnspod、cloudxns,可能不能正常通过验证,有这个问题吗?大家用的是什么NS服务商啊?