【问题标题】:Webservice Security and Windows CertificatesWeb 服务安全性和 Windows 证书
【发布时间】:2010-11-23 07:59:23
【问题描述】:

我想使用 Apache CXF 和 WSS4J 签署网络服务请求。据我所知,我需要一个包含要用于签名的证书的 JKS 存储。 需要能够使用来自 Windows 证书存储的 X.509 证书。证书应在签署 Web 服务请求时从存储中读取。 我知道如何访问商店并获得证书。但是如何使用它来代替我自己的 JKS 存储中的证书进行签名呢?

【问题讨论】:

  • 证书不用于签名,密钥是。您可以访问私钥吗?在这种情况下,您实际上可以签署一些东西。

标签: java windows web-services cxf wss4j


【解决方案1】:

KeyStore 不必是 JKS 的。您可以编写自己的 JCA Provider 并实现 KeyStoreSpi,并让它访问 Windows 证书存储。

【讨论】:

  • 您觉得我的回答有用吗?
【解决方案2】:

查看this,它解释了如何使用 Windows 密钥库。然后您必须配置 CXF 以使用该密钥库。

【讨论】:

  • 我怎样才能告诉CXF使用那个商店?
  • 似乎没有什么好办法。这里有一个使用 Java-COM 桥的建议:objectmix.com/java/…。这个答案表明你会陷入 JNI 地狱:lists.owasp.org/pipermail/owasp-webscarab/2010-October/…
  • 但是,如果他们将证书存储在 Active Directory 中,则可以通过 LDAP 和 JNDI 访问它。这就是我推荐的。如果您想要一些示例代码,请告诉我,我会将其作为答案发布。
【解决方案3】:

刚刚发现使用MerlinDevice 类可以实现。 就是这样完成的:

1) 为WSS4JOutInterceptor配置属性:

Map<String,Object> outProps = new HashMap<String,Object>();
outProps.put(WSHandlerConstants.ACTION, "Signature");
outProps.put(WSHandlerConstants.USER, "Friendly_name_of_your_certificate");
outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, StupidCallback.class.getName());
outProps.put(WSHandlerConstants.SIG_PROP_FILE, "client_sign.properties");
WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps);

2) client_sign.properties 文件如下所示:

org.apache.ws.security.crypto.provider=org.apache.wss4j.common.crypto.MerlinDevice
keystore.provider=SunMSCAPI
cert.provider=SunMSCAPI
keystore.type=Windows-MY
truststore.type=Windows-ROOT

3) 而StupidCallback 只是返回常量字符串作为密码(它的值并不重要):

public class StupidCallback implements CallbackHandler
{
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException
    {
        WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
        pc.setPassword("password");
    }
}

就是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    相关资源
    最近更新 更多