https 简介
https 是目前最流行的http安全形式。使用https时。所有http请求和响应数据在发送到网络之前,都要进行加密。https在http下面提供了一个传输级的密码安全层。其大体结构如下:
大部分困难的编码和解码都是在ssl库中完成的。所以web客户端和服务器在使用安全的http 协议时无需过多的修改其处理逻辑协议。通过https 建立安全的web事务后,浏览器就会自动获取所连接的服务器数字证书,浏览器收到证书会对签发机构进行检查,如果浏览器无法确认该证书的签名,就会向用户展示对话框。
https 将http协议与一组强大的对称的、非对称和基于证书的加密技术结合在一起,保证安全的同时还保证灵活性。
以下是http和https事务的对比
简化版的SSL握手如下:
使用https 可以保证我们的数据更加安全。
前端项目部署https
自己生成https 证书
在本地调试的话,我们需要自己生成个https证书。
#!/bin/bash openssl genrsa -des3 -out server.key 2048 openssl rsa -in server.key -out server.key openssl req -new -key server.key -out server.csr openssl req -new -x509 -key server.key -out ca.crt -days 3650 openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt ls -l
我们在linux 下利用 openssl 生成呢证书,生成的server.key 和server.crt 就是需要的文件。(参考 https://www.cnblogs.com/php-no-2/p/11276323.html)
其中Country Name填CN,Common Name填主机名也可以不填,如果不填浏览器会认为不安全.(例如你以后的url为https://abcd/xxxx….这里就可以填abcd),其他的都可以不填。
docker 下nginx 配置
没配置过的可以参考 ![docker下配置nginx]docker下配置nginx
配置文件的主要配置如下:
upstream web { ip_hash; server 192.168.153.128:8080; } server { listen 443 ssl; server_name localhost; ssl_certificate server.crt; ssl_certificate_key server.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; location / { proxy_pass http://web; } }
上面就是代理 我们的前端到 nginx https 下了,但是直接访问后端的话,会报错
but requested an insecure XMLHttpRequest endpoint ‘http://192.168.153.128:2019/api/hello’. This request has been blocked; the content must be served over HTTPS.
大致意思就是https网站内不可以发送http请求,并且http请求直接被拦截并不发送到后台服务器。如何解决呢,由于我们后端都是一个个微服务,所以将后端都改成https 这种方式不科学,那么我们也可以向代理前端一样来使用nginx https 来代理http的后端。
nginx https 代理后端 http接口
其主要配置如下:
upstream gateway { ip_hash; server 192.168.10.241:2019; } server { listen 2019 ssl; server_name localhost; ssl_certificate server.crt; ssl_certificate_key server.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; location / { proxy_pass http://gateway; } }
然后把我们的前端调用api 的地址改成 https 代理的后端地址就可以了。
最后,附上 docker 下的部署脚本如下:
echo 'start docker nginx-https' docker stop nginx-https docker rm nginx-https docker run -d -p 80:80 -p 443:443 -p 2019:2019 --name nginx-https --restart=always nginx docker cp nginx-https.conf nginx-https:/etc/nginx/nginx.conf docker cp server.crt nginx-https:/etc/nginx/server.crt docker cp server.key nginx-https:/etc/nginx/server.key docker restart nginx-https echo 'success'