我被分配为 Web 服务创建一个客户端。我以前没有使用 Web 服务的经验,并且一直在尝试但没有成功。\nWeb 服务托管在https://ws.conf.ebs.health.gov.on.ca:1441/EDTService/EDTService \n我是能够使用 Visual Studio 2012 创建代理类并创建被服务拒绝的基本客户端,因为它不包含服务所需的任何安全规范。\n以下内容摘自文档,可从 http获取://www.health.gov.on.ca/en/pro/publications/ohip/default.aspx
\n\nWS-Security 部分包括:\nWSS 1.1 的技术规范\n\xe2\x80\xa2 身份要求;\n\xe2\x80\xa2 签名要求;\n\xe2\x80\xa2 加密要求;和\n\xe2\x80\xa2 时间戳
\n\nIDP\n为了确保消息中敏感信息的机密性和完整性,发送方软件必须使用公钥技术对 SOAP 标头和正文进行签名。\n签名证书可以是任何可用的证书,并且可以进行自签名。\n如果有任何响应数据如果指定要加密,则根据特定的 Web 服务技术规范,将至少使用 AES128-CBC 对称加密算法以及属于初始 SOAP 请求签名者的公钥对数据进行加密。可以根据具体的Web服务技术规范增加加密算法。
\n\n我的目标是创建一个可以访问此服务的 wcf 客户端。到目前为止,这就是我所做的,但它不起作用:\n此示例尝试将文件上传到服务器:
\n\n EndpointAddress address = new EndpointAddress("https://ws.conf.ebs.health.gov.on.ca:1441/EDTService/EDTService");\n //MCEDT userID and password\n string userId = "abcdefg";\n string password = "password";\n //MOH Id\n string mohId = "123456";\n //Vendor Conformance Key\n string key = "1234abcd-eeee-aaaa-ffff-abcdef123456";\n\npublic void upload()\n {\n Console.WriteLine("Uploading....");\n //Specify the binding to be used for the …Run Code Online (Sandbox Code Playgroud) 我正在尝试连接到现有的 SOAP Web 服务。我提供了一个 wsdl,从中我通过 Apache Axis2 XMLBeans 创建了 Java 类。
但是现在我必须使用 WS-Security-Header 扩展我自己编写的客户端发送的消息。我怎样才能做到这一点?
我为此找到了 Apache Rampart 项目,但找不到任何解决方案来扩展从我的 Java 类创建的消息,并使用此类标头。我只能找到为服务建立 WS 安全性的机会(在 webapp 文件夹等中)。
我对你的回答感到兴奋!
感谢您的帮助!
我想用 JUnit 和 Apache CXF 编写一个简单的集成测试来测试一些支持 WS-Security 的服务。当我尝试运行我的代码时:
MyService myService = new myWsService(MY_SERVICE_WSDL).getMyWs()
Client client = ClientProxy.getClient(myService);
Map<String, Object> ctx = ((BindingProvider) myService).getRequestContext();
ctx.put("ws-security.callback-handler", new KeystorePasswordCallback());
ctx.put("ws-security.signature.crypto", new MyMerlinImpl());
Run Code Online (Sandbox Code Playgroud)
MyMerlinImpl 只是在重写loadProperties方法中传递所需的 Merln.* 属性值,
我得到:
sie 12, 2015 11:52:10 AM org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl handleNoRegisteredBuilder
WARNING: No assertion builder for type {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}AsymmetricBinding registered.
sie 12, 2015 11:52:10 AM org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl handleNoRegisteredBuilder
WARNING: No assertion builder for type {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}InitiatorToken registered.
sie 12, 2015 11:52:10 AM org.apache.cxf.ws.policy.AssertionBuilderRegistryImpl handleNoRegisteredBuilder
WARNING: No assertion builder for type {http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702}X509Token …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用来自Netbeans的gSoap生成的wsdl.Web服务要求传入UserNameToken.当我使用SoapUI中的wsdl(有效)时,它发送:
<wsse:Username>myname</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">mypass</wsse:Password>
Run Code Online (Sandbox Code Playgroud)
但是,当我使用处理程序(如何使用Java JAX-WS添加SOAP Header)从Netbeans尝试它时,如下所示:
String prefix = "wsse";
String uri = "http://...wsssecurity...";
SOAPElement securityElem = factory.createElement("Security",prefix,uri);
SOAPElement UserNametokenElem = factory.createElement("UserNameToken",prefix,uri);
SOAPElement UsernameElem = factory.createElement("wsse:Username");
UsernameElem.addTextNode("myname");
SOAPElement PasswordElem = factory.createElement("Password");
PasswordElem.addTextNode("mypass");
UserNametokenElem.addChildElement(UsernameElem);
UserNametokenElem.addChildElement(PasswordElem);
securityElem.addChildElement(UserNametokenElem);
SOAPHeader header = envelope.addHeader();
header.addChildElement(securityElem);
Run Code Online (Sandbox Code Playgroud)
它会像这样生成soap标头:
<wsse:Security xmlns:wsse="http://...wsssecurity...">
<wsse:UserNameToken xmlns:wsse="http://...wsssecurity...">
<Username xmlns="">myname</Username>
<Password xmlns="">mypass</Password>
</wsse:UserNameToken>
</wsse:Security>
Run Code Online (Sandbox Code Playgroud)
这会导致Web服务回复身份验证错误.
因此,我的问题是:
我试图从服务器调用一个ws-security安全的Web服务,遗憾的是它本身不支持这个.我采用的方法是实现一个.jsp,它充当实际端点URL的反向代理,在这个过程中添加了带有ws-security元素的元素.
这似乎工作得很好,我相信我已经使用正确的命名空间等正确构造了XML.我已经通过比较XML与SOAP-UI生成的XML来验证这一点.
问题在于实现密码摘要生成器.我没有得到与使用相同的NOnce,xsd:dateTime和密码输入以及以下代码的SOAP-UI相同的结果.
StringBuffer passwordDigestStr_ = new StringBuffer();
// First append the NOnce from the SOAP header
passwordDigestStr_.append(Base64.decode("PzlbwtWRpmFWjG0JRIRn7A=="));
// Then append the xsd:dateTime in UTC timezone
passwordDigestStr_.append("2012-06-09T18:41:03.640Z");
// Finally append the password/secret
passwordDigestStr_.append("password");
System.out.println("Generated password digest: " + new String(com.bea.xbean.util.Base64.encode(org.apache.commons.codec.digest.DigestUtils.sha(passwordDigestStr_.toString())), "UTF-8"));
Run Code Online (Sandbox Code Playgroud)
我认为问题在于实现前两个元素的散列,如http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0.pdf所述.
注意,使用其解码值的八位位组序列对随机数进行散列,而时间戳使用其元素内容中指定的UTF8编码的八位位组序列进行散列.
如果有人能帮助我解决这个问题,那会很好,因为它开始让我发疯!如果您能提供源代码,那将是理想的选择.
我正在尝试使用以下代码配置WSS4J拦截器:
try {
Map<String, Object> outProps = new HashMap<String, Object>();
outProps.put(WSHandlerConstants.ACTION,
WSHandlerConstants.TIMESTAMP + " "
+ WSHandlerConstants.SIGNATURE + " "
+ WSHandlerConstants.ENCRYPT);
outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS,
ClientKeystorePasswordCallback.class.getName());
outProps.put(WSHandlerConstants.SIG_PROP_FILE,
"clientWSsec-PC165.properties");
outProps.put(WSHandlerConstants.ENC_PROP_FILE,
"clientWSsec-PC165-Srv.properties");
outProps.put(WSHandlerConstants.SIGNATURE_USER, "clientKey");
outProps.put(WSHandlerConstants.ENCRYPTION_USER, "serverKey");
Map<String, Object> inProps = new HashMap<String, Object>();
inProps.put("action", "Timestamp Signature Encrypt");
inProps.put("passwordType", "PasswordText");
inProps.put("passwordCallbackClass",
"utils.ClientKeystorePasswordCallback");
inProps.put("signatureUser", "clientKey");
inProps.put("encryptionUser", "serverKey");
inProps.put("encryptionPropFile", "clientWSsec-PC165.properties");
inProps.put("signaturePropFile", "clientWSsec-PC165.properties");
DefaultCryptoCoverageChecker coverageChecker = new DefaultCryptoCoverageChecker();
coverageChecker.setSignBody(true);
coverageChecker.setSignTimestamp(true);
coverageChecker.setEncryptBody(true);
Service service = new Service ();
WsService wsService = service.getWsServiceSOAP();
org.apache.cxf.endpoint.Client client = ClientProxy
.getClient(wsService); …Run Code Online (Sandbox Code Playgroud) 我有一个MVC3网络应用程序,可以自定义StarterSTS的自定义.我要求知道领域和身份验证要求SSL.
它很有效.
问题是当用户回到我们使用https浏览的网站时.这不是我想要的经验.我的网站不是银行或类似的东西.我认为认证对话应该是安全的(我认为)和令牌加密(我敢肯定).但是,如果我在验证后手动将网址从https更改为http,则表示我未获得授权.
1)为什么?
2)是否可以回归http?或者......我是否应该要求https进行身份验证,但保留令牌加密?
我正在尝试与我无法控制的Java Web服务进行通信,并且我正在尝试创建一个可以正常工作的绑定.
includeTimestamp="false"属性,我必须使用a <customBinding>. <mtomMessagingEncoding>元素.这是我的<bindings>元素:
<bindings>
<customBinding >
<binding name="MyBindingName" >
<mtomMessageEncoding />
<transactionFlow />
<security authenticationMode="UserNameOverTransport"
includeTimestamp="false">
</security>
</binding>
</customBinding>
</bindings>
Run Code Online (Sandbox Code Playgroud)
SOAP Web服务要求邮件头采用以下格式:
<soap:Envelope ... >
<soap:Header ... >
<wsse:UsernameToken>
<wsse:Username>doo</wsse:Username>
<wsse:Password Type="wsse:PasswordText">fuss</wsse:Password>
</...>
</...>
</...>
Run Code Online (Sandbox Code Playgroud)
我最接近的是:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
xmlns:a="http://www.w3.org/2005/08/addressing"
xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<s:Header>
<a:Action s:mustUnderstand="1"></a:Action>
<a:MessageID>urn:uuid:a368e205-a14d-4955-bf75-049cdd3a78c0</a:MessageID>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:To s:mustUnderstand="1">https://blablabla</a:To>
<o:Security s:mustUnderstand="1"
xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<o:UsernameToken u:Id="uuid-0f1e399b-31a8-4e00-a57f-277c21e94879-1">
<o:Username><!-- Removed--></o:Username>
<o:Password><!-- Removed--></o:Password>
</o:UsernameToken>
</o:Security>
</s:Header>
Run Code Online (Sandbox Code Playgroud)
我相信我在这里错过了一些琐碎和愚蠢的东西,但对于我的生活,我无法弄清楚它可能是什么.
我需要将SOAP标头设置为以下格式:
<soapenv:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-45">
<wsse:Username>XXXXX</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">XXXXXXX</wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">OxWtCYYj1cX7HiZeMEqorw==</wsse:Nonce>
<wsu:Created>2013-09-18T07:25:50.227Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用下面的代码验证Web服务,但它不起作用.
$momurl = "https://integrationdev.momentum.co.za/sales/CRMService/CRMLeadService_v1_0/";
$client = new SoapClient(
"$momurl",
array(
'trace' => 1,
'login' => $username,
'password' => $password
)
);
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.提前致谢.
我正在尝试使用 Apache CXF 和 Spring 构建基于令牌的身份验证和授权系统。我完全按照这个很棒的帖子来做这件事。但是我一开始就遇到了 AuthorizationFilter 的问题。我看过很多关于它的帖子,apache JIRA,github 评论,但还没有找到解决这个看似 CXF 问题的方法。
@PreMatching
@Priority(Priorities.AUTHORIZATION)
public class AuthorizationFilter implements ContainerRequestFilter {
private ResourceInfo resourceInfo;
@Context
public void setResourceInfo(ResourceInfo resourceInfo) {
this.resourceInfo = resourceInfo;
}
@Override
public void filter(final ContainerRequestContext requestContext) throws IOException {
Method method = resourceInfo.getResourceMethod();
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,注入的 resourceInfo 是一个代理对象,它没有任何关联的属性存在。因此,来自该resourceInfo对象的任何内容都将返回null,更具体地说resourceInfo.getResourceMethod()是null,导致 NPE。这是关于这个问题的JIRA帖子,说:
在某些情况下(例如使用 @ApplicationScoped 注释),CDI 运行时将为特定 bean 创建代理类。结果,CXF 端将把特定的提供者元数据绑定到这个代理实例。它看起来合乎逻辑且毫不含糊。
然而,当 CXF 尝试将上下文代理(@Context 注释)注入提供程序实例时,有趣的事情正在发生。注入成功,但它们的目标对象将是代理实例(而不是其背后的真实实例)。因此,在运行时,当代理将调用委托给支持实例时,所有上下文代理在那里都是空的(简单地说,没有设置)。
参考最近与 Sergey Beryozkin 的讨论,最好的解决方案是将 @Context …