开始使用KMIP4J
密钥管理互操作协议(KMIP)的开源实现
KMIP定义了密钥生命周期管理系统(KLMS)和其客户之间的沟通。一些公司已经使用专有的KMIP实现,这些KMIP实现使用不同的编程语言,但是到现在为止,没有开源的解决方案存在。因此,KMIP4J,这是一个使用Java代码开发的开源KMIP实现,现已在www.sourceforge.net。此文章给出了开源实现的概述。
“加密提供了安全!”这句话可能是最大的一个根本性的误解在现代的IT安全领域。有密码学基本知识的人都知道,对安全通信来说,除了加密、消息完整性和通信伙伴的身份认证是至关重要的。但即使这些概念结合,如果用于加密的密钥不小心处理,它们也是一文不值。安全关系到从数据保护到密钥管理(密钥的创建、存储、更新和分发任务)的整个过程。
KMIP解决的问题
一些最大的和最著名的IT公司组成了一个OASIS工作组,负责创建一个新的协议,KMIP。一种协议可以被视为一种语言,它定义了事件的顺序,消息的内容,和它的编码。KMIP符合一个密钥管理系统和客户之间的沟通要求。
今天,大公司通常有各种密钥生命周期管理系统(KLMS),每个都有自己的通信协议(见图1,左侧)。KMIP采用不同的方法和合并所有的对象和操作方法到一个单独的协议中,使一个集中KLMS成为可能(见图1,右侧)。使用一个协议的集中KLMS减少了操作和基础设施的成本,并且提供了一个一致的安全策略的实施。此外,在同一个应用程序中,所有的加密对象被同等地管理。
一些公司已经使用专有实现的KMIP,用不同的编程语言,但是直到现在,不存在开放源代码解决方案。因此,我们决定写和发布KMIP的一个开源实现,这将允许协议扩展在不久的将来。
实现如何工作
我们的系统的结构是基于客户机-服务器体系结构(见图2)。水平虚线显示了KMIP库和测试环境的边界。实现的测试环境由一个客户端和服务器端组成。客户端提供一个GUI程序,服务器端是一个简化KLMS和一个固有适配器。适配器允许将KMIP适应任何现有的或新的KLMS。
客户端GUI(client GUI)(参见图3)允许你选择并运行指定用例的请求。使用一个XML文件,您可以创建任何其他要求,比如创建请求一个128位长的对称密钥用于AES加密。此信息被转发到stub,封装成一个KMIP容器,该容器使用KMIP指定对象,属性和操作填充。
编码器(encoder)的任务是处理容器(container)中的信息和生成Tag-Type-Length-Value(TTLV)编码信息,根据KMIP规范(见图4)。解码器是编码器的配对,它将TTLV编码响应转换成容器。
几个关键类实现一个接口,可以换成其他类通过改变配置文件(StubConfig.xml或web.xml)。 在下次启动,请求的类被动态加载。这种方法使软件非常的灵活,很容易配置。通信层就是一个可替换类的一个例子,可以通过修改配置,将通信层改为其他的通信方式。默认情况下,客户端和服务器之间建立一个SSL/TLS连接。测试用例中,通过改变配置文件中的通信层配置,客户端和服务器之间也可以建立一个http连接。
在服务器端,一个web应用服务器配上一个servlet,负责通信和消息的转发。解码消息后,适配器的任务是翻译KMIP成为KLMS可以理解的格式。想使用KMIP库与现有KLMS系统的用户必须实现这个功能。所实现的测试环境的KLMS有4层架构,一个接口层、服务层、管理器层和数据层。然而,目前该系统只支持KMIP1.0用例中指定的操作。
该KMIP4J开源实现
KMIP4J是KMIP 1.0规范的实施。在该过程中,OASIS发布了KMIP1.1版本,KMIP1.1没有集成到工作进展中。由于软件的灵活性和可扩展性,1.1版本可以实现。
OASIS官方KMIP页面(参见参考资料)提供更多协议的规范。另一重要文件“KMIP V1.0的用例”。这些用例包括典型的KMIP通信请求-响应场景。文档包括每个消息的参数和TTLV编码结果。所有用例已经成功地测试在测试环境。
下面的部分解释了如何使用KMIP4J实现一个简单的KMIP客户端。
实现KMIP客户端
这个例子显示了一个非常简单的KMIP客户端。它使用KMIP4J库来创建一个请求到KLMS。这个SimpleKMIPClient 的主要功能是配置一个记录器,创建一个KMIPStub,调用createKMIPRequest(参见清单1)。这个函数创建KMIP对象和属性,为一个“create key”操作,并将它们放置到一个KMIPcontainer容器中。 这个请求,KLMS被要求创建一个128位的对称密钥用于AES算法加密和解密。函数调用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<Attribute> templateAttributes = new ArrayList<Attribute>();
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)。
为了配置这个项目。 kmip4j.jar库需要添加到构建路径。此外,StubConfig.xml配置文件和log4j-1.2.17.xml必须添加,如图6所示。一个Eclipse项目和所有必要的文件可以在参考资料中找到。
此外,如果你想使用HTTPS通信,您需要一个带有证书的Java密钥库文件。密钥库文件的路径必须在StubConfig.xml文件中指定。
这个例子展示了客户端如何创建一个基本的KMIP请求到KLMS,使用我们的开源KMIP4J实现。这将是一个好的起点对于大多数客户。
结论
KMIP定义了密钥生命周期管理系统和客户之间的沟通。与旧系统相比有很多不兼容的协议,一个集中的KLMS搭配KMIP减少操作和基础设施成本并且提供一致的安全策略的实施。使用KMIP是非常重要的一步对于更好的组织和加密对象更一致的管理。
源码下载:http://sourceforge.net/p/kmip4j/wiki/Home/