选择使用者绑定的解密方法

要配置客户机以便对客户机绑定进行响应解密,请指定客户机对 SOAP 消息进行解密时要使用的数据和变换算法方法。

准备工作

完成这些步骤前,请参阅 XML 加密信息以熟悉如何对 SOAP 消息进行加密和解密。

要完成解密配置以保护 SOAP 消息,必须完成下列任务:

  • 配置对 SOAP 消息部件的解密操作。
  • 指定解密方法。

可以使用 WSSDecryption 和 WSSDecryptPart API 配置解密方法。 也可以通过管理控制台配置解密方法来配置策略集。

有关此任务

某些与加密相关的定义基于 XML-Encryption 规范。 以下信息定义了一些与数据加密相关的术语:

数据加密方法算法
数据加密算法指定数据加密方法的算法统一资源标识 (URI)。 此算法以固定大小,多个八位字节块对数据进行加密和解密。

默认情况下,Java™ 加密扩展 (JCE) 附带受限或有限强度的密码。 要使用 192 位和 256 位高级加密标准 (AES) 加密算法,必须应用无限制的权限策略文件。

为了AES256-cbc和AES192-cbc算法,您必须从以下网站下载不受限制的 Java™ 加密扩展 (JCE) 策略文件: https://www.ibm.com/developerworks/java/jdk/security/index.html

密钥加密方法算法
密钥加密算法指定密钥加密方法的算法统一资源标识 (URI)。 此算法表示对加密和解密密钥指定的公用密钥加密算法。
缺省情况下,RSA_OAEP 算法使用 SHA1 消息摘要算法来在加密操作期间计算消息摘要。 (可选)可通过指定密钥加密算法属性来使用 SHA256 或 SHA512 消息摘要算法。 属性名为:com.ibm.wsspi.wssecurity.enc.rsaoaep.DigestMethod。 属性值是下列其中一个摘要方法 URI:
  • https://www.w3.org/2001/04/xmlenc#sha256
  • https://www.w3.org/2001/04/xmlenc#sha512

缺省情况下,RSA_OAEP 算法使用空字符串来作为 OAEPParams 的可选编码八位元字符串。 可通过指定密钥加密算法属性来提供显式的编码八位元字符串。 对于属性名,可以指定 com.ibm.wsspi.wssecurity.enc.rsaoaep.OAEPparams。 属性值是八位元字符串的基本 64 位编码值。

重要的:您只能在生成器端设置这些摘要方法和 OAEPParams 属性。 在使用者端,会从入局 SOAP 消息中读取这些属性。

为了KW_AES256和KW_AES192密钥加密算法,您必须从以下网站下载不受限制的 JCE 策略文件: https://www.ibm.com/developerworks/java/jdk/security/index.html

重要的:您的原籍国可能对加密软件的进口、持有、使用或再出口到其他国家有所限制。 下载或使用未限制的策略文件之前,必须检查您的国家或地区的法律、规章以及对加密软件进行进口、拥有、使用和再次出口的相关政策,从而确定是否可以使用该文件。

要完成解密配置,必须指定算法统一资源标识 (URI) 及其用法类型。 如果 URI 用于多个用法类型,那么必须定义指向每个用法类型的 URI。 WebSphere® Application Server支持以下解密使用类型:

表 1. 解密使用类型这些解密类型由WebSphere Application Server。
用法类型 描述
数据加密 指定用于对数据进行加密和解密的算法 URI。 以固定大小,多个八位字节块对数据进行加密和解密。
密钥加密 指定用于加密和解密加密密钥的算法 URI。

要配置解密功能和解密部件算法,请使用 WSSDecryption 和 WSSDecryptPart API,或者通过管理控制台来配置策略集。

笔记:策略集不支持对称密钥加密。 如果使用 WSS API 进行对称密钥加密,那么将无法与使用策略集的 Web Service 端点进行互操作。
如果使用的是 WSS API、WSSDecryption API 和 WSSDecryptPart API,请指定客户机对 SOAP 消息进行解密时要使用的算法方法。
  • 使用 WSSDecryption API 来配置数据加密算法和密钥加密算法方法。
  • 使用 WSSDecryptPart API 来配置变换算法方法。

WSS API 过程完成下列高级步骤,以指定在配置客户机进行响应解密时要使用的解密和解密部件算法方法:

