KMIP4J数据处理流程

article/2025/10/27 1:33:30

        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系统的用户必须实现这个功能。所实现的测试环境的KLMS4架构,一个接口层、服务层、管理器层和数据层。然而目前该系统只支持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。通过编码器编码的结果如下:

 

        OperationUnique 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负责具体的实现,如下图中KLMSAdapterKLMSAdapter适配器类中对KMIP库中的数据格式进行转换,并将客户端的请求转发给KLMS类,KLMS类是KLMS系统的接入口。KMIPSkeletonKMIP库中的骨架类,由它根据配置文件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接收到创建对称密钥请求之后,调用KMIPClientGUIxmlgetKMIPContainer()方法,由KMIPClientGUIxmlUseCases.xml测试用例文件中读取用户在界面上选择的测试用例,并将请求信息封装到KMIPContainer容器中。

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

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

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

 

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

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

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

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

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

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


http://chatgpt.dhexx.cn/article/raYbYvoJ.shtml

相关文章

KMIP1.0环境搭建

开发环境&#xff1a;MyEclipse 10 JDK&#xff1a;jdk1.7 Tomcat&#xff1a;apache-tomcat-7.0.6 数据库&#xff1a;H2嵌入式数据库 下载java 实现的KIMP1.0版本的源码包和相关的jar包文件。 下载地址&#xff1a;http://sourceforge.net/projects/kmip4j/files/KMIP4J-V1.0…

kmip4j_KMIP4J入门

kmip4j 有关管理数据安全性和合规性的电子书 组织难以确定多个合规性任务的优先级,并创建数据安全策略来满足这些要求并保护其最敏感的数据。 您可以下载eBook, 管理合规性并保护企业数据 ,以了解在企业数据保护策略中有效管理合规性要求和保护数据的六个基本步骤。 “加密…

KMIP协议/TTLV格式解码

文章目录 KMIP协议官方文档手动解析TTLV格式请求响应 自动解析解析请求和响应 KMIP协议官方文档 KMIP协议官方文档&#xff1a;http://docs.oasis-open.org/kmip/spec/ 打开是这样的&#xff0c;在我写这篇文章的时候 KMIP更新到了1.4版本 以下KIMIP1.0协议为例&#xff1a; …

导入pfx证书

本文分享从Micrsoft Manange Console&#xff08;简写为 MMC&#xff09;中导入PFX证书的内容&#xff0c;您可以按住“Windows R”&#xff0c;从Run对话框中输入mmc&#xff0c;打开MMC界面。 一&#xff1a;添加管理单元&#xff08;snap-in&#xff09; 从File主菜单中选…

关于pfx证书和cer证书

Pfx证书&#xff0c;同时包含了公钥信息和私钥信息&#xff08;用私钥加密进行签名证明是本人签名&#xff0c;用公钥解密对签名进行进行验证&#xff0c;证明签名的合法性&#xff09; PFX也称为PKCS#12(Public Key Cryptography Standards #12&#xff0c;公钥密码技术标准#…

OpenSSL 生成pfx

OpenSSL 生成pfx Window需要安装OpenSSL&#xff08;需要下载&#xff09;&#xff0c;Linux自带OpenSSL工具&#xff08;无需安装&#xff09; Window下载地址&#xff1a; 1. 官网 2. 上传了一份到csdn Window 命令 # 生成私钥 "D:\Program Files\OpenSSL-Win64\bi…

pfx 证书 转 jks 证书

今天在tomcat 配置 https pfx 证书时 总是配置失败 很是 头疼 &#xff0c;配置参数如下&#xff1a; <Connector port"443" protocol"org.apache.coyote.http11.Http11Protocol" SSLEnabled"true"maxThreads"150" scheme"ht…

通过openssl生成pfx证书

通过centos7上自带的openssl工具来生成。首先创建一个pfxcert目录。然后进入此目录。 1.生成.key文件&#xff08;内含被加密后的私钥&#xff09;&#xff0c;要求输入一个自定义的密码 [rootlocalhost cert]# openssl genrsa -des3 -out server.key 2048 Generating RSA priv…

windows合成pfx

思路 通过openssl工具合成pfx 步骤 1、通常情况下&#xff0c;开发人员的电脑都会安装git version软件&#xff0c;没有的话可以安装一个 2、安装好之后&#xff0c;回到桌面&#xff0c;鼠标右键-git bash here ,可以打开如下窗口 3、输入openssl回车&#xff0c;再输入…

