内容


IBM 安全提供者:概述

利用 IBM 1.4.2 Java SDK 中的增强的安全服务

Comments

自出现开始,安全性一直是 Java™ 技术的一个主要设计目标和关键结构特性特征。Java 技术的安全功能具有以下两个基础:

  • Java Runtime Environment(Java 运行时环境,JRE),应用程序可以以某种安全方式在其上运行的现成(ready-made)平台。
  • 安全工具和安全服务 API,通过在正开发的安全系统中构建代码块,它们提供了一种安全基础设施。

一些 Java 安全组件负责提供安全服务。这些组件是基于一组设计原理开发的,即在实现方面具有独立性和互操作性,在算法上具有独立性和可扩展性,该设计原理最早是在 Java Cryptography Architecture(Java 加密体系结构,JCA)框架中引入的。它们完全遵循 JCA 框架体系结构,该体系结构是一种基于服务提供者的体系结构,它允许通过 Service Provider Interface(服务提供者接口,SPI)安插多种安全机制。但是这些组件有不同的用途和安全操作,每个组件都支持一组不同的算法和协议。

每个 Java Software Development Kit(Java 软件开发工具箱,SDK)在 Java 安全配置中都有一个预先注册的默认安全提供者列表,该配置位于 <java-home >/jre/lib/security/java.security 中。您只能通过 Java API 请求一项特殊安全服务。这为您屏蔽了安全操作底层实现的复杂性,同时允许 Java 安全组件支持数量不断增加的算法和安全机制。

IBM® 1.4.2 SDK 是可以从 IBM 获得的、为 Java 2 平台提供的最全面的安全产品。它不同于 Sun 1.4.2 JDK,因为 IBM 为所有 Java 安全组件都提供了实现的提供者。JRE 以前的版本(1.2.x 和 1.3.x)只有一个默认的 Sun 提供者。在 IBM 1.4 环境中,许多新的提供者替代了这个默认提供者。

IBM 的 Java 安全配置包括 4 个默认安全提供者和几个可选的提供者,您可以注册和配置它们,将它们用于您自己的应用程序。我们将更详细地介绍每一个提供者,并将重点讨论 IBM 提供者和 Sun 提供者之间的不同。

IBMJSSE 提供者

Java Secure Socket Extension(Java 安全套接扩展,JSSE)为封装 Secure Socket Layer(安全套接层,SSL)和 Transport Layer Security(传输层安全,TLS)协议提供了一个标准 Java API,其中包含用于数据加密、服务器身份验证、消息完整性和可选的客户机身份验证的功能。JSSE 用户可以编写标准 API,而不用担心底层 SSL/TLS 实现。JSSE 还支持用 SSL 协议封装的 HTTP(HTTPS),它允许访问诸如使用 HTTPS 的 Web 页面之类的数据。对于 Java 1.2 和 1.3,JSSE 是一个可选包,自 Version 1.4 起,它被集成到 JDK 中。在 IBM 1.4.2 SDK 中,JSSE 框架允许附加 JSSE 提供者,而 Sun JSSE 框架不允许。IBM SDK 是与两个附加 JSSE 提供者一起预先安装的,这两个安装者是 IBMJSSEProvider2 和 IBMJSSEFIPSProvider,我们稍后将在文章中讨论它们。IBMJSSE 是预先注册的提供者,而 IBMJSSEProvider2 和 IBMJSSEFIPSProvider 是可选的。

IBMJSSE 提供者支持以下标准算法和类型:

  • SSLContext: SSLv2、SSLv3、SSL、TLSv1、TLS 和 SSL_TLS
  • KeyManagerFactory: IbmX509
  • TrustManagerFactory: IbmX509
  • 加密算法:
    • SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, SSL_RSA_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_AES_256_CBC_SHA, SSL_RSA_WITH_DES_CBC_SHA, SSL_RSA_FIPS_WITH_DES_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_AES_128_CBC_SHA, SSL_DHE_RSA_WITH_AES_256_CBC_SHA, SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_DHE_DSS_WITH_AES_256_CBC_SHA, SSL_DHE_DSS_WITH_RC4_128_SHA, SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5, SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, SSL_RSA_WITH_NULL_MD5, SSL_RSA_WITH_NULL_SHA, SSL_DH_anon_WITH_AES_128_CBC_SHA, SSL_DH_anon_WITH_AES_256_CBC_SHA, SSL_DH_anon_WITH_RC4_128_MD5, SSL_DH_anon_WITH_DES_CBC_SHA, SSL_DH_anon_WITH_3DES_EDE_CBC_SHA, SSL_DH_anon_EXPORT_WITH_RC4_40_MD5 和 SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA

