certificate - JAX-WS CXF WSS4J 在运行时添加证书以进行消息签名
问题描述
我需要一个 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 在消息级别添加用于签名和验证的证书?
解决方案
我忘了发布我的答案;迟到总比不到好。
诀窍是覆盖 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)
推荐阅读
- ansible - 如何将值从ansible中的多个任务保存到列表变量中?
- java - Thorntail:带有限定符 @Any 的类型 LoggingFraction 的不满足依赖关系
- javascript - JavaScript insertBefore 函数无法正常工作
- ccm - 如何找出使用 ccm 创建的 cassandra 集群的配置
- angular - 如何在我的 .NET Core 服务器中生成 Angular 路由的 url
- python - 在 Python 中替换输出
- agents-jade - 如何将 WSIG GUI 链接到 jUDDI
- sql-server - 如何在 SQL 中创建临时表以用于多个 ADF 活动?
- selenium - 如何获取 WebElement 的文本,然后在 selenium 的不同字段中输入该文本?
- sql - SQL ORACLE ORA-00923: 在预期的地方找不到 FROM 关键字