如何免费的让网站启用HTTPS

如何免费的让网站启用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 ,请勿用于任何商业用途)

好烂啊有点差凑合看看还不错很精彩 (90 人打了分,平均分: 4.06 )
Loading...

如何免费的让网站启用HTTPS》的相关评论

    1. 我是用的又拍云的Let’s Encrypt , 证书自动续期了,部署倒是挺方便的。不过免费的证书的书,只能用他们家的CDN。

  1. 前几天路过铁道部证书授权中心,门头紧闭,门外无人……
    我站在马连道的大街上,看着这个孤傲的部门,独自凌乱

  2. 这已经不是有一点晚了,我收藏夹近千网址里只有90多个还是HTTP,其中技术水平较高的网站中仅剩贵站、CSDN和OpenJDK。现在又少一个。

    1. 以腾讯旗下腾讯动漫为例,腾讯现在一部分游戏和动漫网站,开启https以后,服务就和瘫痪一样,无法和用户正常交互,资源无法正常提供,客服给的回答是,继续使用http访问,如果被强制跳转https,就自己手动改成http。或许这也是CSDN考虑的问题,他们可能也面临一样的技术问题,即实现https以后,他们自己很多网站没法继续正常工作,。

  3. 请问一下,如果http网站之前已经被运营商长期劫持,一旦开启https后,好像用户就直接无法访问了,因为证书无法验证通过。有没有这样的情况呢?

    1. https://imququ.com/post/sth-about-switch-to-https-3.html
      关于你说的,ququ也写到过,“最常见的干扰是运营商劫持了域名 DNS 解析,这种劫持服务器一般会将用户请求反代到源网站,再在响应里夹带私货。在 HTTP 时代,这种劫持多半只会造成页面出现广告,网站还能用;而升级到 HTTPS 后,由于身份认证机制的存在,劫持服务器无法成功反代第三方网站(成功实施 HTTPS 中间人攻击的条件请看《三种解密 HTTPS 流量的方法介绍》),从而导致网站完全不可用。”
      事实上ququ写了很多关于nginx, http/2, https的文章,而且如果你第一次访问这个网站的话,会发现好快…希望能帮到你

  4. 有兴趣的话,建议启用 TLS 1.3,更快,并且证书会加密发送了。(当然它还是草案阶段,客户端这边,火狐 nightly 默认启用,别的也可以由关注的用户手动启用。)

    我用的 Cloudflare 也挺省心的,还自动帮我改了网页内的 http://。

  5. 如果是用的GitHub page搭建的静态博客站点,通过腾讯云域名解析CNAME解析到GitHub page怎么设置成https,在云服务器上启动nignx做转发么,这个是不是不需要了,现在GitHub 就是https的了,不过我的域名访问的时候还是http

    1. 你的域名是不是 HTTPS 跟 GitHub没有任何关系,如果你的网站需要启用HTTPS,就需要反向代理指向github.io,参考我的博客https://lxwu.me/2017/10/09/nginx-proxy-pass-github-page/

  6. HTTPS证书不是要限定域名的么?

    为什么办法给 cocre.com 的证书,但是域名是coolshell.cn 也认为是安全的证书?

  7. http访问https会出现跨域访问的问题,这个要改服务器配置和程序的,可能腾讯觉得改起来比较麻烦吧

  8. HTTPS只是代表传输安全,跟网站本身安不安全并没有绝对的关系,现在的浏览器在左上角显示安全完全是在误导用户。

  9. 把 hard code 的 http 改成 https,应该用 nginx 把指向 80 的重定向到 443 就好了吧

    1. 这样做的话,用certbot renew更新证书会提示80端口被占用,导致无法更新证书

      1. 对 Let’s Encrypt 最不满(很简单的小改进,偏偏没有做)的是:它的认证及更新,只能通过80端口。
        为什么不把80作为可配置的,没配置才默认80?

  10. 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 这个错误可能是什么问题

  11. 我也是用的Let’s Encrypt 签发的证书,最初正常,后来firefox和chrome浏览器更新后,提示不安全,好像是因为中间证书的原因,不知道如何处理,请耗子哥指点

  12. 皓哥,请问下,我的域名(https://www.ihnbc.cn/)已经是https的了,但是确没显示“安全”和锁的图标?

  13. Google Chrome 已是最新版本
    版本 61.0.3163.91(正式版本) (64 位)

    环境: Mac OS X El Capitan
    版本: 10.11.6

    Need Fix: 谷歌浏览器报出:此网站正试图从未经验证的来源加载脚本

    参考解决方案: 找个来源可靠的 CDN 做代理

  14. 12306说自己等着工信部给出CA证书……是不是他们没能力?国家级的电子证书颁发机构还是很重要的吧….

  15. 我用的vultr的vps,ubuntu 17,按照官网的教程安装之后,发现不挂vpn访问不了了;(,有人遇到类似的问题么?

  16. “启用HTTPS后,你的网页中的所有的使用 http:// 的方式的地方都要改成 https:// 不然你的图片,js, css等非https的连接都会导致浏览器抱怨不安全而被block掉。所以,你还需要修改你的网页中那些 hard code http:// 的地方。”

    有另一种更好的方式是 “http://” 改成 “//”

    我的新博客https://blog.pythonwood.com,个人手工运维部署。

  17. 我安装之后无法访问,浏览器看是timeout,nginx 都没有 access log.
    网上有说国内的NS服务商,比如:hichina、dnspod、cloudxns,可能不能正常通过验证,有这个问题吗?大家用的是什么NS服务商啊?

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注