南京海关物流监控信息化管理系统.docx
《南京海关物流监控信息化管理系统.docx》由会员分享,可在线阅读,更多相关《南京海关物流监控信息化管理系统.docx(15页珍藏版)》请在冰豆网上搜索。
南京海关物流监控信息化管理系统
南京海关物流监控信息化管理系统
附件3
南京海关物流监控信息化管理系统
报文交换方式技术要求
一、应用方式介绍
南京海关于外联网上设置报文接收MQ通道,企业将符合格式要求的报文,按南京海关MQ报文交换标准进行自动传输,同时提供相应接收MQ通道,海关负责将有关回执信息写入该通道,由企业自行读取处理。
报文交换基本流程图
流程说明:
1.企业将报文(运抵报告、理货报告),加签,压缩、通过IPSECVPN安全通道,发送至南京海关外联网上的服务器端程序指定的MQ队列中。
2.南京海关从外联网的指定MQ队列取出企业报送的报文,经过解压缩,验证签名,存证后发往海关管理网,供海关关员业务处理。
同时发送接收回执。
3.海关关员在物流系统进行审批处理或新舱单系统中进行舱单业务处理。
4.海关系统将生成的业务回执签名、压缩、通过IPSECVPN安全通道,写入企业端回执信息接收队列中;
5.企业系统从企业队列中读取回执,解压、验签,进行进一步的业务处理。
二、技术要求
采用该方式的企业,需进行如下准备工作:
(一)实现与海关的VPN联网
企业准备一条具有固定公网IP地址的互联网接入线路,配备VPN接入设备。
建议VPN设备型号和规格如下:
JuniperNetscreenSSG5
(南京海关端使用的是Juniper的产品,推荐使用该产品)
其他可选设备:
CiscoASA5505
FortinetFortigate30B
为非事物性队列。
业务报文接收队列用于接收企业申报的业务报文数据,传输回执接收队列用于接收海关业务回执报文是否验签成功的信息。
2.目前海关接受队列地址。
●新舱单及海运部分报文
海运业务报文接收队列(事务性队列)
FORMATNAME:
DIRECT=TCP:
192.168.2.124\private$\east_sample_message_qy
海运传输回执接受队列(非事务性队列)
FORMATNAME:
DIRECT=TCP:
192.168.2.124\private$\east_sample_response
●监管点部分报文
监管点业务报文接收队列(事务性队列)
FORMATNAME:
DIRECT=TCP:
192.168.2.124\private$\east_eci_message_qy
监管点传输回执接受队列(非事务性队列)
FORMATNAME:
DIRECT=TCP:
192.168.2.124\private$\east_eci_response
3.企业报文传输分两个阶段:
企业申报报文发送阶段及企业回执报文接受阶段。
具体流程图如下
企业申报报文发送阶段,主要步骤为6步:
(1)企业应用系统生成符合海关规范的申报报文,
(2)调用相应的CA控件队报文进行数字签名
(3)将数字签名后的报文进行ZIP压缩
(4)将压缩后的数据内存流转换成字符数组,并作base64编码。
(5)将Base64编码后的报文数据写入海关企业报文接受队列中。
注意:
写入规范为将申报报文的文件名赋值给消息的标签(Label)属性,报文内容赋值给消息的报文体(Body)属性。
企业传输回执接受队列地址赋值给消息的回执报文队列(ResponseQueue)属性。
(6)从企业传输回执接受队列中收取海关传输回执消息。
回执消息的标签(Label)属性为回执报文的文件名(即企业申报报文的文件名),回执消息的报文体(Body)属性为回执报文的内容。
回执报文的内容为布尔值“TRUE”或“FALSE”,“TRUE”表示该企业申报报文海关验证通过,“FALSE”表示该企业申报报文海关验证未通过。
企业回执报文接收阶段,主要步骤也分为6步:
(1)企业应用系统将接收海关业务回执的队列中的回执报文读出。
报文内容为回执消息报文体(Body)属性中的内容,报文名为回执消息的标签(Label)属性的内容。
海关传输回执接受队列地址为回执消息的回执报文队列(ResponseQueue)属性的内容。
(2)将报文内容(BASE64编码)转化为字节数组。
(3)将字节数组解压缩转换成报文原文。
(4)调用相应CA控件验证海关数字签名。
(5)生成传输回执消息发送至海关传输回执接受队列。
同样,传输回执消息的标签(Label)属性为报文的文件名(即海关回执报文的文件名),传输回执消息的报文体(Body)属性为回执报文的内容。
回执报文的内容为布尔值“TRUE”或“FALSE”,“TURE”表示该海关回执报文企业验证通过,“FALSE”表示该海关回执报文企业验证未通过。
(6)企业应用系统使用海关回执报文。
4.开发报文传输程序可参考本文第四部分“报文传输软件参考程序片断”。
三、采用IPSecVPN技术与南京海关联网的设备配置规范
(一)采用IPSecVPN技术与海关联网项目拓扑图
以互联网为底层网络、符合PKI安全协议族规范的、站点到站点的VPN技术,一般使用IPSecVPN技术。
(二)联网单位IPSecVPN网关的选型
联网单位选用的IPSecVPN网关建议采用具备IPSecVPN功能的硬件防火墙,可以选用的设备包括JuniperNetscreenSSG系列(最低端的产品为SSG5)、思科ASA系列(最低端的产品为ASA5505)、Fortinet、SonicWall等厂商的产品。
(三)联网单位提供信息
联网单位提供以下信息:
申请联网单位全称;申请线路的公网ip地址、子网掩码;申请线路的电信网关;企业申请线路的性质(Lan或者ADSL)。
(四)南京海关提供信息
根据联网单位提供的网络信息,由海关向联网单位提供以下信息:
该联网企业端设备的内部ip地址网段、子网掩码、网关;南京海关IPSecVPN采用AutoIKE,提供建立VPN通道所需要的信息,包括PresharedKey、Phase1Proposal算法、Phase2Proposal算法、南京海关端公网ip地址。
(五)联网单位设备配置规范
南京海关使用的IPSecVPN设备是JuniperNetscreen系列产品,本配置规范以JuniperNetscreen5GT为例,Netscreen系列其他型号或者采用其他品牌的可参照该配置指导方案进行配置。
1.设备的工作模式
netscreen设备不允许上英特网,模式配置成为dual-untrust模式。
与海关联网的网段设置在trust区域。
2.地址列表定义
各个客户端设备trust区域地址列表名称为:
local。
Untrust区域地址列表名称为:
customs,地址为192.168.0.0/16。
端口信息配置trust地址填写分配的网段第一个可用地址做为端口地址,同时WebUI、Telnet、Ping都选中;untrust口信息填写公网ip地址的第一个可用的ip地址,如某企业公网ip为58.213.134.112/27,电信网关ip为58.213.134.113,公网地址就使用网关之后的第一个地址,即58.213.134.114。
3.VPN配置
新建一条tunnel,zoneuntrust,unnumbered选中,interface选择连接外网的端口号。
建立的第一阶段:
GatewayName:
名称统一为vpn_to_customs_p1,RemoteGatewayType选择StaticIPAddress,IPAddress/Host:
填写南京海关端公网ip地址。
PresharedKey和Prase1Proposal按照南京海关所发文档配置。
建立的第二阶段:
VPNName:
名称统一为vpn_to_customs_p2,RemoteGateway选中Predefied,下拉列表中选择vpn_to_customs_p1,Prase2Proposal按照所发文档配置,Bindto选中,并选新建的tunnel,proxy-ID选中,LocalIP/Netmask填写客户端的ip网段和掩码,RomoteIP/Netmask填写192.168.0.0/16,选中VPNMonitor即可。
4.路由配置
新建2条路由,第一条路由NetworkAddress/Netmask填写0.0.0.0/0,选中Gateway,Interface选择连接外网的端口号,GatewayIPAddress填写该宽带的网关地址,点击OK按钮;第二条路由NetworkAddress/Netmask填写192.168.0.0/16,选中Gateway,Interface选择新建的tunnel,点击OK按钮。
5.策略配置
首先把any–any策略去除;从untrust到trust区域,源选择customs,目的选中local,service选中any,logging选中;从trust区域到untrust,源选中local,目的选择customs,service选中any,logging选中。
6.修改用户名口令
修改系统默认的用户名、口令。
四、报文传输软件参考程序片断
(一)签名
publicstaticstringSignXml(stringxmlContent)
{
if(provider.ToLower()=="uni")
{
if(signaturer.ToLower()=="server")
{
SignatureInterface.SignatureInterfacePortTypeClientsig=newMsgTrnsCommon.SignatureInterface.SignatureInterfacePortTypeClient();
returnsig.getXMLSignature(ConfigurationManager.AppSettings["SystemId"],xmlContent);
}
else
{
returnUniClient.XMLSignMQ(xmlContent);
}
}
elseif(provider.ToLower()=="jsca")
{
if(signaturer.ToLower()=="server")
{
JsServer.SetServer(ConfigurationManager.AppSettings["JsServer"],int.Parse(ConfigurationManager.AppSettings["SignPort"]));
returnJsServer.gtSignXmlString(xmlContent,ConfigurationManager.AppSettings["JsCert"]);
}
else
{
returnJsClient.gtSignXmlString(xmlContent);
}
}
else
returnstring.Empty;
}
(二)验签
publicstaticstringVerifySign(stringxmlContent)
{
if(provider.ToLower()=="uni")
{
if(verifier.ToLower()=="server")
{
VerifySignature.VerifySignatureInterfacePortTypeClientver=newMsgTrnsCommon.VerifySignature.VerifySignatureInterfacePortTypeClient();
returnver.xmlVerifySignature(xmlContent);
}
else
{
returnUniClient.XMLVerifyMQSign(xmlContent);
}
}
elseif(provider.ToLower()=="jsca")
{
if(verifier.ToLower()=="server")
{
JsServer.SetServer(ConfigurationManager.AppSettings["JsServer"],int.Parse(ConfigurationManager.AppSettings["ValiPort"]));
returnJsServer.gtVerifyXmlString(xmlContent);
}
else
{
UTF8Encodingut=newUTF8Encoding();
Byte[]encodedBytes=ut.GetBytes(xmlContent);
StringdecodedString=ut.GetString(encodedBytes);
returnJsClient.gtVerifyXmlString(decodedString);
}
}
else
returnstring.Empty;
}
(三)压缩
publicstaticStreamCompress(Streams)
{
s.Seek(0,SeekOrigin.Begin);
MemoryStreamcs=newMemoryStream();
try
{
DeflaterOutputStreamcs1=newDeflaterOutputStream(s,newDeflater(Deflater.BEST_COMPRESSION));
StreamCopy(cs,cs1,streamCopyBufferSize);
}
catch(Exceptionex)
{
Logging.LogManager.GetLogger().Error("压缩程序出错",ex);
throwex;
}
cs.Seek(0,SeekOrigin.Begin);
returncs;
}
(四)解压缩
publicstaticStreamDecompress(Streams)
{
InflaterInputStreaminflaterInputStream=null;
try
{
s.Seek(0,SeekOrigin.Begin);
inflaterInputStream=newInflaterInputStream(s);
}
catch(Exceptionex)
{
Logging.LogManager.GetLogger().Error("解压缩出错",ex);
throw(newException("出错函数"+"Decompress"+ex.Message));
}
returninflaterInputStream;
}
(五)字节数组与Base64的转换:
staticvoidMain(string[]args)
{
stringfactString="中华人民共和国";
byte[]myByte;
stringBase64Str;
//先把字符串按照utf-8的编码转换成byte[]
EncodingmyEncoding=Encoding.GetEncoding("utf-8");
//myByte中获得这样的字节数组:
228,184,173,229,141,142,228,186,186,230,176,145,229,133,177,229,146,140,229,155,189
myByte=myEncoding.GetBytes(factString);
//把byte[]转成base64编码,这个例子形成的base64编码的unicode等价字符串为:
"5Lit5Y2O5Lq65rCR5YWx5ZKM5Zu9"
Base64Str=Convert.ToBase64String(myByte);
//再从base64编码转成byte[],又恢复为字节数组:
228,184,173,229,141,142,228,186,186,230,176,145,229,133,177,229,146,140,229,155,189
myByte=Convert.FromBase64String(Base64Str);
//用同一个Encoding对象把byte[]转成字符串:
"中华人民共和国"
factString=myEncoding.GetString(myByte);
Console.WriteLine(factString);
}
注:
以上程序片断不作为报文传输软件开发依据,仅供开发时参考。