Kmip1.0测试环境介绍:http://blog.csdn.net/lihuayong/article/details/25098093

1 测试环境整体结构

系统的结构是基于客户端-服务器体系结构(见下图)。红色水平虚线显示了KMIP1.0库和测试环境的边界。实现的测试环境由一个客户端和服务器端组成。客户端提供一个GUI程序,服务器端是一个servlet、一个简化KLMS和一个固有适配器。

默认情况下,客户端和服务器之间建立一个SSL/TLS连接。测试用例中,通过改变配置文件中的通信层配置,客户端和服务器之间也可以建立一个http连接。

在服务器端,一个web应用服务器配上一个servlet,负责通信和消息的转发。解码消息后,适配器的任务是翻译KMIP成为KLMS可以理解的格式。想使用KMIP库与现有KLMS系统的用户必须实现这个功能。所实现的测试环境的KLMS有4层架构,一个接口层、服务层、管理器层和数据层。然而,目前该系统只支持KMIP1.0用例中指定的部分操作。

2 client GUI 客户端

客户端GUI(client GUI)(见下图)作为一个测试用例的展示窗口,窗口中展示了KMIP1.0一系列的测试用例的标题,窗口允许我们选择一个测试用例,并发送该测试用例的请求到服务端。

界面上展示的这些测试用例来自一个XML文件,可以在该GUI界面创建任何其他测试请求,比如创建请求一个128位长的对称密钥用于AES加密。此信息被转发到stub,该请求封装成一个KMIP容器,该容器由KMIP指定的对象、属性和操作填充。

客户端测试用例基本格式如下,存放在UseCases.xml文件中,每一个usecase标签就是一个在GUI界面上展示出来的用例。

<usecases><usecase id="03110"><name><![CDATA[Use Case 3.1.1 (0) - Create]]></name><description><![CDATA[]]></description><details><![CDATA[}]]></details><batches><batch><operation>Create</operation><templateattributestructure><type>TemplateAttribute</type><attribute><name>Cryptographic Algorithm</name><value>AES</value></attribute><attribute><name>Cryptographic Length</name><value>128</value></attribute><attribute><name>Cryptographic Usage Mask</name><value>0x0000000C</value></attribute></templateattributestructure><attributes><attribute><name>Object Type</name><value>SymmetricKey</value></attribute></attributes></batch></batches></usecase>
</usecases>

客户端的程序主要由两部分源码组成,一部分是构建客户端界面的源码,一部分是对用例文件 UseCases.xml的解析并封装的源码。客户端界面不做分析。对XML 文件的解析并封装成为KMIPContainer的功能主要在KMIPClientGUIxml类中完成。

KMIPClientGUIxml该类作为客户端界面和KMIPContainer容器的一个中间处理类,一方面从界面上获取我们选择的测试用例,一方面将该测试用例从xml配置文件中解析出来,并将信息封装到容器中。

部分关键代码如下:

