为网站启用https并增加ssl证书


HTTPS和HTTP的区别

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。 为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。 HTTPS和HTTP的区别主要为以下四点:

  • https协议需要到ca申请证书,一般免费证书很少,需要交费。
  • http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
  • http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  • http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

申请ssl证书

对于像我这样的穷学生或者不希望花钱的同学可以使用startssl免费ssl证书
当然如果可以,最好购买ssl证书,安全性上更有保障

对于怎么申请startssl免费证书这里不多说,网上很多教程,其中有几点是我在申请中遇到的问题,希望对大家有所帮助
* 在进行域名验证时不论如何startssl搜索不到我的域名注册邮箱,我已将whois保护关闭后还是一样
解决办法:一个不是办法的办法,因为我在qq邮箱使用了域名邮箱,所以我将域名邮箱管理员admin@honmaple.com 更改为postmaster@honmaple.com,然后发送验证邮件到该邮箱对域名进行验证

  • 如何导出公钥
    如果申请成功,在Tool Box点击Certificate List,Action中选择Retrieve导出zip包到本地, 在本地解压就会发现里面有对应服务器类型的crt证书

  • 如何导出私钥
    在申请过程中保存了一个.key文件,这个文件就可以作为私钥(请妥善保管)

如果在申请中对私钥设置了密码,每次重启ngnix都要输入密码,如果不想每次输入密码, 在startssl的Tool Box的Decrypt Private Key中填入保存的私钥以及私钥密码,对私钥进行解密, 将解密后的字符串保存为.key文件

关于nginx配置

在/etc/nginx/conf.d/ssl.conf中添加

server {
     listen       443 ssl;
     server_name  honmaple.com;
     #请更改成你的文件地址
     ssl_certificate /root/ssl/1_honmaple.com.pem;
     ssl_certificate_key /root/ssl/1_honmaple.com.key;

     ssl_session_cache shared:SSL:1m;
     ssl_session_timeout 5m;
     #下面这些请根据实际更改,我的是flask+nginx
     location / {
                        # Pass the request to Gunicorn
                proxy_pass http://127.0.0.1:8000;
                proxy_redirect     off;

                # Set some HTTP headers so that our app knows where the
                # request really came from
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

注意: 我不知道是我的原因还是其他,启动ngnix时总报错

SSL_CTX_use_PrivateKey_file("/root/ssl/1_honmaple.com.key") 
failed (SSL: error:0D07207B:asn1 encoding routines:ASN1_get_object:
header too long error:0D068066:asn1 encoding routines:ASN1_CHECK_TLEN:bad object 
header error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:
Type=PKCS8_PRIV_KEY_INFO error:2306A065:PKCS12 routines:PKCS12_item_decrypt_d2i:
decode error error:0907B00D:PEM routines:PEM_READ_BIO_PRIVATEKEY:ASN1 lib error:
140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib)

所以我将.crt文件改成.pem,后面我发现还是报错,我将公钥里的

-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----

之间的空行去除

如果还是报错,请将.key文件解密

其他配置

如果要全站启用https,并将http定向到https,可以这样

server {
    listen 80 ;
    server_name honmaple.com;
    rewrite ^/(.*) https://honmaple.com/$1 permanent;
}

记得更改成自己的域名

ok,就这样

There are comments.