John

        iClient使用有报错HTTPS 访问HTTP服务跨域问题,亦或为了服务安全需使用HTTPS 加密通信,解决方案:一是直接对iServer的tomcat容器进行配置 HTTPS 连接;二是通过Nginx代理成HTTPS服务。方案一在iServer的帮助手册(http://support.supermap.com.cn/DataWarehouse/WebDocHelp/iServer/Subject_introduce/Security/systemSecurity/HTTPS/HTTPS.htm)介绍得比较详细,在此就不做多余的说明了,博客主要介绍通过Nginx代理实现将iServer的HTTP转发成HTTPS协议服务。
        Nginx代理实现将iServer的HTTP转发成HTTPS协议服务,而HTTPS 在HTTP 的基础下加入SSL,其加密的详细内容就需要 SSL,博客采用的OpenSSL去生成公钥和私钥。

     安装OpenSSL工具

    下载地址:http://slproweb.com/products/Win32OpenSSL.html
将安装好的OpenSSL配置道系统的环境变量中

    生成公钥和私钥

        1、创建私钥

openssl genrsa -des3 -out D:\nginxcert.key 2048

        2、创建该私钥的证书

openssl req -new -x509 -key D:\nginxcert.key -out D:\nginxcert.pem -days 365

在这里插入图片描述

        3、去除SSL的口令
         注意:Nginx配置ssl的key带有密码,启动时会提示输入密码,且Nginx起不来,日志报错:

[alert] 30576#33832: the event "ngx_master_30576" was not signaled for 5s

        a. 去除key密码

openssl rsa -in D:\nginxcert.key -out D:\nginxRSAcert.key

        b. 重新生成证书

openssl req -new -x509 -key D:\nginxRSAcert.key -out D:\nginxRSAcert.pem -days 365

在这里插入图片描述

    Nginx配置

将上一步生成的没有密码的key和证书copy到Nginx的config目录,nginx.conf配置如下:

# http配置
server {
	listen       18099;
    server_name  192.168.12.103;
	location / {
           proxy_pass   http://192.168.12.103:8090;
    }
}
        
# https配置       
server {
     listen       20443 ssl;
     server_name  192.168.12.103;
     ssl_certificate      nginxRSAcert.pem;
     ssl_certificate_key  nginxRSAcert.key;
     ssl_session_cache    shared:SSL:1m;
     ssl_session_timeout  5m;
     ssl_ciphers  HIGH:!aNULL:!MD5;
     ssl_prefer_server_ciphers  on;
     location / {
         proxy_pass   http://192.168.12.103:8090;
     }		
  }

    结果验证

        1、访问http监听的18099
在这里插入图片描述+
        1、访问https监听的20443
在这里插入图片描述
        注意: https代理后可能会出现访问不了静态资源,且network上显示的静态资源的地址是http,需要将浏览器设置中“不安全内容“配置成允许,
在这里插入图片描述

    其他设置

    1、不显示静态资源

location ~ .*\.(js|css|jpg|png|json|svg)$ {
    proxy_pass http://192.168.12.103:8090;
	expires 30m;
 }

    2、端口变成80

location ~ .*\.(js|css|jpg|png|json|svg)$ {
    proxy_pass http://192.168.12.103:8090;
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 }

    3、返回response中有代理前的iServer的地址

location / {
	proxy_pass http://192.168.12.103:8090;
    proxy_set_header Host $http_host;
}

    4、配置负载均衡后,三维场景第二次login接口返回400
        a. 拦截rest/realspace/login.json直返回到一个iServer上进行出去;
        b. 只负载 .s3d瓦片数据,其他的不做处理;
        c. 配置ip_hash.

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