我们有一个在 Jboss EAP 5.1 中部署并使用 Spring 2.5 已经运行了一年多的 CXF webservice
我们现有的客户证书管理策略如下:
- 对于非 PROD,证书名为“NAME-NON-PROD.cer”。
- 对于 PROD,证书名为“NAME-PROD.cer”
从 (1) 中,我们将私钥提取到名称为 NAME.pfx 的文件中,并将其部署到非生产服务器。
从 (2) 中,我们将私钥提取到名称为 NAME.pfx 的文件中(与上面完全相同,密码与上面完全相同),但仅将其部署到生产服务器中。
或者证书名称遵循 NAME-ENVIRONMENT.cer 模式。 而提取出来的私钥只有NAME.pfx(没有环境后缀)。
要启用 MutualSSL,我们在 jboss-cxf.xml 中有这个:
<http:conduit name="*.http-conduit">
<http:tlsClientParameters
secureSocketProtocol="SSL">
<!-- START - setup private key for Mutual SSL -->
<sec:keyManagers keyPassword="MyPassword">
<sec:keyStore type="PKCS12" password="MyPassword" resource="Path/To/Private/Key/NAME.pfx" />
</sec:keyManagers>
<!-- END - setup private key for Mutual SSL -->
<sec:cipherSuitesFilter>
<sec:include>.*_EXPORT_.*</sec:include>
<sec:include>.*_EXPORT1024_.*</sec:include>
<sec:include>.*_WITH_DES_.*</sec:include>
<sec:include>.*_WITH_AES_.*</sec:include>
<sec:include>.*_WITH_NULL_.*</sec:include>
<sec:exclude>.*_DH_anon_.*</sec:exclude>
</sec:cipherSuitesFilter>
</http:tlsClientParameters>
</http:conduit>
上面的效果很好。
但是,证书(私钥)即将过期。最近有一个重组,所以另一个团队现在负责维护证书和密码。问题是他们拒绝将上面的非产品和产品中的 key 提取到一个名称完全相同的文件中。他们认为 pfx 文件应该命名为不同的名称,包括后缀(-PROD 或 -NON-PROD)并且配置应该外部化......也许从 JNDI 读取。
我在网上找不到一个例子,它读取一个 JNDI 来为 privateKey 名称实例化一个 spring bean 并为密码实例化另一个 spring bean ... 然后使用它在 tlsClientParameters 中实例化上面的 keyManagers。
例如,如果我从 JNDI 创建以下 spring bean;
<bean id="MyPvtKey"
class="org.springframework.jndi.JndiObjectFactoryBean"
p:jndiName="config/MyPvtKey"
/>
<bean id="MyPvtKeyPwd"
class="org.springframework.jndi.JndiObjectFactoryBean"
p:jndiName="config/MyPvtKeyPwd"
/>
我如何使用上面的方法在 tlsClientParameters 中设置 keystore 。
谁能给我指出资源或示例。
国家安全局
最佳答案
上述方法无效。 相反,我们选择使用属性文件并按如下方式使用 spring:
<context:property-placeholder location="classpath:${environment}-key.properties"/>
关于spring - cxf 相互 SSL 配置外部化 key 和密码以使用 JNDI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18449352/