public class KMIPClientGUIxml{
/*** 创建并填充KMIPContainer容器,使用xml中的测试用例* @return*/public KMIPContainer getKMIPContainer() {//创建容器KMIPContainer container = new KMIPContainer();//填充请求头部信息addRequestHeaderOptionsToKMIPContainer(container);//填充请求的批处理,一个请求可以包含多个请求操作addRequestBatchesToKMIPContainer(container);return container;}
/*** 向容器中填充请求头部信息*/private void addRequestHeaderOptionsToKMIPContainer(KMIPContainer container){//n代表一个xml的Node节点,从n节点中获取requestheaderoptions元素//<requestheaderoptions>//  <option>//        <name>Asynchronous Indicator</name>//       <value>TRUE</value>//   </option>//</requestheaderoptions>Element requestHeaderOptions = getElement(n, "requestheaderoptions");if(requestHeaderOptions != null){//从requestheaderoptions节点中获取option元素NodeList optionList = getNodeList(requestHeaderOptions, "option");int optionCount = optionList.getLength();for (int j = 0; j < optionCount; j++) {Element option = (Element) optionList.item(j);//将该元素的值填充到容器中addHeaderOption(container, option);}}}
private void addHeaderOption(KMIPContainer container, Element option){String name = getTextFromElement(option, "name");if(name.equals("Authentication")){addAuthenticationToKMIPContainer(container, option);} else{String value = getTextFromElement(option, "value");container.setOption(name, value);}}
}

3 KMIPContainer KMIP容器

KMIPContainer这是一个大的容器类,客户端发送到服务端的任何请求,都是KMIPClientGUIxml封装成为一个KMIPContainer,然后Stub再将此容器中的信息根据KMIP1.0协议规范,通过编码器编码成为待发送的数据。发送请求的过程就是将请求封装成为KMIP协议的过程,KMIP协议需要的所有的内容都在KMIPContainer容器中,包括KMIP协议版本、操作、管理对象以及对象的属性等等,比如以上给出的测试用例片段中,该测试用例是创建一个对称密钥,使用operation标签标示一个新建操作,使用Object Type指定新建的管理对象为SymmetricKey(对称密钥),该密钥采用的算法由Cryptographic Algorithm指定,长度由Cryptographic Length指定,等等这些信息都将封装在容器中。

4 KMIPEncoder KMIP编码器

编码器(encoder)的任务是处理容器(KMIPContainer)中的信息和生成Tag-Type-Length-Value(TTLV)编码信息,根据KMIP规范。

假设客户端需要根据管理对象的主键(Unique Identifier)获取(Get操作)该对象的密钥值,KMIPContainer容器中填充的操作为Get,属性为Unique Identifier,该属性的值为1f165d65-cbbd-4bd6-9867-80e0b390acf9。通过编码器编码的结果如下:

Operation和Unique Identifier这样的tag也会使用数字编码来代替,具体使用什么编码,这些都是由KMIP1.0规范中指定。

5 KMIPDecoder KMIP解码器

解码器是编码器的配对,客户端将由编码器编码之后的结果发送服务端,服务端接收请求数据,不能直接进行操作,需要将接收到的数据通过解码器解码成为服务端能够理解的操作对象,也就是将接收到的TTLV编码转换成容器,服务端从容器中获取请求数据。

6 KLMSAdapter KLMS适配器

适配器允许KMIP适应任何现有的或新的KLMS。服务端在接收到客户端的请求之后,由解码器将请求信息进行解码,并将请求信息封装到KMIPContainer容器中,最终的请求是需要交给KLMS来处理,服务端的KLMS(密码生命周期管理系统)并不是KMIP库的一部分,它是独立于KMIP的一部分,所以KLMS接收的数据格式并不能总是和KMIP库处理的数据格式达成一致,此时就需要使用适配器模式将KMIPContainer容器中的数据转换成KLMS能够识别的数据格式。KMIP库中提供了一个接口KLMSAdapterInterface,该接口由KLMS负责具体的实现,如下图中KLMSAdapter,KLMSAdapter适配器类中对KMIP库中的数据格式进行转换,并将客户端的请求转发给KLMS类,KLMS类是KLMS系统的接入口。KMIPSkeleton是KMIP库中的骨架类,由它根据配置文件SkeletonConfig.xml中的Adapter配置参数对KLMSAdapter进行实例化。

SkeletonConfig.xml中关于适配器和KLMS配置内容如下:

<?xml version="1.0"?>
<skeleton-config><init-param><description>Define the fully qualified name of your Adapter</description><param-name>Adapter</param-name><param-value>ch.ntb.inf.klms.KLMSAdapter</param-value></init-param><init-param><description>Define the fully qualified name of your Key Lifecycle Management System</description><param-name>KLMS</param-name><param-value>ch.ntb.inf.klms.KLMS</param-value></init-param>
</skeleton-config>

KMIPSkeleton骨架类的部分代码:

public class KMIPSkeleton implements KMIPSkeletonInterface{private KLMSAdapterInterface klmsAdapter;private KMIPEncoderPool encoderPool;private KMIPDecoderPool decoderPool;public KMIPSkeleton() {super();try {//初始化SkeletonConfig.xml配置文件String xmlPath = this.getClass().getResource("config/").getPath();ContextProperties props = new ContextProperties(xmlPath, "SkeletonConfig.xml");//读取配置文件中的适配器this.klmsAdapter = (KLMSAdapterInterface) getClass(props.getProperty("Adapter"), DEFAULT_LOCATION_ADAPTER).newInstance();//读取配置文件中的KLMS接入口,并将KLMS类和适配器进行关联this.klmsAdapter.setKLMS(props.getProperty("KLMS"), DEFAULT_LOCATION_KLMS);//实例化编码器和解码器this.encoderPool = new KMIPEncoderPool(props.getProperty("Encoder"), DEFAULT_LOCATION_ENCODER);this.decoderPool = new KMIPDecoderPool(props.getProperty("Decoder"), DEFAULT_LOCATION_DECODER);......} catch (Exception e){e.printStackTrace();}}
}

KLMSAdapter适配器类的部分代码:

public class KLMSAdapter implements KLMSAdapterInterface{private KLMSInterface klms;public KLMSAdapter(){super();}public void setKLMS(String klmsPath, String defaultPath) throws InstantiationException, IllegalAccessException, ClassNotFoundException{//将KLMS类和适配器进行关联,适配器通过该klms便可以将请求传递给KLMS系统进行处理。this.klms = (KLMSInterface) Class.forName(KMIPUtils.getClassPath(klmsPath, defaultPath)).newInstance();}......
}

7 KMIPServlet

该Servlet主要负责客户端和服务端之间的通信和消息的转发。客户端将请求信息封装在KMIPRequest参数中,服务端Servlet在接收到请求之后,从该参数中获取请求信息,然后再传递给KMIP库,KMIPServlet主要代码如下:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//接收请求信息String kmipRequest = request.getParameter("KMIPRequest");//将16进制的字符串信息转换成为字节数组ArrayList<Byte> al =  KMIPUtils.convertHexStringToArrayList(kmipRequest);//将请求信息传递给KMIP库中的骨架类,由KMIP库负责进行处理ArrayList<Byte> kmipResponse = skeleton.processRequest(al);//将字节数组转换成为16进制的字符串,作为客户端请求的响应信息String kmipResponseString = KMIPUtils.convertArrayListToHexString(kmipResponse);//将响应信息发送给客户端sendPostResponse(response, kmipResponseString);}
private void sendPostResponse(HttpServletResponse response, String kmipResponseString) throws IOException {response.setContentType("text/plain");PrintWriter out = response.getWriter();out.println(kmipResponseString);out.flush();out.close();
}

8 KLMS 密钥生命周期管理系统

密钥管理系统是生成加密密钥对,并对其进行管理的系统,它负责密钥在整个生命周期中的安全管理,包括密钥的生成、存储、备份、更新、撤销、归档和恢复等全过程的管理。

9 处理流程

根据KMIP1.0协议的java开源实现,该图展示客户端发送请求、服务端处理请求、服务端处理响应、客户端处理响应的的大致过程。图中以客户端创建对称密钥为例,对测试环境的过程进行描述。

请求的发送过程:

1、KMIPClientGUI作为客户端的界面对象,接收用户的请求。

2、KMIPClientGUI接收到创建对称密钥请求之后,调用KMIPClientGUIxml的getKMIPContainer()方法,由KMIPClientGUIxml从UseCases.xml测试用例文件中读取用户在界面上选择的测试用例,并将请求信息封装到KMIPContainer容器中。

3、KMIPClientGUI调用KMIPStub对象的processRequest()方法,此处将请求交给KMIP 库处理,KMIPStub、KMIPEncoder、KMIPDecoder、KMIPStubTransportLayerHTTP对象都属于KMIP库。

4、KMIPStub将容器交给KMIPEncoder编码器进行编码,将请求信息编码成为TTLV格式。

5、编码完成之后,由KMIPStubTransportLayerHTTP将二进制的编码转换成为16进制的字符串,并负责将请求发送到服务端。

服务端对请求的处理过程:

1、服务端的KMIPServlet接收来自客户端的请求,并交给KMIPSkeleton进行处理,KMIPSkeleton、KMIPDecoder、KMIPEncoder属于KMIP库的对象。

2、KMIPSkeleton将request交给KMIPDecoder解码器进行解码,并将解码之后的信息封装在KMIPContainer容器中,KMIPSkeleton在将该容器交给KLMSAdapter适配器处理。

3、KLMSAdapter负责将容器中的信息转换成KLMS需要的参数格式,之后再根据请求信息中指定的操作,调用KLMS对应的操作,由此完成KMIP库和KLMS之间的适配。

4、KLMS、KLMSKeyLifecycleService、KLMSObjectManager、KLMSDatabase都属于密钥管理系统的对象,此后的操作都在该系统中完成,包括密钥的创建、存储、激活、撤销等等。

5、密钥管理系统完成请求之后,将处理的结果responseParameters返回给KLMSAdapter适配器作为响应。

KMIP4J数据处理流程相关推荐

  1. netflow报文格式与数据处理流程分析_RTK、三维激光扫描、无人机倾斜摄影在大比例尺地形图测绘的对比分析...

    [摘 要] 本文研究RTK.三维激光扫描和无人机三种地形图测绘的方法.RTK采用传统单点测图的方法,三维激光扫描采用三维点云测绘图的方法,无人机采用三维实景模型测图的方法.研究结果表明:大场景的地形图 ...

  2. 医疗大数据处理流程_我们需要数据来大规模改善医疗流程

    医疗大数据处理流程 Note: the fictitious examples and diagrams are for illustrative purposes ONLY. They are ma ...

  3. 计算机会计数据处理流程是怎样的,实现会计电算化后,会计数据的处理流程依旧和手工..._高级会计师_帮考网...

    bangkafan 高分答主 06-16 TA获得超过8931个赞 一.手工与电算化会计信息系统的数据处理流程: 1.相同点: ①数据处理步骤相似: ②会计信息相同且最终目标一致: ③遵守的会计法规和 ...

  4. 宏基因组单个样本数据处理流程笔记

    宏基因组单个样本数据处理流程笔记 前言 数据预处理 质量控制 去除接头序列 去除宿主序列 物种注释 Kraken2注释 Krona制图 序列组装 MEGAHIT序列组装 SPAdes序列组装 功能注释 ...

  5. 珞珈一号01星(luojia1-01)的夜间灯光影像数据处理流程

    珞珈一号01星(luojia1-01)的夜间灯光影像数据处理流程 书接上回,我们爬取了山东省的珞珈一号夜间灯光影像数据,现在我们来对数据进行预处理,以分区获取区域夜间灯光亮度值. (1)加载珞珈一号夜 ...

  6. 星星之火-42:LTE空口协议栈、数据处理流程与LTE的调制技术大全

    前言: LTE的数据处理,是数字调制.频分复用.时分复用.数模转换.模拟调制的集大成者. 这里汇集了众多的复杂的调制技术,包括高阶QAM正交幅度调制.正交多载波调制OFDM.CPRI传输.IQ双路正交 ...

  7. Gamit Gloness 数据处理 流程

    Gloness 数据处理 流程 一.准备文件 1.简述: 在使用Gamit处理数据的前期,需要自己准备文件,准备的文件在目前的处理策略中有: (1)精密星历文件(sp3文件)(示例文件名如下) igl ...

  8. 如何像海豚一样在数据海洋里遨游?|Hbase数据处理流程详解

    写在前面:我是「且听风吟」,目前是某上市游戏公司的大数据开发工程师,热爱大数据开源技术,喜欢分享自己的所学所悟,现阶段正在从头梳理大数据体系的知识,以后将会把时间重点放在Spark和Flink上面. ...

  9. 遥感数据处理流程新概念(一) ——RSD的面向任务

    目录 一 创建任务... 2 二 为任务添加数据... 3 三 拼接... 5 四 剪切... 11 五 不落地继续分类?... 13 六 创建/保存任务目录... 13 七 讨论... 14 提到了 ...

最新文章

  1. 11年的计算机二级vf考试试题,2011年计算机等级考试二级VFP 辅助练习题及答案
  2. 最长不下降子序列java代码_浅谈最长不下降子序列与最长上升子序列
  3. MonogoDb学习笔记
  4. AcWing算法基础课 Level-2 第三讲 搜索与图论
  5. Samba服务器如何与Windows 95共享?
  6. 多文件目录下makefile文件递归执行编译所有c文件 很不错
  7. nfs服务器远程访问,NFS远程共享存储
  8. mysql数据库日志截断,MySQL基础(十一):查询截取分析
  9. MFC版链表实现稀疏多项式相加减
  10. 企业效益真的向好么?
  11. SQL2005中使用backup、restore来备份和恢复数据库
  12. pycharm快捷键之①“上下移动某一行“②参数提示
  13. python3爬虫必学Xpath,快速使用lxml.etree
  14. win7下安装sqlServer2000
  15. 考研常识:考研加分和照顾政策有哪些?
  16. BP神经网络理解及公式推导
  17. 以太网MII接口类型大全-MII、RMII、SMII、GMII、RGMII、SGMII、XGMII、XAUI、RXAUI
  18. [刷题]leetcode\167_两数之和Ⅱ
  19. 设计类网站的“联系我们”页面设计盘点
  20. VC++, VC#, VB.NET 编码规范 (微软一站式示例代码库)

热门文章

  1. 让小程序完美支持Markdown,最详细教程来了
  2. Latex Misplaced alignment tab character . 的一种可能错误
  3. Pycharm mac 语法检测失效
  4. 原生JS实现2048小游戏
  5. gis插入的文本怎么搞成两行_怎么样制作标书?Word排版技巧大全,让标书制作更简单...
  6. crontab:周期任务的配置文件
  7. 关于C/C++动态申请空间释放和内存泄漏问题介绍
  8. 【无标题】性价比超高的ARM Cortex-M0核32位单片机
  9. python第一课笔记
  10. OpenCV进阶(10)在 OpenCV 中使用 ArUco 标记的增强现实