瓦片加密全流程使用指南 |
为防止瓦片数据爬取并进一步增强使用安全性,SuperMap 11i(2024) 系列产品中提供了从服务端加密到客户端解密的全流程瓦片加密能力。同时对于加密算法,也支持了符合国家标准的 SM4 国密算法。
本章将从如何在 SuperMap iServer 中对瓦片数据加密和在 SuperMap Web 客户端中对瓦片数据解密浏览两个方面进行详细的使用介绍,助力实际业务中瓦片数据的安全使用。
SM4 算法,全称为 SM4 分组密码算法,是由中国国家密码管理局发布的商用密码算法标准。在 SuperMap iServer 中内置该算法,在对瓦片数据加密时使用的模式和密钥长度默认如下:
AES(Advanced Encryption Standard)算法,最常见的对称加密算法,是美国联邦政府采用的一种区块加密标准。在 SuperMap iServer 中内置该算法,在对瓦片数据加密时使用的模式和密钥长度默认如下:
SuperMap iServer 通过对不同服务中获取瓦片的服务接口进行动态加密来实现瓦片加密的目的。以下对加密配置及验证方法进行介绍。
加密算法及规格通过 <encryption> 节点配置,位于 iserver-system.xml((【SuperMap iServer 安装目录】\webapps\iserver\WEB-INF下)的 <security> 节点中,具体示例如下:
<!-- iServer 加密算法及规格配置 --> <encryption class="com.supermap.server.config.EncryptionSetting"> <serviceKeySettings> <serviceKeySetting> <keyID>keyID1</keyID> <version>1.1</version> <algorithm>SM4</algorithm> <keyLength>128</keyLength> </serviceKeySetting> </serviceKeySettings> <keyProviderSettings> <keyProvider>com.supermap.model.util.SM4SecretKeyProvider</keyProvider> </keyProviderSettings> </encryption>
其中,
为了对瓦片使用期望的加密方式,还需要在 iserver-svcworkkeymappings.xml(【SuperMap iServer 安装目录】\webapps\iserver\WEB-INF\config下)文件中对能够获取该类型瓦片的服务进行 GIS 服务的动态加密配置。以下分别对三维、地图和数据服务能够进行瓦片加密的接口进行配置的举例说明:
<?xml version="1.0" encoding="UTF-8"?> <svcworkkeymappings> <!-- 三维服务组件加密配置(以后缀为.s3m的模型瓦片为例)--> <serviceType> <typeName>com.supermap.services.components.impl.RealspaceImpl</typeName> <keyID>keyID1</keyID> <urls> <string>/iserver/services/.*?/rest/realspace/datas/.*?/data/path/.*?/.*?\.s3m.*</string> </urls> </serviceType> <!-- 地图服务组件加密配置(以后缀为.mvt的矢量瓦片为例)--> <serviceType> <typeName>com.supermap.services.components.impl.MapImpl</typeName> <keyID>keyID2</keyID> <urls> <string>/iserver/services/.*?/rest/maps/.*?/tileFeature\.mvt.*</string> <string>/iserver/services/.*?/restjsr/v1/vectortile/maps/.*?/tiles/.*?/.*?/.*?\.mvt.*</string> </urls> </serviceType> <!-- 数据服务组件加密配置(以后缀为.mvt的矢量瓦片为例)--> <serviceType> <typeName>com.supermap.services.components.impl.DataImpl</typeName> <keyID>keyID3</keyID> <urls> <string>/iserver/services/.*?/rest/data/datasources/.*?/datasets/.*?/tileFeature\.mvt.*</string> </urls> </serviceType> </svcworkkeymappings>
其中,
例如:对矢量瓦片服务 tiles 接口 (示例 url:http://localhost:8090/iserver/services/map-world/restjsr/v1/vectortile/maps/World/tiles/0/0/0.mvt)进行加密,则 <string> 节点中需配置为 /iserver/services/.*?/restjsr/v1/vectortile/maps/.*?/tiles/.*?/.*?/.*?\.mvt.*
完成上述配置后重启SuperMap iServer再发布服务,瓦片加密配置即可生效。您可以通过如下两个方面来验证是否生效。
{
...
"serviceEncryptInfo":
{
"encrptSpec":
{
"keyLength":128,
"attributes":null,
"version":"1.1",
"algorithm":"SM4"
}
"updateTime":"Fri Sep 06 10:07:15 CST 2024",
"encrptKeyID":"keyID1"
}
...
"url": "http://localhost:8090/iserver/services/map-China100/restjsr"
}
经 SuperMap iServer 加密后的瓦片数据仅能通过客户端解密进行浏览。以下将从 SuperMap 二维客户端和三维客户端两个方面进行介绍如何对加密的瓦片数据进行加载显示。
SuperMap iClient 11i(2024)中提供了 OpenLayers 和 MapboxGL 用于解密浏览矢量瓦片数据的 API,详情请参考 SuperMap iClient 官网帮助文档。以下提供简要示例代码来说明具体的应用方式:
在常规代码中增加 decrypt 参数,当为 true 时表示对瓦片进行解密请求。执行代码后,iServer 发布的服务即可解密并进行矢量瓦片出图。
<script type="text/javascript">
const styleURL =
"http://localhost:8090/iserver/services/map-China100/restjsr/v1/vectortile/maps/China_4326/style.json";
...
style.on('styleloaded', function () {
const vectorLayer = new ol.layer.VectorTile({
declutter: true,
source: new ol.source.VectorTileSuperMapRest({
style: styleURL,
projection: 'EPSG:4326',
format: format,
decrypt: true //解密参数
}),
style: style.getStyleFunction()
});
map.addLayer(vectorLayer);
});
</script>
在常规代码中增加 decryptSources 类,并配置 style 中的 source 值,如 China。执行代码后,iServer 发布的服务即可解密并进行矢量瓦片出图。
<script type="text/javascript">
mapboxgl.supermap.decryptSources.set(["China"]); //解密参数
var map = new mapboxgl.Map({
container: "map",
renderWorldCopies: false,
style: "http://172.16.15.94:8090/iserver/services/map-China100/rest/maps/China/tileFeature/vectorstyles.json?type=MapBox_GL&styleonly=true",
center: [106, 35],
zoom: 4
});
</script>
SuperMap iClient3D for WebGL/WebGPU 11i(2024) SP1 中支持对 S3M 三维模型瓦片进行解密浏览,无需在代码中增加更多参数,引入 SuperMap iServer 使用三维模型瓦片发布的三维服务地址后,即可执行代码进行浏览。以下提供简要示例代码来说明具体的应用方式:
<script type="text/javascript">
function init(SuperMap3D, scene, viewer) {
...
try{
var promise = scene.open("http://localhost:8090/iserver/services/3D-CBD/rest/realspace");
SuperMap3D.when(promise,function(layers){
var layer = scene.layers.find('Config');
sceneLayer = layer;
},function(){
var title = '加载SCP失败,请检查网络连接状态或者url地址是否正确?';
widget.showErrorPanel(title, undefined, e);
});
}
catch(e){
if (widget._showRenderLoopErrors) {
var title = '渲染时发生错误,已停止渲染。';
widget.showErrorPanel(title, undefined, e);
}
}
...
}
</script>