资源描述
附件3
南京海关物流监控信息化管理系统
报文交换方法技术要求
一、应用方法介绍
南京海相关外联网上设置报文接收MQ通道,企业将符合格式要求报文,按南京海关MQ报文交换标准进行自动传输,同时提供对应接收MQ通道,海关负责将相关回执信息写入该通道,由企业自行读取处理。
报文交换基础步骤图
步骤说明:
1.企业将报文(运抵汇报、理货汇报),加签,压缩、经过IPSEC VPN安全通道,发送至南京海关外联网上服务器端程序指定MQ队列中。
2.南京海关从外联网指定MQ队列取出企业报送报文,经过解压缩,验证署名,存证后发往海关管理网,供海关关员业务处理。同时发送接收回执。
3.海关关员在物流系统进行审批处理或新舱单系统中进行舱单业务处理。
4.海关系统将生成业务回执署名、压缩、经过IPSEC VPN安全通道,写入企业端回执信息接收队列中;
5.企业系统从企业队列中读取回执,解压、验签,进行深入业务处理。
二、技术要求
采取该方法企业,需进行以下准备工作:
(一)实现和海关VPN联网
企业准备一条含有固定公网IP地址互联网接入线路,配置VPN接入设备。提议VPN设备型号和规格以下:
Juniper Netscreen SSG5
(南京海关端使用是Juniper产品,推荐使用该产品)
其它可选设备:
Cisco ASA 5505
Fortinet Fortigate 30B
根据《采取IPSec VPN技术和南京海关联网设备配置规范》(详见本文第三部分)规范配置实施和海关网络互联。南京海关技术处提供相关技术支持,联络方法为南京海关技术热线:。
(二)购置和本系统配套CA认证卡(USB Key)
该Key购置方法和网站程序录入方法相同,但企业需要基于该Key进行编程,实现报文发送接收加验签。CA企业提供报文署名、验签控件等对应编程接口,各企业可在开发中使用,相关技术支持由CA企业负担。
报文数字署名要求:和海关交换报文和回执均须进行数字署名,可采取省CA企业或联通CA企业CA体系,由用户自行选择。企业用户需基于USBKey对向海关申报XML报文内容进行加签,并对海关回执报文验签。加签验签标准以海关总署81号公告中《中国海关进出境水运、空运货物舱单报文格式制订说明》相关报文数字署名要求为准。
经和两CA企业协商,两家企业均已开发出符合上述规范报文加签验签标准接口,企业用户如开发程序需要,可和相关CA企业联络,相关CA企业提供对应开发接口程序及技术支持
CA企业技术开发接口联络人以下:
联通CA 企业联络人:吉庆祥, 电话 邮箱
省CA企业联络人:刘洋,电话:,手机:,邮箱:
(三)生成符合标准报文
企业根据南京海关报文规范,从本身业务系统中抽取形成标准报文。具体报文规范及格式要求见南京海关相关公告。
(四)开发报文传输软件
企业需开发报文传输系统,根据海关确定标准接口,把海关要求申报报文数字署名后发送给海关,同时接收海关回执报文。报文传输采取MSMQ3.0软件,CA体系支持江苏CA和联通CA两类。
1.具体传输方法
企业端需要建立2个MQ队列。其一为接收海关业务回执队列,此队列为事务性队列。企业需要提供相关MQ地址信息(格式
FORMATNAME:DIRECT=TCP:192.168.170.2\private$\client_sample_response,其中“192.168.170.2”应填海关在VPN网上分配给企业MQ服务器地址)。其二为接收报文是否验签成功传输回执接收队列,此队列为非事务性队列。企业需要提供相关MQ地址等信息(格式FORMATNAME:DIRECT=TCP:192.168.170.2\private$\client_sample_receipt,其中“192.168.170.2”应填海关在VPN网上分配给企业MQ服务器地址),海关端程序将向两个队列中写入对应回执信息。企业端程序负责从对应队列中读取回执,如企业需要能够进行相关报文存证,企业要对队列进行实时监控,保持MQ报文传输服务器稳定性和消息队列通畅。
针对海运部分系统及监管点部分系统,海关分别提供2个报文接收队列,业务报文接收队列为MSMQ事务性队列,传输回执接收队列为非事物性队列。业务报文接收队列用于接收企业申报业务报文数据,传输回执接收队列用于接收海关业务回执报文是否验签成功信息。
2.现在海关接收队列地址。
l 新舱单及海运部分报文
海运业务报文接收队列(事务性队列)
FORMATNAME:DIRECT=TCP:192.168.2.124\private$\east_sample_message_qy
海运传输回执接收队列(非事务性队列)
FORMATNAME:DIRECT=TCP:192.168.2.124\private$\east_sample_response
l 监管点部分报文
监管点业务报文接收队列(事务性队列)
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.开发报文传输程序可参考本文第四部分“报文传输软件参考程序片断”。
三、采取IPSec VPN技术和南京海关联网设备配置规范
(一) 采取IPSec VPN技术和海关联网项目拓扑图
以互联网为底层网络、符合PKI安全协议族规范、站点到站点VPN技术,通常使用IPSec VPN技术。
(二) 联网单位IPSec VPN网关选型
联网单位选择IPSec VPN网关提议采取含有IPSec VPN功效硬件防火墙,能够选择设备包含Juniper Netscreen SSG系列(最低端产品为SSG 5)、思科ASA系列(最低端产品为ASA 5505)、Fortinet、SonicWall等厂商产品。
(三) 联网单位提供信息
联网单位提供以下信息:
申请联网单位全称;申请线路公网ip地址、子网掩码;申请线路电信网关;企业申请线路性质(Lan或ADSL)。
(四) 南京海关提供信息
依据联网单位提供网络信息,由海关向联网单位提供以下信息:
该联网企业端设备内部ip地址网段、子网掩码、网关;南京海关IPSec VPN采取AutoIKE,提供建立VPN通道所需要信息,包含PresharedKey、Phase 1 Proposal算法、Phase 2 Proposal算法、南京海关端公网ip地址。
(五) 联网单位设备配置规范
南京海关使用IPSec VPN设备是Juniper Netscreen系列产品,本配置规范以Juniper Netscreen 5GT为例,Netscreen系列其它型号或采取其它品牌可参考该配置指导方案进行配置。
1.设备工作模式
netscreen设备不许可上英特网,模式配置成为dual-untrust模式。和海关联网网段设置在trust区域。
2.地址列表定义
各个用户端设备trust区域地址列表名称为:local。
Untrust区域地址列表名称为:customs,地址为192.168.0.0/16。端口信息配置trust地址填写分配网段第一个可用地址做为端口地址,同时Web UI、Telnet、Ping全部选中;untrust口信息填写公网ip地址第一个可用ip地址,如某企业公网ip为58.213.134.112/27,电信网关ip为58.213.134.113,公网地址就使用网关以后第一个地址,即58.213.134.114。
3.VPN配置
新建一条tunnel,zone untrust,unnumbered 选中,interface选择连接外网端口号。
建立第一阶段:
Gateway Name:名称统一为vpn_to_customs_p1,Remote Gateway Type选择Static IP Address,IP Address/Host :填写南京海关端公网ip地址。Preshared Key和Prase 1 Proposal根据南京海关所发文档配置。
建立第二阶段:
VPN Name:名称统一为vpn_to_customs_p2,Remote Gateway选中Predefied ,下拉列表中选择vpn_to_customs_p1,Prase 2 Proposal根据所发文档配置,Bind to 选中,并选新建tunnel,proxy-ID选中,Local IP/Netmask填写用户端ip网段和掩码,Romote IP/Netmask填写192.168.0.0/16,选中VPN Monitor即可。
4.路由配置
新建2条路由,第一条路由Network Address/Netmask填写0.0.0.0/0,选中Gateway ,Interface选择连接外网端口号,Gateway IP Address填写该宽带网关地址,点击OK按钮;第二条路由Network Address/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.修改用户名口令
修改系统默认用户名、口令。
四、报文传输软件参考程序片断
(一)署名
public static string SignXml(string xmlContent)
{
if (provider.ToLower() == "uni")
{
if (signaturer.ToLower() == "server")
{
SignatureInterface.SignatureInterfacePortTypeClient sig = new MsgTrnsCommon.SignatureInterface.SignatureInterfacePortTypeClient();
return sig.getXMLSignature(ConfigurationManager.AppSettings["SystemId"], xmlContent);
}
else
{
return UniClient.XMLSignMQ(xmlContent);
}
}
else if (provider.ToLower() == "jsca")
{
if (signaturer.ToLower() == "server")
{
JsServer.SetServer(ConfigurationManager.AppSettings["JsServer"],int.Parse(ConfigurationManager.AppSettings["SignPort"]));
return JsServer.gtSignXmlString(xmlContent, ConfigurationManager.AppSettings["JsCert"]);
}
else
{
return JsClient.gtSignXmlString(xmlContent);
}
}
else
return string.Empty;
}
(二) 验签
public static string VerifySign(string xmlContent)
{
if (provider.ToLower() == "uni")
{
if (verifier.ToLower() == "server")
{
VerifySignature.VerifySignatureInterfacePortTypeClient ver = new MsgTrnsCommon.VerifySignature.VerifySignatureInterfacePortTypeClient();
return ver.xmlVerifySignature(xmlContent);
}
else
{
return UniClient.XMLVerifyMQSign(xmlContent);
}
}
else if (provider.ToLower() == "jsca")
{
if (verifier.ToLower() == "server")
{
JsServer.SetServer(ConfigurationManager.AppSettings["JsServer"],int.Parse( ConfigurationManager.AppSettings["ValiPort"]));
return JsServer.gtVerifyXmlString(xmlContent);
}
else
{
UTF8Encoding ut = new UTF8Encoding();
Byte[] encodedBytes = ut.GetBytes(xmlContent);
String decodedString = ut.GetString(encodedBytes);
return JsClient.gtVerifyXmlString(decodedString);
}
}
else
return string.Empty;
}
(三) 压缩
public static Stream Compress(Stream s)
{
s.Seek(0, SeekOrigin.Begin);
MemoryStream cs = new MemoryStream();
try
{
DeflaterOutputStream cs1 = new DeflaterOutputStream(s, new Deflater(Deflater.BEST_COMPRESSION));
StreamCopy(cs, cs1, streamCopyBufferSize);
}
catch (Exception ex)
{
Logging.LogManager.GetLogger().Error("压缩程序犯错", ex);
throw ex;
}
cs.Seek(0, SeekOrigin.Begin);
return cs;
}
(四) 解压缩
public static Stream Decompress(Stream s)
{
InflaterInputStream inflaterInputStream = null;
try
{
s.Seek(0, SeekOrigin.Begin);
inflaterInputStream = new InflaterInputStream(s);
}
catch (Exception ex)
{
Logging.LogManager.GetLogger().Error("解压缩犯错", ex);
throw (new Exception("犯错函数" + "Decompress " + ex.Message));
}
return inflaterInputStream;
}
(五) 字节数组和Base64转换:
static void Main(string[] args)
{
string factString = "中国";
byte[] myByte;
string Base64Str;
//先把字符串根据utf-8编码转换成byte[]
Encoding myEncoding = 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);
}
注:以上程序片断不作为报文传输软件开发依据,仅供开发时参考。
展开阅读全文