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邮箱使用了域名邮箱,所以我将域名邮箱管理员[email protected]
更改为[email protected],然后发送验证邮件到该邮箱对域名进行验证
如何导出公钥
如果申请成功,在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,就这样