- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将我们当前的应用程序升级到 CXF 3 和 WSS4J 2。这让我很头疼。
客户端当前应用代码:
private void secureWebService( Client client, final Credentials credentials ) {
// set some WS-Security information
Map<String,Object> outProps = new HashMap<String,Object>();
outProps.put( WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN );
outProps.put( WSHandlerConstants.USER, credentials.getUsername() );
outProps.put( WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT );
// Callback used to retrieve password for given user.
outProps.put( WSHandlerConstants.PW_CALLBACK_REF, new CallbackHandler() {
@Override
public void handle( Callback[] callbacks ) throws IOException, UnsupportedCallbackException {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
pc.setPassword( credentials.getPassword() );
}
});
WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor( outProps );
client.getOutInterceptors().clear();
client.getOutInterceptors().add( wssOut );
}
在服务器端...
public class ServerPasswordCallback implements CallbackHandler {
public void handle( Callback[] callbacks ) throws IOException, UnsupportedCallbackException {
WSPasswordCallback pc = (WSPasswordCallback)callbacks[0];
boolean result = false;
try {
LoginContext lc = new LoginContext( container, new CallbackHandler() {
public void handle( Callback[] callbacks ) throws IOException, UnsupportedCallbackException {
NameCallback nc = (NameCallback)callbacks[0];
nc.setName( myGetName() );
PasswordCallback pc2 = (PasswordCallback)callbacks[1];
String clientPasssword = pc.getPassword(); //Used to contain the password but is now NULL
pc2.setPassword( clientPasssword.toCharArray() );
}
} );
lc.login();
result = true;
} catch( LoginException le ) {
le.printStackTrace(); //current stack trace is a NULLPointerException since "clientPassword" is NULL
// We haven't authenticated, so false will be returned
} catch( SecurityException se ) {
throw new IOException( "Cannot create LoginContext. " + se.getMessage() );
}
return result;
}
}
我的 JAX-WS 端点配置:
<bean id="wss4jPasswordCallback" class="com.mycompany.webservice.security.ServerPasswordCallback"/>
<jaxws:endpoint id="customerEndpoint" implementor="#customerWebService" address="/Customer">
<jaxws:inInterceptors>
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken"/>
<entry key="passwordType" value="PlainText"/>
<entry key="passwordCallbackRef">
<ref bean="wss4jPasswordCallback"/>
</entry>
</map>
</constructor-arg>
</bean>
<bean class="com.mycompany.webservice.security.Wss4jPrincipalInjectorInterceptor"/>
</jaxws:inInterceptors>
<jaxws:outInterceptors>
<bean class="com.mycompany.webservice.security.Wss4jPrincipalRemoverInterceptor"/>
</jaxws:outInterceptors>
<jaxws:outFaultInterceptors>
<bean class="com.mycompany.webservice.security.Wss4jPrincipalRemoverInterceptor"/>
</jaxws:outFaultInterceptors>
</jaxws:endpoint>
具体来说,WSPasswordCallback 对象现在传递 NULL 而不是像过去那样传递密码。根据我的阅读,CXF 只是选择停止执行此操作,因为关于我将为升级路径执行的操作的文档不足。这个的升级路径是什么?
另外,我注意到 WSS4J 正在改变它所在的位置。它已从“org.apache.ws.security”移动到“org.apache.wss4j.common.ext”。我还将我的所有常量更新为“org.apache.wss4j.dom.WSConstants”和“org.apache.wss4j.dom.handler.WSHandlerConstants”,以便编译。这也彻底改变了“org.apache.commons.validator.Validator”中旧的“org.apache.ws.security.validate.Validator”类。现在的类(class)大不相同。也许“org.apache.wss4j.dom.validate.KerberosTokenValidator”是新的替代品?同样,我找不到关于这个事实的文档。
请注意:在迁移到新的 CXF 和 WSS4J 版本之前,这是所有工作代码!
最佳答案
由于我在这个问题上花费了大量时间,所以我想确保提供我的解决方案。这可能并不适合所有人,但如果您的代码看起来像我的问题,这应该会让您走上正轨。
首先,Validator 类现在是 CXF 3 之后的一个接口(interface)。我正在工作的是 org.apache.wss4j.dom.validate.UsernameTokenValidator 代替了 org.apache.ws.security.validate。验证器。我的搜索中没有这条关键信息。
因此,如果您使用 CallbackHandler 进行自定义身份验证,则需要切换到 UsernameTokenValidator。这是我的代码现在的样子。
JAX-WS 配置:
<!-- Bean for custom authentication of web service -->
<bean id="UsernameTokenLDAPValidator" class="com.mycompany.webservice.security.UsernameTokenLDAPValidator"/>
<jaxws:endpoint id="customerEndpoint" implementor="#customerWebService" address="/Customer">
<jaxws:inInterceptors>
<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
<constructor-arg>
<map>
<entry key="action" value="UsernameToken"/>
<entry key="passwordType" value="PasswordText"/>
</map>
</constructor-arg>
</bean>
<bean class="com.mycompany.webservice.security.Wss4jPrincipalInjectorInterceptor"/>
</jaxws:inInterceptors>
<jaxws:outInterceptors>
<bean class="com.mycompany.webservice.security.Wss4jPrincipalRemoverInterceptor"/>
</jaxws:outInterceptors>
<jaxws:outFaultInterceptors>
<bean class="com.mycompany.webservice.security.Wss4jPrincipalRemoverInterceptor"/>
</jaxws:outFaultInterceptors>
<jaxws:properties>
<entry key="ws-security.enable.nonce.cache" value="false" />
<entry key="ws-security.enable.timestamp.cache" value="false" />
<entry key="ws-security.ut.validator" value-ref="UsernameTokenLDAPValidator"/>
</jaxws:properties>
</jaxws:endpoint>
新的 UsernameTokenLDAPValidator 类
public class UsernameTokenLDAPValidator extends UsernameTokenValidator {
public Credential validate( Credential credential, RequestData request ) throws WSSecurityException {
UsernameToken userToken = credential.getUsernametoken();
final String userId = userToken.getName();
final String password = userToken.getPassword();
String securityDomainName = "SecurityDomainNameNameOfJBOSSConfig"; //<login-module>
LoginContext lc;
try {
lc = new LoginContext( securityDomainName, new CallbackHandler() {
public void handle( Callback[] callbacks ) throws IOException, UnsupportedCallbackException {
NameCallback nc = (NameCallback)callbacks[0];
nc.setName( userId );
PasswordCallback pc2 = (PasswordCallback)callbacks[1];
pc2.setPassword( password.toCharArray() );
}
} );
lc.login();
} catch( LoginException e ) {
throw new WSSecurityException( ErrorCode.FAILED_AUTHENTICATION, e );
}
return credential;
}
}
注意事项:
关于apache - CXF 3.X 和 WSS4J 2.X 中的回调处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26638905/
我希望开始在服务器上使用 javascript,最有可能使用 node.js,以及使用 websockets 与客户端通信。但是,似乎没有很多关于使用 TLS 和 wss://处理程序的加密 webs
最近几天一直在为这个错误而苦苦挣扎 Authentication of type {http://service.soap.xcompany.com}AuthenticationHeader had
我正在使用 jax-ws 从 JAVA 调用使用 WS-Security 的 SOAP 服务。问题是响应包含一些 MustUnderstand header ,并且我收到 Element notund
我正在使用 .net 中开发的 Web 服务,该服务接受用户名和密码作为 SOAP header 的一部分。我创建了 SOAPHandler 来创建 header 。 我打印了如下消息: x
Web 服务托管在没有 Internet 连接的服务器上 我正在使用 SOAPUI 访问 Web 服务 url 并进行测试 但得到以下错误信息任何帮助真的很感激
我浏览了以下链接:SOAPFaultException "MustUnderstand headers (oasis-200401-wss-wssecurity-secext-1.0.xsd) are
可以使用CF10的人确认CF10是否支持安全的websocket wss://吗? http://blog.kaazing.com/2012/02/28/html5-websocket-securit
我有一个使用安全 websocket 的应用程序,但我遇到了麻烦。 我想使用wireshark 来调试问题,但是我无法找出正确的参数来放入wireshark 来监控和显示使用HTTPS 的安全Web
我有一个 Node 服务器 (Meteor.js),它应该使用 websockets 与另一台服务器进行通信。由于通信是在不涉及直接用户的服务器之间进行的,因此我选择使用自签名证书。 在哪里添加来自
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 已关闭 8 年前。 Improve
在为 SharePoint 开发复杂功能时,推荐的数据存储方法是什么?您应该将自己限制在 SP 列表以及随之而来的所有限制中,还是使用您自己的数据库,或者在 SP 数据库中创建表? 最佳答案 这实际上
首先,一点背景知识:我们有一个基于 WSS 3.0 的 Intranet 站点,该站点托管在 的服务器上。 DOMAIN_A.LOCAL 并设置为使用集成 Windows 身份验证根据 的 Activ
可以通过 IP 和 DNS 访问 Web 服务。 使用以下命令创建包含 DNS 作为通用名称以及 DNS 和 IP 作为 subjectAlternativeName 的自签名证书 openssl r
我在使用 HTTPS => WS 通信时遇到问题,但找不到解决方法。 我正在使用 Symfony 4.1 和 Ratchet WsServer。服务器通过 9090 端口上的 Symfony 命令启动
有没有办法查看Websocket流量? 只有 Websocket header 在初始握手时可见。 响应后一切都消失了: Connection Upgrade Sec-WebSocket-Accep
SharePoint 的搜索框存在问题。每当我们尝试搜索某些内容时,我们都会得到: Unable to validate data. at System.Web.Configuration.Machi
我是java新手。我想像这样连接到网络套接字: import java.net.URI; import java.net.URISyntaxException; public class PrimeB
我将网站移至 https://。在 http 到套接字上有一个通过 ws://sitename.com: 3003 的连接,现在它们必须在 wss://sitename.com: 3003 上可用。我
我正在尝试使用 nginx 反向代理将 websocket 连接 ws://升级到 wss://https://github.com/nicokaiser/nginx-websocket-proxy/
我发现有些移动网络提供商本身并不支持端口 80,但他们确实支持端口 443,我觉得这有点奇怪。无论如何,我无能为力,导致我从端口 80 切换到端口 433,使用 wss:// 代替 ws://。 我想
我是一名优秀的程序员,十分优秀!