目录

为网站配置ssl证书

ssl证书简单介绍

SSL证书,用于加密HTTP协议,也就是HTTPS。它分为三种类型,域名型SSL证书(DV SSL)、企业型SSL证书(OVSSL)、增强型SSL证书(EVSSL)。

域名型 SSL 证书(DV SSL - Domain Validation SSL)

即证书颁布机构只对域名的所有者进行在线检查,通常是验证域名下某个指定文件的内容,或者验证与域名相关的某条 TXT 记录;

比如访问 [http|https]://www.mimvp.com/…/test.txt,文件内容: 2016082xxxxxmimvpcom2016或添加一条 TXT 记录:www.mimvp.com –> TXT –> 20170xxxxxmimvpcom2066

企业型 SSL 证书(OV SSL - Organization Validation SSL)

是要购买者提交组织机构资料和单位授权信等在官方注册的凭证,证书颁发机构在签发 SSL 证书前,不仅仅要检验域名所有权,还必须对这些资料的真实合法性进行多方查验,只有通过验证的才能颁发 SSL 证书。

增强型 SSL 证书(EV SSL - Extended Validation SSL)

与其他 SSL 证书一样,都是基于 SSL/TLS 安全协议,但是验证流程更加具体详细,验证步骤更多,这样一来证书所绑定的网站就更加的可靠、可信。它跟普通 SSL 证书的区别也是明显的,安全浏览器的地址栏变绿,如果是不受信的 SSL 证书则拒绝显示,如果是钓鱼网站,地址栏则会变成红色,以警示用户。说白了它们的安全性一个比一个要高,像我们这些个人的网站用第一种就可以了,而且只有第一种有免费的。当然你有钱的话去购买也没人拦着你。

给自己网站配置SSL证书

网站环境

  • 阿里云服务器
  • 七牛云图片服务器
  • nginx服务器

申请证书

阿里云控制台->产品与服务->SSL证书(应用安全)->点击购买证书

http://img.cana.space/picStore/20201103145401.png

由于我这里还要给二级域名指向的图片服务器配置ssl,所以购买了两个

//todo

购买好证书后接下来就是申请证书,在证书列表中点击申请证书

http://img.cana.space/picStore/20201103151247.png

下一步验证信息,由于我的域名在阿里云直接自动验证就可以了。

验证好后下载需要选择证书类型,一级域名选择nginx,二级域名由于解析到图片服务器,在服务器类型里选择其他,一切设置好后就可以下载证书了,如下:

http://img.cana.space/picStore/20201103151453.png

安装证书

nginx