服务器pfx文件如何导入,linux 导入pfx 证书

linux 导入pfx 证书 内容精选 换一换 单击“开始”,运行框输入“MMC”,回车。在MMC控制台菜单栏中单击“文件”,选择“添加/删除管理单元”。在“添加或删除管理单元”对话框,选择“可用管理单元”区域的“证书”。单击“添加”添加证书。在“证书管理”对话框,选择“计算…

.pfx 证书和 .cer 证书

证书系列&#xff1a; 1&#xff1a;.pfx 证书和 .cer 证书 2&#xff1a;导入pfx证书 通常情况下&#xff0c;作为文件形式存在的证书一般有三种格式&#xff1a; 第一种&#xff1a;带有私钥的证书&#xff0c;由Public Key Cryptography Standards #12&#xff0c;PKCS#1…

JavaDoc生成API详解

一、综述 1.1 简介 Javadoc 是 Java 自带的一种工具&#xff0c;其可以从程序源代码中抽取类、方法、成员等注释形成一个和源代码配套的API帮助文档。也就是说&#xff0c;只要在编写程序时以一套特定的标记【Tag】作注释&#xff0c;在程序编写完成后&#xff0c;通过Javadoc…

IDEA生成JavaDoc文档

1.第一步&#xff1a;首先创建一个新的文件夹。 2.第二步&#xff1a;选中所要生成的包。 3.第三步&#xff1a;点击顶部工具&#xff08;Tools&#xff09;菜单&#xff0c;并选择生成javadoc&#xff08;Generate JavaDoc&#xff09;这个选项。 4.第四部&#xff1a;①然后会…

两种方法生成javaDoc文档

如果生成javaDoc文档 一.使用命令行命令生成javaDoc文档 在文件位置打开cmd命令 回车打开 2.javadoc 参数 Java文件 -encoding UTF-8&#xff1a;编码为UTF-8 -charset UTF-8 &#xff1a;字符级编码为UTF-8 作用&#xff1a;避免出现乱码 3.生成Doc文档 4.查看生成文档 …

Javadoc生成的详细操作教程

文章目录 Javadoc文档一、什么是Javadoc文档二、Javadoc文档注释三、常用注释文档标记四、Javadoc选项说明4.1 选项说明4.2 标记的顺序4.3 可以多次使用标记 五、命令生成doc文档5.1 测试所在的目录结构5.2 命令生成Javadoc文档步骤方式一&#xff1a;单个或多个.java文件生成d…

Javadoc注释编写入门

Javadoc简介 Javadoc是Sun Microsystems为Java语言创建的文档生成器&#xff0c;在Javadoc推出之前&#xff0c;程序开发者往往需要为每一个程序单独创建并更新一个文档&#xff0c;这种做法耗时耗力且极不方便&#xff0c;Javadoc的主要优点就是在于能够根据源代码的注释&…

使用idea 生成Javadoc文档

使用idea 生成Javadoc文档 方法一&#xff1a;命令行窗口生成javaDoc 右键想要生成doc文档的类&#xff0c;点击Show in EXplorer 打开文件所在位置 ​ 在打开路径页面上选中路径&#xff0c;输入cmd回车 输入指令&#xff1a;–javadoc 参数 java文件 打开第一步的类的位…

javadoc命令使用

javadoc指令基本使用 Java 文档注释是用来生成 API 文档的。Java 文档注释以/**开始&#xff0c;并以*/结束&#xff0c;可以通过 Javadoc 生成 API 帮助文档&#xff0c;Java 帮助文档主要用来说明类、接口、方法、成员变量、构造器和内部类。 Javadoc &#xff08;Java API…

javadoc 使用

对于Java注释我们主要了解两种&#xff1a;  // 注释一行  /* ...... */ 注释若干行  但还有第三种&#xff0c;文档注释&#xff1a;  /** ...... */ 注释若干行&#xff0c;并写入 javadoc 文档  通常这种注释的多行写法如下&#xff1a;  /**  * .........  …

生成JavaDoc文档的两个方法

生成JavaDoc文档 JavaDoc是一种技术&#xff0c;它可以将我们的注释生成帮助文档 方法一&#xff1a;通过命令行 javadoc 来生成javaDoc文档 1.打开文件的地址&#xff1a; 2.打开目标文件夹&#xff0c;路径前加入cmd &#xff08;记得加空格&#xff09;然后回车键&#…