http切换至https相关配置
程序员文章站
2022-06-19 19:31:28
...
为了更好的用户体验,启用了https,需要去各大主机商那里购买SSL证书,https的好处大概以下几点:
1.数据传输加密,防止信息被窃取;
2.防止被欺诈,增加网站信任,防钓鱼;
3.防止被劫持;
部署了https的整体结构如图:
https配置,以nginx为例,参考:http://www.cnblogs.com/wang_yb/p/4330689.html,https://iyaozhen.com/nginx-https-conf.html
1.生成证书,使用openssl工具来生成对应的证书:
cd /etc/nginx openssl genrsa -des3 -out server.key 1024 # 设置证书密码 openssl req -new -key server.key -out server.csr # 根据提示输入各种信息 cp server.key server.key.org openssl rsa -in server.key.org -out server.key openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
生成的csr文件包含了主要的证书信息,key文件主要包含了密钥交换和加密等信息,属于私钥,要保存好。将csr文件提交给CA厂商,会在几天后发给一份签好的证书文件 crt文件,同时会给你CA的证书链。
2.设置https证书
server { listen 80; listen 443 ssl; server_name staging_activity.zhen.com; ssl_certificate /usr/local/nginx/ca/server.cer; ssl_certificate_key /usr/local/nginx/ca/server.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on;
ssl_protocols,表示SSL的协议;ssl_ciphers参数指的是加密算法,根据自身机器openssl版本不同,支持算法也不同;ssl_prefer_server_ciphers表示服务端加密算法优先于客户端加密算法,防止降级攻击。
如果使用了知道创宇的服务,需要根据秘钥文件和证书文件,进行合成:https://www.yunaq.com/tools/certificate_composing/,并上传即可。
浏览器和nginx之间走的https,而nginx和tomcat之间是通过proxy_pass,走的是普通http连接。
在tomcat端的Host中需要增加:
<Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="x-forwarded-for" remoteIpProxiesHeader="x-forwarded-by" protocolHeader="x-forwarded-proto" />
配置方案是浏览器和 Nginx 之间走的 HTTPS 通讯,而 Nginx 到 Tomcat 通过proxy_pass 走的是普通 HTTP 连接。 环境基础假定nginx、tomcat web服务已经安装并部署,crt(证书)和key(私钥)文件已经生成(本示例是用openssl生成的,生产环境可到第三方购买)。
nginx允许一个server同时支持http和https两种协议,可分别定义80和443两个协议和端口号,也可能单独配置使其仅支持https协议。
nginx收到请求后,将通过http协议转发给tomcat,由于nginx和tomcat在同一台服务器中,因此nginx核tomcat之间无需使用https协议。而正由于对于tomcat来说,收到的是普通的http请求,当tomcat中的应用发生转向请求时正常,我们需要告诉tomcat已被https代理,增加X-Forwarded-Proto和X-Forwarded-Port两个HTTP头信息。
下面是详细的配置(Nginx 端口 80/443,Tomcat 的端口 8080):
Nginx 这一侧的配置没什么特别的:
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream tomcat { server 192.168.1.xxx:8080; } # HTTPS server server { listen 443 ssl; server_name 192.168.1.xxx; ssl_certificate ca/server.crt; ssl_certificate_key ca/server.key; #ssl_client_certificate /opt/nginx/ca/private/ca.crt; #ssl_verify_client on;服务器验证客户端,暂时不开启 ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto https; proxy_redirect off; proxy_connect_timeout 240; proxy_send_timeout 240; proxy_read_timeout 240; # note, there is not SSL here! plain HTTP is used proxy_pass http://192.168.1.xxx:8080; } } }
其中最为关键的就是 ssl_certificate 和 ssl_certificate_key 这两项配置文件位置及相关访问权限请自行注意并更改,其他的按正常配置。不过多了一个 proxy_set_header X-Forwarded-Proto https; 配置。
最主要的配置来自 Tomcat,下面是我测试环境中的完整 server.xml:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="443" proxyPort="443" URIEncoding="UTF-8"/>
以及后面的hostname:
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="x-forwarded-for" remoteIpProxiesHeader="x-forwarded-by" protocolHeader="x-forwarded-proto" /> </Host>
上述的配置中没有什么特别的,但是特别特别注意的是必须有proxyPort="443",当然 redirectPort 也必须是443。同时 <Value> 节点的配置也非常重要,否则你在 Tomcat 中的应用在读取 getScheme() 方法以及在 web.xml 中配置的一些安全策略会不起作用。
需要值得注意的是,配置后tomcat的8080端口在外部依然可以直接访问,如果是集群环境,将会带来极大的安全隐患且此次配置也毫无意义了。所以应该在整个服务器局域网外围切断8080端口的访问(之前与第三方有交互并已经预定8080端口访问的服务可以酌情开放)并且在局域网内部开放8080端口的访问。
http与https的自动跳转
在我们使用baidu时,如果没有使用http的话,也会直接转换成https,不需要用户手动操作,当前在我们的服务器中,既能支持http,也支持https,如果是恶意用户,可以不使用http进行操作,所以我们也需要增加这一功能。
需要将80和443拆开,443https端口仍然保持原样,80端口,使用301 http code转移至https:
server { listen 80; server_name home.xxx.com; access_log /usr/local/nginx/main.xxx.com.log open1; return 301 https://home.xxx.com$request_uri; }
301和302之间的区别可以参考:http://blog.csdn.net/qmhball/article/details/7838989,一个表示永久转移,一个表示暂时转移,对于用户来说,仅仅是一个跳转,浏览器中旧的url变成了新的url,但302可能会有URL规范化和网站劫持的问题,被搜索引擎判断为可疑转向,甚至认为是xx,因此我们这里采用301。
https仍然按照之前的配置即可:
server { listen 443 ssl; ssl_certificate /usr/local/nginx/ca/server.cer; ssl_certificate_key /usr/local/nginx/ca/server.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ...
但内网我们使用的named服务,可以根据内网域名来进行请求分发,仅使用http,因此还需要为.net域名额外指定一个虚拟主机,因为是内网访问,所以仅支持http。
上一篇: 章鱼怎么吃,无计可施?来这里!
下一篇: Java和dubbo中的SPI机制学习