kmip4j_KMIP4J入门

kmip4j

“加密提供安全性!” 该声明可能是现代IT安全世界中最大的基本误解之一。 那些具有密码学基础知识的人知道,除了加密之外,通信伙伴的消息完整性和真实性对于安全通信也至关重要。 但是,即使将这些概念组合在一起,如果不小心处理用于加密的密钥,它们也将毫无价值。 从数据保护到密钥管理,即创建,存储,更新和分发密钥的任务。

KMIP解决的问题

一些最大和最知名的IT公司已经成立了OASIS工作组,以创建一个新协议,即密钥管理互操作性协议(KMIP)。 协议可以看作是一种语言,它定义了事件的顺序,消息的内容及其编码。 KMIP符合当今密钥管理系统与其客户之间通信的要求。 有关KMIP的更多信息,请参阅参考资料中到OASIS KMIP官方页面的链接 。

如今,大型公司通常拥有各种关键生命周期管理系统(KLMS),每个系统都有其自己的通信协议(请参见图1左侧)。 KMIP采用了不同的方法,并将所有对象和操作合并到一个协议中,从而可以实现集中式KLMS(参见图1,右侧)。 使用一个协议集中KLMS可以降低运营和基础架构成本,并提供一致的安全策略实施。 此外,所有加密对象在同一应用程序中被平等地管理。

图1.带有和不带有KMIP的KLMS
kmip4j_KMIP4J入门_第1张图片

一些公司一直在使用不同的编程语言来处理KMIP的专有实现,但是到目前为止,还没有开源解决方案。 因此,我们决定编写并发布KMIP的开源实现,这将使该协议在不久的将来得到推广。

实施工作原理

我们系统的结构基于客户端-服务器架构(请参见图2)。 水平虚线显示KMIP库与周围测试环境之间的边界。 已实现的测试环境由客户端上的GUI和简化的KLMS以及服务器端上的固有适配器组成。 该适配器使KMIP可以适应任何现有或新的KLMS。

图2.架构
kmip4j_KMIP4J入门_第2张图片

客户端GUI(参见图3)使您可以单独或按顺序选择和运行指定用例的请求。 使用XML文件,您可以创建任何其他请求,例如对128位长的对称密钥的Create请求,该对称密钥将用于AES加密。 该信息将作为KMIP容器转发到存根,并填充指定的KMIP对象,属性和选项。

图3. KMIP4J客户端GUI
kmip4j_KMIP4J入门_第3张图片

编码器的任务是处理容器的信息,并根据KMIP规范生成Tag-Type-Length-Value编码的表示形式(参见图4)。 解码器是编码器的对应物; 它将TTLV编码的响应转换为容器。

图4.容器到标记类型长度值(TTLV)
kmip4j_KMIP4J入门_第4张图片

几个关键类实现一个接口,并且可以通过更改配置文件(StubConfig.xml或web.xml)中的类路径来用其他类替换。 在下次启动时,将动态加载所请求的类。 这种方法产生了易于配置的非常灵活的软件。 通信层是这种可交换类的一个示例。 默认情况下,在客户端和服务器之间建立SSL / TLS连接。 对于测试用例,可以通过更改通信层来使用更简单的HTTP连接。

在服务器端,与Servlet配对的Web应用程序服务器负责通信和消息转发。 解码消息后,适配器的任务是将KMIP转换为KLMS可以理解的格式。 每个要在现有KLMS中使用KMIP库的用户都必须实现此功能。 实施的测试环境的KLMS具有四层体系结构,包括接口层,服务层,管理器层和数据层。 但是,仅支持KMIP 1.0中指定的用例的操作。

KMIP4J开源实现

KMIP4J是针对KMIP 1.0规范实现的。 KMIP 1.1版是OASIS在实施过程中发布的,尚未集成到正在进行的工作中。 由于软件的灵活性和易扩展性,因此可以通过可管理的工作来实现1.1版。

从OASIS的正式KMIP页面(请参阅相关的主题 )的礼物超过了协议的规范。 发现的另一个重要文档是“ KMIP V1.0用例”。 这些用例包括典型的KMIP通信的请求-响应方案。 该文档包括每个消息的参数和生成的TTLV编码。 所有用例均已在测试环境中成功测试。 此外,针对两个主要KMIP实施提供商(其中一个为Cryptsoft)的互操作性测试已证明与既定实施具有兼容性。

