【问题标题】:JAX-WS CXF WSS4J Adding certificates at runtime for message signingJAX-WS CXF WSS4J 在运行时添加证书以进行消息签名
【发布时间】:2020-04-16 16:20:29
【问题描述】:

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

如果它是在传输级别,我将创建一个带有所需证书的密钥库,并从中创建一个 KeyManagerFactory。 - Trustfactory 将以相同的方式创建,但可以重复使用。

    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 在消息级别添加用于签名和验证的证书?

【问题讨论】:

    标签: certificate cxf jax-ws wss4j


    【解决方案1】:

    我忘了发布我的答案;迟到总比没有好。

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

            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)
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多