与 Sun 版本的不同之处

JSSE 文档包含 IBM JSSE 实现与 Sun JSSE 实现之间的不同之处的完整集合(请参阅参考资料)。主要不同具体如下:

  • IBM JSSE 提供者的默认 TrustManager 实现不允许使用匿名的加密算法。不过,通过编写允许使用匿名加密算法的 TrustManager 类,可以重写该默认实现。
  • IBM JSSE 实现验证了整个服务器或客户机证书链,其中包括信任的证书。例如,如果某一信任的证书已经到期,那么,即使到期的证书是受信任的,握手也将失败。Sun 的 JSSE 将验证证书链,直到遇到信任的证书。当它遇到信任的证书时,将停止验证,不再验证该信任证书以及之后的证书。所以,Sun JSSE 信任包含已过期的信任证书的证书链。
  • 为了信任对等证书链,IBM JSSE 实现要求您的信任库(truststore)中包含信任的证书。如果您的密钥库(keystore)中有密钥,那么 Sun 实现将认为它是一个信任的证书。
  • IBM JSSE 实现需要一个用于完全跟踪的调试 JAR。您可以利用 javax.net.debug=true 开启跟踪。
  • IBM JSSE 提供者不包括新的 TrustManager 支持,该支持实现了用于证书链路径验证的规则,Sun 将它添加到了 1.4.2 中。(新的 IBMJSSEProvider2 不包含该支持。)

IBMJCE 提供者

JCA 是在 JDK 1.1 中引入的,它包括用于数字签名和消息摘要的 API。在这之后的 JDK 版本中,Java Cryptography Extension(Java 加密扩展,JCE)扩展了 JCA,使之包含用于各种加密功能的 API,这些功能包括加密、密钥交换和 Message Authentication Code(消息身份验证代码,MAC)。JCE 以前是一个可选包(扩展),自 1.4 版本以后,它被集成到 Java 2 SDK 中。IBMJCE 是 JCA 和 JCA 框架的 IBM 提供者。它与 Sun 的 JCE 1.2.2 完全兼容。

与 Sun 版本的不同之处

IBMJCE 提供者替代了 Sun 的 sun.security.provider.Sun、com.sun.rsajca.Provider 和 com.sun.crypto.provider.SunJCE 提供者。IBM 支持在 Sun 实现中不可用的附加加密算法。下面列出了支持的算法:

  • 加密算法
    • AES
    • RSA 加密/解密
    • DES
    • Triple DES
    • Mars
    • RC2
    • RC4
    • Seal
    • 结合了 MD2 和 DES 的 PBE
    • 结合了 MD2 和 Triple DES 的 PBE
    • 结合了 MD2 和 RC2 的 PBE
    • 结合了 MD5 和 DES 的 PBE
    • 结合了 MD5 和 Triple DES 的 PBE
    • 结合了 MD5 和 RC2 的 PBE
    • 结合了 SHA1 和 DES 的 PBE
    • 结合了 SHA1 和 TripleDES 的 PBE
    • 结合了 SHA1 和 RC2 的 PBE
    • 结合了 SHA1 和 40 位 RC2 的 PBE
    • 结合了 SHA1 和 128 位 RC2 的 PBE
    • 结合了 SHA1 和 40 位 RC4 的 PBE
    • 结合了 SHA1 和 128 位 RC4 的 PBE
    • 结合了 SHA1 和 2-key Triple DES 的 PBE
    • 结合了 SHA1 和 3-key Triple DES 的 PBE
  • 签名算法
    • 结合了 RSA 的 SHA1、结合了 RSA 的 MD5 和结合了 RSA 签名的 MD2
    • 结合了 DSA 签名的 SHA1
  • 消息摘要算法
    • SHA1
    • SHA2
    • SHA3
    • SHA5
    • MD5
    • MD2
  • MAC
    • Hmac/SHA1
    • Hmac/MD5
  • 密钥一致算法
    • DiffieHellman
  • 随机数生成算法
    • IBMSecureRandom
    • IBM SHA1PRNG
  • 密钥库
    • JCEKS
    • JKS
    • PKCS12KS
    • JCERACFKS