以下部分说明了如何使用KMIP4J实现简单的KMIP客户端。

实施KMIP客户端

此示例显示了一个非常简单的KMIP客户端。 它使用KMIP4J库为其KLMS创建请求。 SimpleKMIPClient的主要功能是配置一个Logger,创建一个KMIPStub并调用createKMIPRequest (请参见清单1)。 此函数为“创建密钥”操作创建KMIP对象和属性,并将它们放入KMIP容器中。 通过此请求,要求KLMS创建一个128位的对称密钥,以用于通过AES算法进行加密和解密(使用掩码为0x0C)。 函数调用stub.processRequest(request)导致一个包含KMIP对象和服务器响应属性的容器。

清单1.简单的KMIP客户端
import java.util.ArrayList;
        import org.apache.log4j.Logger;
        import org.apache.log4j.xml.DOMConfigurator;
        import ch.ntb.inf.kmip.attributes.*;
        import ch.ntb.inf.kmip.container.*;
        import ch.ntb.inf.kmip.kmipenum.*;
        import ch.ntb.inf.kmip.objects.base.*;
        import ch.ntb.inf.kmip.stub.KMIPStub;
        
        public class SimpleKMIPClient {
        
            // initialize Logger
            private static final Logger logger = Logger.getLogger(SimpleKMIPClient.class);
        
            public static void main(String[] args) {
                // configure Logger
                DOMConfigurator.configureAndWatch( "config/log4j-1.2.17.xml", 60*1000 );
        
                KMIPStub stub = new KMIPStub();
                KMIPContainer request = createKMIPRequest();
                KMIPContainer response = stub.processRequest(request);
                System.out.println(response.toString());
            }
        
            private static KMIPContainer createKMIPRequest() {
                // Create Container with one Batch
                KMIPContainer container = new KMIPContainer();
                KMIPBatch batch = new KMIPBatch();
                container.addBatch(batch);
                container.calculateBatchCount();
        
                // Set Operation and Attribute
                batch.setOperation(EnumOperation.Create);
                batch.addAttribute(new ObjectType(EnumObjectType.SymmetricKey));
        
                // Set TemplateAttribute with Attributes 
                ArrayList templateAttributes = new ArrayList();
                templateAttributes.add(new 
CryptographicAlgorithm(EnumCryptographicAlgorithm.AES));
                templateAttributes.add(new CryptographicLength(128));
                templateAttributes.add(new CryptographicUsageMask(0x0C));
                TemplateAttributeStructure tas = new TemplateAttribute();
                tas.setAttributes(templateAttributes);
                batch.addTemplateAttributeStructure(tas);
            
                return container;
            }
        }

当针对我们自己的服务器运行时, SimpleKMIPClient会产生以下输出(参见图5)。

图5.输出
kmip4j_KMIP4J入门_第5张图片

要配置项目,需要将kmip4j.jar库添加到构建路径。 此外,配置文件StubConfig.xml和log4j的-1.2.17.xml必须附加,如图6所示。Eclipse项目与所有必要的文件中可以找到相关信息 。

图6.项目结构
kmip4j_KMIP4J入门_第6张图片

此外,如果要与HTTPS通信,则需要带有证书的Java密钥库。 密钥库的路径必须在StubConfig.xml文件中定义。

本示例说明了客户端如何使用我们的开源KMIP4J实现创建对KLMS的基本KMIP请求。 对于大多数客户来说,这将是一个很好的起点。

结论

密钥管理互操作性协议定义了密钥生命周期管理系统与其客户端之间的通信。 与具有许多不兼容协议的旧系统相比,集中式KLMS与KMIP配对可降低运营和基础架构成本,并提供一致的安全策略实施。 使用KMIP是朝着更好地组织和更一致地管理密码对象的重要一步。

通过市场上的开源解决方案,财务资源有限的供应商也可以加入“ KMIP俱乐部”。


翻译自: https://www.ibm.com/developerworks/security/library/se-kmip4j/index.html

kmip4j

你可能感兴趣的:(kmip4j_KMIP4J入门)