• 推荐!搬瓦工官方代理,自动更换被封IPJust My Socks

ad

建站教程(5):网站升级为HTTPS

HTTPS,是一种通过计算机网络进行安全通信的传输协议。经由HTTP进行通信,但是利用SSL/TLS来加密数据包。网站升级HTTPS,在网站前面会有一把小锁,并且Google官方也承认过HTTPS是影响搜索排名的一个因素,那么如何将站点升级为HTTPS呢?本文的内容就介绍如何将部署在Nginx的WordPress全站升级为HTTPS。 :smile:

 

选择SSL证书

升级HTTPS,第一步就是获取一个SSL证书,我用的是Let’s Encrypt,免费,开放,支持自动更新。

 

在服务器配置SSL证书(Ubuntu 16.04 Nginx为例)

1.安装Nginx版本的Cerbot,Certbot有PPA,直接安装就好:

$ 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

2.安装Nginx版本的证书:

$ sudo certbot --nginx

这一步需要你输入邮箱以及域名信息,邮箱用来接收证书即将过期的信息(3个月要更新一次)以及安全信息。域名则是你这个证书所应用的网址,如果提示Cannot find a VirtualHost matching domain,可能是你的Nginx里的server_name配置有误,看看是否正确指向了自己的域名。之后会让你选择Redirect还是No redirect,前者是将所有HTTP请求都重定向到HTTPS去。

用这个命令安装是让Certbot自动帮你修改Nginx配置文件实现HTTP变为HTTPS(方便,推荐使用),当然你也可以手动配置,通过命令sudo certbot –nginx certonly,这样你就可以自己来设置信息,官方文档参考:https://certbot.eff.org/docs

 

设置证书自动更新

Certbot的证书有效期是90天,过了90天就得手动更新一次~但是它有自动更新机制,可以通过以下命令测试一下是否正常:

sudo certbot renew --dry-run

如果运行正确的话,那么你就可以设置shell+crontab来实现定时任务,以后也不用烦90天更新一次的事了~ :evil:   :evil:

1.在/root下新建一个update.sh:

#!/bin/bash
last_run_time=0#上一次运行时间
date1=`date +%s`#这一次运行时间
interval_days_secs=$((87*24*3600))#87天
if [[ $((date1 - last_run_time)) -gt $interval_days_secs ]]; then#如果间隔超过87天
	certbot renew#运行更新程序
    sed -i '2 s/[0-9][0-9]*/'$date1'/' update.sh #更新上一次运行时间
fi

2.新建一个crontab任务(crontab -e),设置每天执行一次update.sh:

0 0 * * * /root/update.sh > /root/log 2>&1

3.重启crontab任务:

/etc/init.d/cron restart

 

修改非HTTPS资源

全部更新完后,如果前面已经变成了https,但是没有高亮成绿色(以Chrom为例),那么可能是你的页面还有非HTTPS资源。在Chrom中进入开发者工具(F12),选择Security,根据提示修改掉非HTTPS资源即可~:

fix-unhttps

 

更多图解适合新手教程请戳:手把手教你搭建自己的个人网站~ :cowboy:

点赞
  1. s说道:

    请问第二步
    2.安装Nginx版本的证书:
    填写的域名可以为泛域名吗?

  2. s说道:

    好像楼主的方法只能在一个服务器升级一个域名,那请问如果,我准备升级https的几个域名指向同一服务器应该如何解决呢?

    1. flyzy小站说道:

      可以啊 nginx加几个server配置就好了

      1. s说道:

        我是再运行 sudo certbot --nginx
        它好像只能是更新证书了 不能添加证书

  3. luming说道:

    配置完后打开出问题了:”该网站的安全证书中的主机名与你正在尝试访问的网站不同“。请问这是什么原因。也是一直显示不安全

    1. flyzy小站说道:

      你在申请https证书的时候是不是把域名填错了

      1. luming说道:

        我发现了问题所在,我只要前面不加www就时安全的。这是什么原理啊大佬

        1. 123说道:

          因为你在nginx的配置里和Certbot里填的网址不一样,比如我要填exam.com,那就nginx和certbot里都填exam.com;如果你要www,就在前面都加上www就行

  4. s说道:

    感谢回复 这些教程都很不错 很有用

  5. s说道:

    另外我想知道会升了https之后会影响 ssr+bbr速度吗?

    1. flyzy小站说道:

      不会,不相关

  6. s说道:

    这个写的再详细些就好了

    1. flyzy小站说道:

      过两天出个详细版的教程

  7. Xpecia1说道:

    显示证书无效是什么鬼。。腾讯云买的域名,已经申请过TrustAsia证书了

    1. flyzy小站说道:

      用的腾讯的免费证书还是Let’s Encrypt的?

  8. bargler说道:

    选择Security,根据提示修改掉非HTTPS资源即可~

    以上如何操作?

    1. flyzy小站说道:

      就是如果有非HTTPS资源,就把链接改成https的(在网站源码改或者文章内容改)

  9. 王八拳说道:

    https设置完了绿了,但是界面崩了,图片显示不出来,排版混乱,大佬,这是咋回事 :mrgreen:

    1. flyzy小站说道:

      因为你有些资源(例如图片,css)还是http的,你需要把这些链接也改成https的

  10. 雍正说道:

    麻烦问一下,如果没有域名的话Nginx证书应该怎么安装啊?

    1. flyzy小站说道:

      没有域名不可以用https证书

  11. guochens说道:

    作者你好,我都是按照您的步骤来的,执行
    sudo certbot renew --dry-run命令后出现了以下结果:
    /usr/lib/python3/dist-packages/ndg/httpsclient/subj_alt_name.py:22: UserWarning: Error importing pyasn1, subjectAltName check for SSL peer verification will be disabled. Import error is: No module named 'pyasn1'
    warnings.warn(import_error_msg)
    /usr/lib/python3/dist-packages/ndg/httpsclient/ssl_peer_verification.py:25: UserWarning: SubjectAltName support is disabled - check pyasn1 package installation to enable
    warnings.warn(SUBJ_ALT_NAME_SUPPORT_MSG)
    /usr/lib/python3/dist-packages/ndg/httpsclient/subj_alt_name.py:22: UserWarning: Error importing pyasn1, subjectAltName check for SSL peer verification will be disabled. Import error is: No module named 'pyasn1'
    warnings.warn(import_error_msg)
    Saving debug log to /var/log/letsencrypt/letsencrypt.log

    -------------------------------------------------------------------------------
    Processing /etc/letsencrypt/renewal/guochens.com.conf
    -------------------------------------------------------------------------------
    Cert not due for renewal, but simulating renewal for dry run
    Plugins selected: Authenticator nginx, Installer nginx
    Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org
    Renewing an existing certificate
    Performing the following challenges:
    http-01 challenge for guochens.com
    Waiting for verification...
    Cleaning up challenges

    -------------------------------------------------------------------------------
    new certificate deployed with reload of nginx server; fullchain is
    /etc/letsencrypt/live/guochens.com/fullchain.pem
    -------------------------------------------------------------------------------

    -------------------------------------------------------------------------------
    Processing /etc/letsencrypt/renewal/www.guochens.com.conf
    -------------------------------------------------------------------------------
    Cert not due for renewal, but simulating renewal for dry run
    Plugins selected: Authenticator nginx, Installer nginx
    Starting new HTTPS connection (1): acme-staging-v02.api.letsencrypt.org
    Renewing an existing certificate
    Performing the following challenges:
    http-01 challenge for http://www.guochens.com
    Waiting for verification...
    Cleaning up challenges

    -------------------------------------------------------------------------------
    new certificate deployed with reload of nginx server; fullchain is
    /etc/letsencrypt/live/www.guochens.com/fullchain.pem
    -------------------------------------------------------------------------------

    -------------------------------------------------------------------------------
    ** DRY RUN: simulating 'certbot renew' close to cert expiry
    ** (The test certificates below have not been saved.)

    Congratulations, all renewals succeeded. The following certs have been renewed:
    /etc/letsencrypt/live/guochens.com/fullchain.pem (success)
    /etc/letsencrypt/live/www.guochens.com/fullchain.pem (success)
    ** DRY RUN: simulating 'certbot renew' close to cert expiry
    ** (The test certificates above have not been saved.)

    但是用https://www.域名.com访问是无法访问,不知道是什么问题?

    1. flyzy小站说道:

      这个没有遇到过 我现在已经改用cloudflare了。但是你如果之前的安装好了,就算不加自动更新的内容,https应该也是可以用的

      1. guochens说道:

        哦哦,好的

      2. guochens说道:

        博主,我发现之前443端口被占用了。。现在问题解决了,并且证书也安装了,但是用https://www.guochens.com打开chrome说是证书丢失是什么意思。。。

      3. guochens说道:

        https://zhuanlan.zhihu.com/p/33518941
        网上查了好多,找到了一个靠谱的cloudflare教程,亲测有效

        1. flyzy小站说道:

          我也有cloudflare的教程啊 :symbols: 使用Cloudflare免费https证书,还是非插件版的

          1. guochens说道:

            之前没看到 :evil: 你的更吊

  12. T_T说道:

    下午注册了vultr,试了两个服务器完全ping不通啊,咋办

    1. flyzy小站说道:

      换新的location试试

  13. sawyer说道:

    升级https后提示不安全怎么解决

    1. flyzy小站说道:

      提示什么?证书不可信还是什么?

      1. sawyer说道:

        提示与网站链接不安全

      2. sawyer说道:

        用chrome之外的浏览器访问css都不能加载了 security提示This page is not secure (broken HTTPS).

        1. flyzy小站说道:

          是不是你css还是http的?

          1. sawyer说道:

            我手动改了style.css 还是不行

  14. 火火火说道:

    崩了,升级这个https,界面直接没有css一样崩了,然后删除证书后,直接不能访问了,重装软件都不行了,gg

    1. flyzy小站说道:

      不知道你是什么情况。
      用certbot可以选择修改nginx的配置文件增加redirect,你也可以手动修改nginx的配置文件。
      至于没有css,你可以看控制台报什么错,是mixed content吗?
      重装软件又是什么意思?

      1. zbx说道:

        :smile: 我觉得我懂这兄弟是什么情况,他说的卸载应该是把证书删掉了

        官方的文档里有这么一段:
        Certificate Name shows the name of the certificate. Pass this name using the --cert-name flag to specify a particular certificate for the run, certonly, certificates, renew, and delete commands. Example:

        certbot certonly --cert-name example.com

        然后我就用certbot delete --cert-name example.com 把我证书删掉了
        结果想重启nginx的时候就出现如下错误
        Error while running nginx -c /etc/nginx/nginx.conf -t.

        nginx: [emerg] BIO_new_file("/etc/letsencrypt/live/jinzizhang.top/fullchain.pem") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/etc/letsencrypt/live/jinzizhang.top/fullchain.pem','r') error:2006D080:BIO routines:BIO_new_file:no such file)
        nginx: configuration file /etc/nginx/nginx.conf test failed

        然后运行systemctl status nginx.s
        出现如下错误:
        Active: failed (Result: exit-code) since Tue 2018-09-18 08:14:27 UTC; 1min 14s ago
        Sep 18 08:14:27 site-test systemd[1]: Failed to start A high performance web server and a reverse proxy server.
        然后我修改了 nginx 配置文件
        vim /etc/nginx/sites-available/default
        把里面certbot修改的内容都删掉就能正常访问了