作者:宋崇振 刘鑫
背景
HTTPS协议已经应用非常广泛,在实际项目中,有的业务系统部署在云平台中,为了满足信息系统安全等级保护标准或云平台基于安全的统一考量,会要求GIS平台也使用HTTPS协议,对外提供专业的GIS服务。关于超图云GIS应用服务器SuperMap iServer配置HTTPS协议,以及Nginx代理SuperMap iServer的HTTP服务,并转发成HTTPS协议服务,超图产品帮助文档和优快云 博客中分别做了介绍,本文不赘述。
对于共享平台、行业GIS平台项目,使用云GIS门户平台SuperMap iPortal整合、共享管理各类GIS服务,建立统一的GIS资源中心,开放给各个单位、用户,从GIS门户平台iPortal查找、获取、访问、共享GIS服务资源。为了细粒度控制门户平台用户GIS服务操作权限,对GIS服务访问量统一进行服务访问统计分析。使用云GIS门户平台代理包SuperMap iPortal Proxy提供的服务代理机制,在原始GIS服务地址和代理后GIS服务地址之间建立的映射关系,为用户提供被代理后GIS服务地址,从而隐藏原始GIS服务地址。
在该架构中,部署了多个GIS节点,分配了一个政务网IP,且只分配一套根据政务网IP申请的SSL证书,要求使用HTTPS协议访问GIS服务或云GIS门户平台,该如何着手配置?
部署架构
本文基于云GIS门户平台SuperMap iPortal搭建GIS资源共享平台,搭配云GIS门户平台代理包SuperMap iPortal Proxy代理2台SuperMap iServer节点的GIS服务,使用Nginx代理转发iPortal服务和iPortal Proxy代理服务,采用PostgreSQL数据库存储iPortal和iPortal Proxy共用的2个数据库,并采用Redis存储会话信息、SQL查询缓存,使iPortal和iPortal Proxy会话一致。
如何通过配置Nginx、SuperMap iPortal和SuperMap iPortal Proxy,将SuperMap iServer发布的HTTP协议GIS服务,通过代理服务器转发成HTTPS协议。即SuperMap iServer提供HTTP协议GIS服务,代理服务器对外提供HTTPS协议服务,用户使用HTTPS协议访问代理的GIS服务和SuperMap iPortal。
部署架构

注:..*.*表示政务网IP,即内网IP映射到政务网的IP,下同。
软件说明
本文使用官网下载的软件,不需要特殊修改。项目中均使用的Linux版本,部署在Ubuntu操作系统。