IBMJGSS 提供者

自版本 1.4 以后,Java Generic Security Service(Java 通用安全服务,JGSS)API 就一直被包含在 JDK 中。它生成了一个定义身份验证和安全消息交换的通用机制,该通用机制不受任何网络协议或安全机制的限制。JGSS API 位于 org.ietf.jgss 包中,由 Internet Engineering Task Force(Internet 工程任务组,IETF)标准团体开发并标准化。JGSS API 中没有 SPI。倘若需要插入各种 General Security Service(通用安全服务,GSS)机制,如 SPNEGO 和 SPKM,IBM 在内部框架中有其自己的 JGSS SPI,但没有对最终用户公开。IBMJGSSProvider 是用于 JGSS 框架的 IBM 提供者。它使用 Kerberos 作为默认机制,来提供身份验证、消息机密性和消息完整性(请参阅参考资料)。

与 Sun 版本的不同之处

传递给 kinit、ktab 和 klist Java 工具的参数格式不同于 Sun 同等工具的格式。

IBMCertPath 提供者

Java Certification Path API 是在 JDK 1.4 中引入的,可以用它来创建、构建和验证认证路径(也称为证书链)。IBMCertPath 是 Certification Path API 的 IBM 提供者。它包含以下实现:

  • CertificateFactory:利用 PKCS7 和 PkiPath 编码生成 X.509 证书、Certificate Revocation Lists(证书恢复列表,CRL)和 CertPath 对象的一个证书工厂。
  • CertPathValidator:PKIX(RFC 3280)算法的证书路径检验器。
  • CertPathBuilder:PKIX 证书路径构造器。
  • CertStore:用来从 Collection 中检索证书和 CRL 的 Collection 类型的证书库,以及利用 PKIX LDAP V2 Schema(RFC 2587)从 LDAP 目录中检索证书和 CRL 的 Lightweight Directory Access Protocol(轻量级目录访问协议,LDAP)类型的证书库。

Sun 版本的不同之处

Sun 没有用于 Certification Path API 的单独提供者,它的实现是默认 Sun 提供者的一部分。

IBMJSSE2 提供者

IBM 1.4.2 Java SDK 包括一个称为 IBMJSSE2 的新的 JSSE 提供者,它没有向 Java 运行库预先注册。通过添加以下行,您可以静态地将它添加到 Java 安全文件中的提供者列表中:

java.security.provider.5=com.ibm.jsse2.IBMJSSE2

您还可以通过调用 java.security.Provider 方法中的一种,比如 java.security.Provider.addProvider(新的 com.ibm.jsse2.IBMJSSEProvider2()),以编程的方式注册它。

IBMJSSE2 提供者具有与 IBMJSSE 提供者相同的基础功能。新的提供者不支持原始 IBMJSSE 提供者的、以前不赞成的 com.ibm.net.ssl 类,现在,该类位于 javax.net.ssl 中。新的提供者在许多地方都有所提高。最引人注目的是,它可以利用硬件加密加速器的潜在性能提高,并使用硬件密码安全控制卡(cryptographic card)作为密钥库,以便在密钥和信任管理方面获得更高的灵活性。除了 IBMJSSE 提供者支持的基于 X.509 的简单 TrustManager 之外,它还提供了另一个 PKIX 兼容的 TrustManager,该 TrustManager 用 CertPath 服务来构建和验证证书链。与 IBMJSSE 提供者不同,IBMJSSE2 不包含内部加密功能。它利用来自 IBM JCE 提供者(比如 IBMJCE 和 IBMPKCS11Impl)的加密服务。因为 IBMJSSE2 没有任何内部加密功能,所以 JSSE 不再需要经过 Federal Information Processing Standards(联邦信息处理标准,FIPS)的认证。IBMJSSE2 只要求 JCE 通过 FIPS 的认证。在新的 JSSE2 提供者中,可服务性和跟踪都已获得显著提高。因为 SSL Version 2 被认为是一个不太安全的协议,现在,人们不喜欢使用它,该提供者不支持 SSLv2 协议。

