首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAX- WSS4J WSS4J在运行时为消息签名添加证书

JAX- WSS4J WSS4J在运行时为消息签名添加证书
EN

Stack Overflow用户
提问于 2020-04-17 00:20:30
回答 1查看 29关注 0票数 0

我需要一个JAX-WS客户机(用wsdl2java生成)来对其消息进行签名,并验证响应消息的签名。它不应该在传输层,而应该在消息层。证书在编译时是未知的(每个用户都有自己的证书并被上传)。

如果是在传输级别,我将使用所需的证书创建一个keystore,并从中创建一个KeyManagerFactory。- Trustfactory将以相同的方式创建,但会被重用。

代码语言:javascript
复制
    val certFactory = CertificateFactory.getInstance("X.509")

    val certStream = getResource("file").openStream().buffered()
    val cert = certFactory.generateCertificate(certStream)

    val clientKeystore = KeyStore.getInstance(KeyStore.getDefaultType())
    clientKeystore.load(null, null)
    clientKeystore.setCertificateEntry("certificate", cert)

    val kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm())
    kmf.init(clientKeystore, "".toCharArray())

    val caCertStream = getResource("file").openStream().buffered()
    val caCert = certFactory.generateCertificate(caCertStream)

    val caKeyStore = KeyStore.getInstance(KeyStore.getDefaultType())
    caKeyStore.load(null, null)
    caKeyStore.setCertificateEntry("ca-certificate", caCert)

    val context = SSLContext.getInstance("TLSv1.2")
    context.init(keyManagerFactory.keyManagers, trustManagerFactory.trustManagers, null)
    requestContext.put(JAXWSProperties.SSL_SOCKET_FACTORY, context.socketFactory)

但是,由于它需要在消息级别,所以我似乎需要使用WSS4J,而且据我所知,它只适用于引用密钥库文件的属性文件。

如何使用WSS4J在消息级别添加用于签名和验证的证书?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-26 22:15:15

我忘了发我的答案,迟到总比不到好。

诀窍是覆盖WSS4JOutInterceptor和WSS4JInInterceptor中的loadCryptoFromPropertiesFile方法。而不是从文件加载它,您只需从您实时创建的任何内容加载它即可。

代码语言:javascript
复制
        val cryptoProvider = Merlin()
        cryptoProvider.setTrustStore(trustKeyStore)
        cryptoProvider.setKeyStore(keystore)

        val fetchClient = ClientProxy.getClient(fetchPort)
        val fetchEndpoint = fetchClient.endpoint

        val wssOut: WSS4JOutInterceptor = object : WSS4JOutInterceptor(outProps) {
            override fun loadCryptoFromPropertiesFile(propFilename: String, reqData: RequestData): Crypto {
                return cryptoProvider
            }
        }
        fetchEndpoint.outInterceptors.add(wssOut)

        val wssIn: WSS4JInInterceptor = object : WSS4JInInterceptor(inProps) {
            override fun loadCryptoFromPropertiesFile(propFilename: String, reqData: RequestData): Crypto {
                return cryptoProvider
            }
        }
        fetchEndpoint.inInterceptors.add(wssIn)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61255061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档