Nginx
本文采用OpenResty源码编译方式,安装后Nginx在/usr/local/openresty/nginx目录。
在/usr/local/openresty/nginx/conf/nginx.conf中,配置SSL证书和location指令,
SSL证书的配置参考在线博客(https://blog.youkuaiyun.com/supermapsupport/article/details/122288372?spm=1001.2014.3001.5501),项目中SSL证书由客户单位根据政务网IP向CA机构申请,包括私钥*....key和证书...*.cer两个文件。
location指令根据不同的URI,匹配到SuperMap iPortal或SuperMap iPortal Proxy,把HTTPS重定向成HTTP,同时保持请求scheme信息相同。
server {
listen 443 ssl;
server_name localhost 10.150.145.118 *.*.*.*;
ssl_certificate sslkey/*.*.*.*.cer;
ssl_certificate_key sslkey/*.*.*.*.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers AESGCM:ALL:!DH:!EXPORT:!RC4:+HIGH:!MEDIUM:!LOW:!aNULL:!eNULL;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://10.150.145.104:8190;
proxy_redirect http:// https://;
proxy_set_header Host $http_host;
proxy_set_header Referer $http_referer;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_addr;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
}
location ~* /portalproxy/ {
proxy_pass http://10.150.145.53:8195;
proxy_redirect http:// https://;
proxy_set_header Host $http_host;
proxy_set_header Referer $http_referer;
proxy_set_header Cookie $http_cookie;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_addr;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Proto $scheme;
}
配置修改完成后,需要Nginx重新加载配置文件,在重新加载配置文件前,最好使用命令检查Nginx配置。
Nginx检查配置文件
/usr/local/openresty/nginx/sbin/nginx -t
Nginx重新加载配置文件
/usr/local/openresty/nginx/sbin/nginx -s reload
SuperMap iPortal
在SuperMap iPortal中分别修改【SuperMap iPortal安装目录】/conf/server.xml和【SuperMap iPortal安装目录】/webapps/iportal/WEB-INF/iportal.xml。
- 【SuperMap iPortal安装目录】/conf/server.xml中,修改Connector节点,将其属性redirectPort修改为redirectPort=“443”,对于非SSL请求,自动将请求重新定位到redirectPort指定端口,同时添加属性proxyPort=“443”,表示该连接器在代理中被使用。
<Connector port="8190" protocol="HTTP/1.1"
relaxedQueryChars="[]|{}"
relaxedPathChars="[]|{}"
connectionTimeout="8000"
redirectPort="443" proxyPort="443"
executor="tomcatThreadPool"
enableLookups="false"
URIEncoding="utf-8"
compression="on"
compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/plain,text/javascript,text/css,application/javascript,application/xml,application/json,application/rjson" />
同时在conf/server.xml的Host节点中添加Valve元素,让部署iPoral的Tomcat解析请求和做重定向的时候,明确采用什么协议。
<Valve className="org.apache.catalina.valves.RemoteIpValve" protocolHeaderHttpsValue="https" remoteIpHeader="x-forwarded-for" remoteIpProxiesHeader="x-forwarded-by" protocolHeader="x-forwarded-proto"/>
- 【SuperMap iPortal安装目录】/webapps/iportal/WEB-INF/iportal.xml,修改端口port、代理服务根地址设置统一的后缀名rootUrlPostfix和服务代理后的服务地址proxyServerRootUrl。
<!-- 注册、托管的服务是否使用代理,默认值:true,开启服务代理功能 -->
<enable>true</enable>
<!-- 是否启用内置的代理服务,默认值:true ,使用iPortal内置代理,当您使用独立进程代理时,需设置为false -->
<enableBuiltinProxy>false</enableBuiltinProxy>
<port>8195</port>
<rootUrlPostfix>portalproxy</rootUrlPostfix>
<proxyServerRootUrl>https://{ProxyHost}</proxyServerRootUrl>
<httpConnPoolInfo>
<maxTotal>100</maxTotal>
<defaultMaxPerRoute>10</defaultMaxPerRoute>
<connectionTimeout>30000</connectionTimeout>
<socketTimeout>30000</socketTimeout>
</httpConnPoolInfo>
port,云GIS门户平台代理包SuperMap iPortal Proxy使用8195端口。
rootUrlPostfix,代理服务根地址设置统一的后缀名设置为portalproxy,可以根据需要灵活定制,和SuperMap iPortal Proxy中配置保持一致。
proxyServerRootUrl,代理后服务地址proxyServerRootUrl中修改为{ProxyHost},没有使用固定的IP或域名,使用{ProxyHost}会使代理服务地址根据用户当前的网络环境,动态显示IP。且没有指定端口号,使用HTTPS协议默认的443端口。
上述配置修改完成后,需要重启SuperMap iPortal。
SuperMap iPortal Proxy
在SuperMap iPortal Proxy【SuperMap iPortal Proxy安装目录】/webapps/ROOT/WEB-INF/iportal-proxy.xml配置文件,修改代理服务根地址设置统一的后缀名rootUrlPostfix和服务代理后的服务地址proxyServerRootUrl。
<rootUrlPostfix>portalproxy</rootUrlPostfix>
<proxyServerRootUrl>https://{ProxyHost}</proxyServerRootUrl>
<scheme>http</scheme>
<httpConnPoolInfo>
<maxTotal>200</maxTotal>
<defaultMaxPerRoute>100</defaultMaxPerRoute>
<connectionTimeout>30000</connectionTimeout>
<socketTimeout>30000</socketTimeout>
</httpConnPoolInfo>
<enableAccessStatistics>true</enableAccessStatistics>
rootUrlPostfix和proxyServerRootUrl,分别修改为portalproxy和https://{ProxyHost},和SuperMap iPortal配置文件iportal.xml中保持一致。
上述配置修改完成后,需要重启SuperMap iPortal Proxy。
验证
完成上述配置后,您的项目即可以对外提供满足HTTPS协议的GIS服务。如下图所示,SuperMap iServer发布的HTTP协议GIS服务,通过代理后,对外提供HTTPS协议服务,并且隐藏了原始GIS服务地址,通过HTTPS协议访问SuperMap iPortal。



对地址的对比分析,可以看到经过代理后,对外提供的GIS服务地址中协议、端口、资源唯一标识都发生了变化。IP是根据访问者所在网络动态显示的,端口固定为443,资源唯一标识新增了portalproxy。

被折叠的 条评论
为什么被折叠?