与 Sun 版本的不同之处

JSSE 文档包含 IBM JSSE 实现与 Sun JSSE 实现之间的不同之处的完整集合(请参阅参考资料)。主要不同如下所示:

  • IBMJSSEProvider2 提供者的默认 TrustManager 实现不允许使用匿名的加密算法。不过,通过编写允许使用匿名加密算法的 TrustManager 类,可以重写该默认实现。
  • IBMJSSEProvider2 实现验证了整个服务器或客户机证书链,其中包括信任的证书。例如,如果某一信任的证书已经到期,那么,即使到期的证书是受信任的,握手也将失败。Sun 的 JSSE 将验证证书链,直到遇到信任的证书。当它到达一个信任的证书时,将停止验证,不再验证该信任证书以及之后的证书。所以,Sun JSSE 信任包含已过期的信任证书的证书链。

该文档还详细说明了 IBM 原始 JSSE 提供者与新的 JSSE 提供者之间的区别。

IBMPKCS11Impl 提供者

IBMPKCS11Impl 提供者是对 IBM 1.4.2 Java SDK 的更新。IBMPKCS11Impl 通过 Public Key Cryptographic Standards #11(PKCS #11)标准,使用 JCE 和 JCA 框架来添加使用硬件加密的功能。它没有向 Java 运行库预先注册。通过添加如下所示代码行,您可以静态地将它添加到 java.security 文件中的提供者列表中:

security.provider.5=com.ibm.crypto.pkcs11impl.provider.IBMPKCS11Impl

通过使用 java.security.Security 类的方法,比如 java.security.Security.addProvider("com.ibm.crypto.pkcs11impl.provider.IBMPKCS11Impl"),您可以以编程的方式注册它。

该提供者允许通过硬件设备访问以下可变加密函数和算法:

  • Cipher-DES, Triple DES, RSA
  • Signature- DSA, RSA
  • Message Digest- MD2, MD5, SHA1
  • KeyPairGenerator- DSA, RSA
  • KeyGenerator-DES, TripleDES
  • RandomNumberGenerator-PKCS11DeviceRNG, IBMSecureRandom
  • CertificateFactory-X509
  • KeyStore-PKCS11IMPLKS

该提供者支持以下设备:

  • IBM 4758 PCI Cryptographic Coprocessor
  • IBM e-business Cryptographic Accelerator
  • nCipher nFast
  • IBM Security Kit SmartCard
  • Gem Plus Smart Cards
  • Rainbow Cryptoswift
  • Rainbow ikey 2000
  • nCipher nForce
  • Chrysalis Luna HSM
  • Eracom Orange

这个支持算法列表中包含该提供者允许应用程序使用的最大可能数量的函数。这些函数的实际函数列表可能要小一些,这取决于您使用的硬件设备。而硬件设备可能还需要与每个密钥相关联的某些属性,具体情况取决于具体设备。请阅读有关您的硬件设备的文档,以了解其限制、要求和它提供的算法。请参阅 IBMPKCS11Impl 文档中的“Card Observations”,以获得与一些硬件设备以及如何与它们的提供者一起使用有关的更多信息(请参阅参考资料)。

与 Sun 版本的不同之处

JDK Version 1.4.2 的 Sun 版本没有提供硬件加密支持。

FIPS 加密模块

IBM 1.4.2 Java SDK 包含两个用于 JCE 和 JSSE 的 FIPS 140-2 兼容模块,它们分别叫做 IBMJCEFIPS 和 IBMJSSEFIPS。IBMJCEFIPS 模块是作为 JCE 提供者实现的,它通过 JCE 框架 API 支持 FIPS 批准的加密操作。而 IBMJSSEFIPS 模块是作为 JSSE 提供者实现的,它通过 JSSE 框架 API 支持 FIPS 批准的 TLS 加密算法。在经过适当配置的情况下,使用这两种提供者的应用程序可以满足 RIPS 140-2 的要求。这两个提供者没有向 Java 运行库预先注册。通过添加如下所示代码行,您可以静态地将它们添加到 java.security 文件中的提供者列表中:

security.provider.5=com.ibm.crypto.fips.provider.IBMJCEFIPS
security.provider.6=com.ibm.crypto.fips.provider.IBMJSSEFIPSProvider

通过使用 java.security.Security 类的方法,比如 java.security.Security.addProvider("com.ibm.crypto.fips.provider.IBMJCEFIPS"),您还可以以编程的方式注册它们。

与 Sun 版本的不同之处

JDK Version 1.4.2 的 Sun 版本没有 FIPS 准许的加密模块。

JAAS LoginModule

Java Authentication and Authorization Service(Java 身份验证和授权服务,JAAS)是用来为运行时资源提供身份验证和授权的一种框架。JAAS 客户机应用程序被编写到 LoginContext API,而身份验证服务提供了 LoginModule 接口的实现。LoginContext 负责读取配置文件和安装正确的 LoginModule。JAAS 的 IBM 版本在 com.ibm.security.auth.module 包中提供了特定于平台的登录模块,导入用户的特定于平台的特殊 Principal 信息和与 Subject 相关的信息。IBM JAAS 支持 Windows NT 4.0、Windows 2000、Windows XP 和 Windows Server 2003。IBM JAAS 还支持 z/OS、各种 Linux 变体(Intel 体系结构上的 Linux、iSeries 上的 Linux、pSeries 上的 Linux 和 zSeries 上的 Linux)和 AIX,提供了用于这些平台的不同登录模块:

  • z/OS: OS390LoginModule
  • 32-bit Windows: NTLoginModuleNTLoginModule2000NTActiveLoginModuleNTActiveLoginModule2000
  • 64-bit Windows : Win64LoginModuleWin64ActiveLoginModule
  • Linux: LinuxLoginModule
  • 32-bit AIX: AIXLoginModuleAIXLoginModule2000
  • 64-bit AIX: AIX64LoginModule

用于 Windows 和 z/OS 的 JAAS 的 IBM 版本中包含一个 Sun 所没有的、叫做活动登录的附加功能。因为 Windows 和 z/OS 都有一个覆盖范围广的安全基础设施,所以,允许 Java 程序作为特殊用户登录,并利用底层操作系统,了解特殊线程上的安全身份,这些在服务器上很重要。没有这项扩展的支持,JAAS 将允许 Java 程序知道用户是谁,并将他严格限定在 Java 级别上。有了这项扩展的支持,Java 程序就可以作为不同的用户登录,甚至可以适当地使非 Java 程序(如 Windows 核心)的安全性得到加强。以下类包含该附加支持:

  • Windows 上的 com.ibm.security.auth.NTThreadSubject 或者 z/OS 上的 com.ibm.security.auth.OS390ThreadSubject。这个类是在操作系统线程级别上更改身份的一种途径。
  • Windows 上的 com.ibm.security.auth.module.NTActiveLoginModule 或 z/OS 上的 com.ibm.security.auth.module.OS390LoginModule。这个类是在登录配置文件中指定的。如果您使用一个字符串名称构造 LoginContext,调用 LoginModule,并提供一个可以提供适用于 Windows 计算机的 userid 和口令的 CallbackHandler,那么您可以登录。OS390LoginModule for z/OS 提供了一个默认登录模块,该模块利用 z/OS Security Services, SAF(RACF)提供基本身份验证。

与 Sun 版本的不同之处

IBM 的 JAAS 包含活动登录功能,并提供了特定于平台的登录模块。

结束语

在构建任务关键型软件应用程序时,特别是在构建那些基于互联网技术的应用程序时,安全性是一个较大的技术挑战。就我们所展示的,IBM 1.4.2 Java SDK 利用只在 IBM 提供者中可用的独特功能,通过一些关键的 Java 安全组件,提供了大量安全基础设施实现。它们为您提供了一个开发和部署安全敏感的、端到端企业应用程序的坚实基础。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Java technology
ArticleID=49061
ArticleTitle=IBM 安全提供者:概述
publish-date=10122004