技术开发 频道

XML 密钥管理规范(XKMS)

    XKRSS服务规范定义了四种操作:

    ·注册(Register):通过密钥绑定将信息与一个密钥对绑定。在注册期间,要么是客户机提供公钥以及其他证明其拥有相应私钥的某些证据,要么是服务提供程序为客户机生成密钥对。服务提供程序在注册公钥(还可能同时包括私钥)之前,可以向客户机请求更多的信息。 

    ·重新发行(Reissue):重新绑定之前已经注册的密钥。可以使用该操作生成底层PKI中的新凭证。虽然XKMS使用的密钥绑定信息没有寿命,但是底层PKI颁发的凭证偶尔也会有这么一段时间,过了这段时间之后就要周期性地更新。 

    ·撤销(Revoke):该操作允许客户机销毁一个密钥所绑定到的数据对象。例如,当调用这个操作时,绑定到一个XKMS密钥的X.509凭证将被销毁。 

    ·恢复(Recover):该操作允许客户机恢复私钥。要使该操作有意义,私钥必须已经注册到了服务提供程序。要想服务提供程序拥有私钥,那么就应该在服务器上而不是在客户机上生成密钥对。

    恢复操作在密钥对的私钥被用来加密数据的情况下添加很多值。如果丢失了私钥,则加密的数据也会丢失。当出现这种情况时,让私钥在服务器上生成并让服务提供程序保留该私钥是明智的。这样就可恢复私钥。

    如果丢失的私钥只是用于数字签名文档,那么就可以生成一个新的密钥,而不会影响对已经签名的文档的有效性。因此,由客户机来生成那种用途的密钥是很安全的,而且完全可以不将私钥注册到XKMS服务。

    实现了XKRSS服务规范的XKMS服务可以选择提供一些、所有或者不提供这些操作。XKRSS服务规范并不强制要求XKMS服务实现上述任何一种操作。

    密钥对的批量注册(X-Bulk)

    X-Bulk处理在一条请求消息内同时注册多个密钥对,这与XKRSS不同,后者只处理一次注册一个密钥对的情况。X-Bulk规范定义了一个批量元素,这种元素可以有多个注册请求或者多个服务器响应,所有这些请求或响应都遵从XKMS消息格式。与XKRSS一样,X-Bulk服务支持所有四种操作 —— 注册(Register)、重新发行(Reissue)、撤销(Revoke)和恢复(Recover)。X-Bulk可以处理客户机和服务器生成的密钥对的批量注册。

    XML密钥信息服务规范(XKISS)

    XKMS的这一部分为允许客户机应用程序认证经过加密/签名的数据提供机制。

    客户机通过将相应的密钥信息传递给服务提供程序来认证经过加密或签名的数据。而服务提供程序则以"true"或"false"响应。"true"表明,用于签名的私钥所对应的公钥的确属于那个宣称对该文档进行了签名的实体。

    XKISS服务规范定义了下面两种操作:

    ·定位(Locate):定位操作解析可能与XML加密或XM 签名有关的<ds:KeyInfo>元素,但是没有证明<ds:KeyInfo>元素中数据绑定的有效性。 

    ·确认(Validate):定位操作能做的一切该操作都能做,而且还可以做更多的事情。定位服务根据<ds:KeyInfo>元素发现一个密钥,但是不保证密钥绑定信息是否值得信任。而确认操作不仅可以搜索<ds:KeyInfo>元素所对应的公钥,而且还保证它返回的密钥绑定信息是值得信任的。

    XKMS过程

    在这一节中,我将带您一步一步地经历注册和检索密钥的过程。

    基于XKRSS的注册过程允许注册客户机生成的密钥,也允许注册服务器生成的密钥。在注册客户机生成的密钥时,客户机首先生成密钥,然后通过发送公钥和提供私钥作为所有权的证据来请求XKMS服务注册密钥对的公钥。在注册服务器生成的密钥时,XKMS服务同时生成私钥和公钥,然后将私钥发送给客户机。

    清单1演示了如何注册客户机生成的密钥。为了使用该清单中的代码,必须与某个具有演示或测试XKMS服务运行的XKMS服务提供程序联系。从该服务提供程序获取您在将密钥注册到它们的演示或测试XKMS服务时所需的信息。我使用Verisign作为XKMS提供程序,并且使用共享密钥(shared secret)和密钥名,它们是提供给我用于注册密钥的。

    清单1. XKMS密钥注册

    String sharedSecret = "passcode";
    String passPhrase = "passPhrase";
    KeyPair rsakey = getKeyPair();
    String keyName = 
    "http://xkms.verisign.com/keyname?jurisdiction=d7ea68c518b2602ca4bbca895826a7dd&"+ 
    "mail_email=mverma2@xkms.org&corp_company=Nano";
    XKMSKeyData data = new XKMSKeyData(rsakey, new XKMSKeyName(keyName));
    XKMSAuthInfo authInfo = new XKMSAuthInfo(passPhrase, sharedSecret);
    XKMSRegister register = new XKMSRegister(data, authInfo);
    XKMSRegisterResponse resp = null;
    String serviceurl = "http://interop-xkms.verisign.com/xkms/Acceptor.nano";
    URL url = new URL(serviceurl);
    XmlTransportSOAP transport = new XmlTransportSOAP(url);
    resp = register.send(transport);
    System.out.println("Response status is " + resp.getStatus());
    if (resp.getStatus()) {
    System.out.println("The key name is " + resp.getKeyName());
    System.out.println("The public key is " + resp.getPublicKey());
    }
 
    步骤1:从要注册密钥对的服务提供程序那里获得密码(共享密钥)。服务提供程序还可以提供与密码一起使用的密钥名。

    步骤2: 使用getKeyPair()在客户机上生成密钥对。getKeyPair()的代码是您可以利用本文下载的源代码的一部分。

    步骤3: 指定XKMS密钥注册所需的密钥数据。创建XKMSKeyData对象。提供密钥对和密钥名作为输入。在密钥对中,公钥是已注册的,私钥用于作为所有权的证明。XKMSKeyData中使用的密钥名必须遵从由提供程序指定的特定格式。

    步骤4:指定XKMS密钥注册所需的注册授权数据。有两种方式可以用来提供授权信息:

    ·共享密钥:注册请求伴随着共享密钥,共享密钥由带外(out-of-band)客户机的注册中心给出。 

    ·注册中心(registration authority,RA)认证:使用RA的X.509证书和RA的私钥。在清单1中,我演示了共享密钥认证机制的使用。

    步骤5: 通过提供XKMS密钥数据和授权信息,创建XKMSRegister对象的一个实例。

    步骤6: 创建一个XmlTransportSOAP对象。提供运行注册服务时所在的URL作为输入。

    步骤7: 使用send方法发送请求给XKMSRegister对象,将XmlTransportSoap实例传递给这个方法。

    send方法首先注册密钥,然后返回一个XKMSRegisterResponse对象。可以通过查询这个对象来获得密钥名和其他密钥信息。通过查询XKMSRegisterResponse对象而得到的密钥名不同于您在步骤3中创建XKMSKeyData对象时提供的密钥名。以后您将使用这个密钥名来定位密钥。

0
相关文章