过程

  1. 使用 WSSDecryption API 添加必需的数据加密算法。
    数据加密算法用于对 SOAP 消息的部件进行加密或解密。 数据解密算法指定数据加密方法的算法统一资源标识 (URI)。

    缺省数据加密算法是 AES 128。 数据加密名称为AES128以及数据加密算法的 URI,是https://www.w3.org/2001/04/xmlenc#aes128-cbc 。 WebSphere Application Server支持以下预配置的数据解密算法:

    • AES128: https://www.w3.org/2001/04/xmlenc#aes128-cbc

      AES 128 算法是缺省数据算法方法。

    • AES256: https://www.w3.org/2001/04/xmlenc#aes256-cbc

      要使用此 AES 256-cbc 算法,您必须从以下网站下载不受限制的 Java 加密扩展 (JCE) 策略文件: https://www.ibm.com/developerworks/java/jdk/security/index.html

    • AES192: https://www.w3.org/2001/04/xmlenc#aes192-cbc

      如果要让所配置的应用程序与基本安全概要文件 (BSP) 一致,请不要使用 192 位密钥加密算法。

      要使用此 AES 192-cbc 算法,您必须从以下网站下载不受限制的 Java 加密扩展 (JCE) 策略文件: https://www.ibm.com/developerworks/java/jdk/security/index.html

    • 三重数据加密标准 (TRIPLE_DES): https://www.w3.org/2001/04/xmlenc#tripledes-cbc
  2. 根据需要更改 WSSEncryption API 方法以指定其他数据加密算法。
    例如,可添加以下代码以便将缺省 AES 128 算法更改为三重 DES 算法:
    dec.addAllowedKeyEncryptionMethod(WSSDecryption.TRIPLE_DES); 
  3. 使用 WSSDecryption API 添加必需的密钥加密算法。
    密钥加密算法用于加密密钥,该密钥用于加密 SOAP 消息中的消息部件。 如果不需要使用密钥对数据进行加密,那么您必须指定 WSSDecryption.encryptKey(false)。

    您为使用者端选择的密钥加密算法必须匹配为生成者端选择的密钥加密方法。

    缺省密钥加密算法值是密钥合并 RSA_OAEP。 密钥加密名称为KW_RSA_OAEP,密钥加密算法的URI为https://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p 。 WebSphere Application Server支持以下预配置密钥加密算法:

    • KW_AES128: https://www.w3.org/2001/04/xmlenc#kw-aes128
    • KW_AES192: https://www.w3.org/2001/04/xmlenc#kw-aes192

      要使用此密钥包装 AES 192 算法,您必须从以下网站下载不受限制的 Java 加密扩展 (JCE) 策略文件: https://www.ibm.com/developerworks/java/jdk/security/index.html

      限制:如果您希望配置的应用程序符合基本安全配置文件 (BSP),请不要使用 192 位密钥加密算法。
    • KW_AES256: https://www.w3.org/2001/04/xmlenc#kw-aes256

      要使用此密钥包装 AES 256-cbc 算法,您必须从以下网站下载不受限制的 Java 加密扩展 (JCE) 策略文件: https://www.ibm.com/developerworks/java/jdk/security/index.html

    • KW_RSA_OAEP: https://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p。

      KW_RSA_OAEP 算法是缺省密钥算法方法。

      当通过软件开发包 (SDK) V1.4 运行时,受支持密钥传输算法列表不包括此算法。 通过 SDK V1.5 运行时,受支持密钥传输算法列表将包含此算法。 更多信息请见https://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p

    • KW_RSA_15: https://www.w3.org/2001/04/xmlenc#rsa-1_5
    • KW_TRIPLE_DES:(KW_TRIPLE_DES): https://www.w3.org/2001/04/xmlenc#kw-tripledes
    笔记:对于 Web 服务安全对话,WSSEncryption API 可能指定其他与密钥相关的信息,例如:
    • algorithmName
    • keyLength
  4. 根据需要使用 WSSDecryption API 方法更改为其他密钥加密算法。
    例如,可添加以下代码以便将缺省密钥加密算法 KW_RSA_OAEP 更改为 TRIPLE_DES 算法:
    dec.addAllowedKeyEncryptionMethod(WSSDecryption.KW_TRIPLE_DES);
  5. 根据需要使用 WSSDecryptPart API 添加变换算法。
    没有缺省变换算法。 然而, WebSphere Application Server提供预先配置的解密部分,WSSDecryptPart.TRANSFORM_ATTACHMENT_CIPHERTEXT ,可以添加。

结果

如果存在错误情况,那么将提供 WSSException。 如果成功,此 API 将调用 WSSConsumerContext.process() 方法,验证 WS-Security 头,然后使用 Web Service 安全来保护 SOAP 消息。

示例

以下示例提供了样本 WSS API 代码,这段代码对主体内容进行解密以及将数据加密和密钥加密算法更改为非缺省值:

// Get the message context
   Object msgcontext = getMessageContext();

// Generate the WSSFactory instance 
   WSSFactory factory = WSSFactory.getInstance();

// Generate the WSSConsumingContext instance 
   WSSConsumingContext gencont = factory.newWSSConsumingContext();

// Generate the callback handler
   X509ConsumeCallbackHandler callbackHandler = new 
      X509ConsumeCallbackHandler(
                                 "",
                                 "enc-sender.jceks",
                                 "jceks", 
                                 "storepass".toCharArray(), 
                                 "alice", 
                                 "keypass".toCharArray(), 
                                 "CN=Alice, O=IBM, C=US");

// Generate WSSDecryption instance 
   WSSDecryption dec = factory.newWSSDecryption(X509Token.class, 
                                                callbackHandler);

// Set the candidates for the data encryption method
// DEFAULT : WSSDecryption.AES128
   dec.addAllowedEncryptionMethod(WSSDecryption.AES128);
   dec.addAllowedEncryptionMethod(WSSDecryption.AES192);

// Set the candidates for the key encryption method
// DEFAULT : WSSDecryption.KW_RSA_OAEP
   dec.addAllowedKeyEncryptionMethod(WSSDecryption.KW_TRIPLE_DES);

// Add the WSSDecryption to WSSConsumingContext 
   concont.add(dec);

// Validate the WS-Security header
concont.process(msgcontext);