官网参考

  1. 证书下载页面中定位到Nginx服务器,并单击右侧操作栏的下载,将Nginx服务器证书压缩包下载到本地。

  2. 解压已下载保存到本地的Nginx证书压缩包文件。

    解压后的文件夹中有2个文件:

    • 证书文件:以.pem为后缀或文件类型为PEM。
    • 密钥文件:以.key为后缀或文件类型为KEY。
  3. 登录您的Nginx服务器,在Nginx安装目录(Nginx默认安装目录为/usr/local/nginx/conf)执行以下命令创建cert目录。

    1
    2
    
    cd /usr/local/nginx/conf  #进入Nginx默认安装目录。此处为Nginx默认安装目录,请您根据实际配置情况操作。
    mkdir cert  #创建cert证书目录。
    
  4. 上传证书到云服务器

    1
    
    scp 4712219_cana.space.pem root@47.97.9.157:/root/
    
  5. 编辑nginx配置文件

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    user  root;
    worker_processes  1;
       
    events {
        worker_connections  1024;
    }
       
    http {
        include       mime.types;
        default_type  application/octet-stream;
        sendfile        on;
        keepalive_timeout  65;
        charset utf-8;        # 设置编码格式
       
        server {
         listen 80;
             server_name cana.space;
         rewrite ^(.*)$ https://${server_name}$1 permanent;
         }
       
        server {
            listen 443 default ssl;             # 端口号 默认使用ssl
            server_name cana.space;           # 配置域名信息
            root web;
            index index.html;
                 ssl_certificate cert/4712219_cana.space.pem; # 替换成自己的
                 ssl_certificate_key cert/4712219_cana.space.key; # 替换成自己的
            ssl_session_timeout 5m;
            ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            ssl_prefer_server_ciphers on;
            location /favicon.ico {
                root web;
            }
                 # 使用相对协议实现当网站引入的都是 http 资源,网站域名更换为 https 后的无缝切换
             location / {
          add_header Content-Security-Policy upgrade-insecure-requests;
     }
        }
    }
    
  6. 重启服务器

    1
    2
    
    cd /usr/local/nginx/sbin  #进入Nginx服务器的可执行目录sbin。
    ./nginx -s reload  #重启Nginx服务器。
    

    在重启后出现如下错误,说明未安装http_ssl_module模块,我们只需要在原有的基础上添加ssl模块就行了。

    1
    
    nginx:[emerg]unknown directive ssl错误
    

    解决步骤:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    # 来到解压目录
    cd /opt/nginx-1.12.0
    # 重新添加ssl模块
    ./configure --with-http_ssl_module
    # 重新编译
    make
    # 在我们执行完做命令后,我们可以查看到在nginx解压目录下,objs文件夹中多了一个nginx的文件,这个就是新版本的程序了。首先我们把之前的nginx先备份一下,然后把新的程序复制过去覆盖之前的即可。
    cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
    cp objs/nginx /usr/local/nginx/sbin/nginx
    # 如果服务器在运行中会报一个错,将nginx进程kill掉即可
    # 查看ssl模块是否安装成功,看到--with-http_ssl_module字样表示安装成功
    ./sbin/nginx -V
    # 重新启动
    ./sbin/nginx
    
  7. 服务器安全组开发443端口

  8. 测试访问cana.space,ok

    如果出现以下错误

    1
    
    SSL received a record that exceeded the maximum permissible length ERR_SSL_PROTOCOL_ERROR
    

    需要修改server里面的 listen 443; 为 listen 443 default ssl; 保存,重启Nginx。

七牛云

由于网站使用了ssl,内部任何形式的资源加载都必须是 https,包括 css,js,ajax,图片,iframe 等各种形式的,所以使用到的图片访问也必须是https,当然也可以使用nginx反向代理将https图片访问模式反向代理到非https

七牛云安装SSL证书参考

  1. 七牛云控制台->SSL证书服务->上传自有证书

    • 证书备注名 随便写
    • 证书内容 ( PEM格式 ) 使用文本工具打开 4713157_img.cana.space.pem 复制内容
    • 证书私钥 ( PEM格式 ) 使用文本工具打开 4713157_img.cana.space.key 复制内容
  2. 配置HTTPS

    cdn->域名管理->配置->HTTPS配置—>选择已有证书,配置如下

    http://img.cana.space/picStore/20201103154317.png

至此,ssl配置完成

遗留问题解决

https访问非http

由于网站安装了ssl,在一个 https 页面里动态的引入 http 资源,比如引入七牛云上的图片,会被直接 block 掉。按照上面的操作步骤,现在已经在七牛云上同时准备了 https 资源和 http 资源,那么可以使用相对协议实现当网站引入的都是 http 资源,网站域名更换为 https 后的无缝切换。具体做法就是在nginx配置文件中加入一个文件头:

1
2
3
location / {
	     add_header Content-Security-Policy upgrade-insecure-requests;
	}

ssl证书有效期

由于ssl证书只有1年有效期,一年之后需要更换,更换步骤:

  1. 一级域名更换

    给一级域名重新申请证书,nginx配置文件替换证书

  2. 二级域名更换

    七牛云管理后台修改证书配置,将证书内容和证书私钥替换掉即可


阿里云版本升级后证书过期后重新购买是一揽子购买,先一次性购买20个,再一个一个创建,如下

http://img.cana.space/picStore/20211018095729.png

创建好后再分别申请cana.space和img.cana.space两个域名的证书,验证和提交审核后一会儿就签发了,接下来按照上文下载证书并安装即可。

成功替换好证书后访问网站,并点击链接左侧小锁,有效,可以看到有效期已更新

http://img.cana.space/picStore/20211018101414.png

同理七牛云证书上传好后设置https配置,替换成新的证书

http://img.cana.space/picStore/20211018102109.png

点击确认等域名处理完毕后,访问https://img.cana.space/ 点击小锁可以看到有效期已经更新了。

http://img.cana.space/picStore/20211018102338.png

等域名状态变成成功后,查看有效期

http://img.cana.space/picStore/20211018103914.png