我正在尝试访问由证书保护的Web服务.安全性在IIS上设置,Web服务就在它后面.
我不认为WS-SECURITY会进行这种类型的身份验证.在调用Web服务时,有没有办法传递客户端证书?
我刚刚收到一个IIS错误页面,上面写着"该页面需要客户端证书".
我正在使用CXF 2.1.4
我需要构建一个简单的Web服务,通过Internet将数据输入和输出HR系统(这是一个托管解决方案).我正在使用IIS和ASP.Net与.Net 2.0.
看了之后,有几种方法可以确保网络服务的安全 - 我正在考虑选择哪种方法,并对一些优缺点进行一些观察.
这些是我所知道的方法:
将UID/PWD发布到Soap头中并实现SOAP扩展(链接).
非常简单的实现,并且应该通过SSL非常安全.由于相对简单,这是我的首选方案.此外,由于历史原因,我需要使用VBScript中的所有Web服务,因此只需处理简单的SOAP即可.
但是,有什么警告吗?我是否会让客户抱怨这是一种安全隐患?
我发现很多旧文章指的是WS,如果我没有被误解,这就是现在在WCF中提供的内容?这个Microsoft链接有一个入门.
如果我理解正确,它会在客户端和服务器之间使用基于证书的安全性进行身份验证.这是正确的还是我完全错了?
我怀疑这将是一项更大的工作,至少在实施方面是明智的.此外,我将无法直接从VBScript访问Webservice,因此必须编写一个调用它的DLL然后在本地部署 - 正确吗?
这甚至可以在.Net 2.0中使用吗?
对于解决这个问题的最佳方法,我将非常感激.如果有人有一个很好的论据,为什么Soap Headers是安全的,那么我很乐意听到它,因为这似乎是最简单的使用,只要它"足够安全".
我已经成功创建了一个在不使用身份验证时正常工作的WS客户端.
但是,服务器(WebSphere)现在需要添加一个ws-security用户名令牌,而我很难做到这一点.生成的SOAP消息应该看起来像这样:
<soapenv:Envelope
xmlns:ns="http://foo.bar/1.0"
xmlns:ns1="http://www.witsml.org/schemas/140"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-2" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>foo</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">bar</wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">foooooobar==</wsse:Nonce>
<wsu:Created>2010-01-25T13:09:24.860Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<ns:fooBar>...</ns:fooBar>
</soapenv:Body>
Run Code Online (Sandbox Code Playgroud)
我已经下载并安装了Microsoft的WSE 3.0 SDK,并在我的Visual Studio 2005项目中添加了对DLL的引用.
我现在可以访问Microsoft.Web.Services3.*命名空间,但我目前难以理解如何继续.
客户端代码是由Web引用自动生成的,因此我只做了少量工作就将消息发送到未经身份验证的服务器:
WS.FooResultHttpService ws = new WS.FooResultHttpService();
ws.Url = "http://foo.bar.baz";
ws.SendSomething(message);
Run Code Online (Sandbox Code Playgroud)
我刚开始调查使用Microsoft.Web.Services3.Security.Tokens.UsernameTokenManager,但到目前为止,我还没有能够得到任何东西.
任何提示将不胜感激,因为我似乎无法在网上找到任何好的食谱.
谢谢!
我提出了一个关于JAX-WS,身份验证和授权的问题 - 如何?; 讨论了安全级别以及存储用户凭据的位置.
现在得出一些结论后,我想尝试其中一种方案:
如何获取凭据并进行授权? 我有两个想法:
你能帮我决定最好的方法,以及如何实现它?
请记住,我需要共同证书,以及用户令牌.
我正在java中实现ebXML3.0并寻找可用于带附件的SOAP消息的签名和加密的java库/ API.之前我使用的是"Apache wss4j",但这似乎只支持SOAP Body(无附件)的签名/加密.
基本上寻找支持以下的Java API
https://www.oasis-open.org/committees/download.php/16672/wss-v1.1-spec-os-SwAProfile.pdf
我在tomcat中运行了一个启用了TLS的应用程序(Web服务)(包含客户端和服务器的证书).
我希望我的应用程序能够在TLS握手失败时发送审计消息(日志记录).例如,我想在以下时间记录:
为了做到这一点,我能抓住并处理任何事件吗?
- Yonatan
我的应用程序是基于Web服务的,并且在tomcat中运行.Tomcat正在处理所有网络和TLS层,应用程序并不知道这一点.
由于我自己没有打开任何套接字,我应该在哪里捕获此异常?
- Yonatan
大家好!
这是我的请求消息:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap: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" soap:mustUnderstand="1">
<wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="X509-A3BCFAE87E12A8813813289737654441">MIICCTCCAXKgAwIBAgIETzVFkDANBgkqhkiG9w0BAQUFADBJMQswCQYDVQQGEwJSVTEKMAgGA1UECBMBMTEKMAgGA1UEBxMBMTEKMAgGA1UEChMBMTEKMAgGA1UECxMBMTEKMAgGA1UEAxMBMTAeFw0xMjAyMTAxNjI4MDBaFw0xMjA1MTAxNjI4MDBaMEkxCzAJBgNVBAYTAlJVMQowCAYDVQQIEwExMQowCAYDVQQHEwExMQowCAYDVQQKEwExMQowCAYDVQQLEwExMQowCAYDVQQDEwExMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCdwxyRNYlWADnTtzH9/s/ehhD2iFzvF2xI+tBNyhbBb98EQNiIFdEegwGPhtd3Cfe1lQqtddWdFX2uLqozMAgd1KzSEuH9lI5DPiir3RfVdy+Irs5ZYiD/H4/DcUMUNyVcWspf9oG25wNdwNHKY8Aqz2269uYMCCoIBuWt6POwFQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAGLgTXbn7h2rBjv++6OopDooRifc4e2k+9sSTpLNegs9OvQzR8DpmQ/6Vt0RFprIdXSv+IVMcmL8Q2dmI9v0R61NIhdEjzSVbO2+PF9h1ShUARzMawRC/EOdjwVjDsk1WMxF18+wvH9SQxBSK3H2WpJbDWBxZCOW5CK1N6AKKJiC</wsse:BinarySecurityToken>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="SIG-2">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="soap" />
</ds:CanonicalizationMethod>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ds:Reference URI="#id-1">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="" />
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>RJhc1ZVjXdUQEIwLTH356p7H0QY=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>F0q0NV7kaSbAcsLHxVpYD1bQ1RAJcw6wPapDKAM9PIcs7EuS9S5PlE4cQMfAp1WgsKa91r3op1OQ5UrYmmdj/UneYawdPIYSaoFBGjndTXZnOCKp4YfRTQGZ2EVJRFHJbPsTsqHedPAyJLHhciViguTGeuA0hZAQN97KB/9ZLmY=</ds:SignatureValue>
<ds:KeyInfo Id="KI-A3BCFAE87E12A8813813289737654452">
<wsse:SecurityTokenReference wsu:Id="STR-A3BCFAE87E12A8813813289737654483">
<wsse:Reference URI="#X509-A3BCFAE87E12A8813813289737654441" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" />
</wsse:SecurityTokenReference>
</ds:KeyInfo>
</ds:Signature>
</wsse:Security>
</soap:Header>
<soap:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="id-1">
<stubMethod xmlns="http://ws_base.ws.stuff/" />
</soap:Body>
</soap:Envelope>
Run Code Online (Sandbox Code Playgroud)
我尝试验证<ds:DigestValue>RJhc1ZVjXdUQEIwLTH356p7H0QY=</ds:DigestValue>与正文标签相关的内容。有像ds:CanonicalizationMethod和ds:Transforms这样的标签对我来说真的很困惑。我的问题是如何验证身体部位?首先,我应该使用什么标签开始验证
<soap:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="id-1">
<stubMethod xmlns="http://ws_base.ws.stuff/" />
</soap:Body> …Run Code Online (Sandbox Code Playgroud) 我们有一个普通的WCF服务,其绑定看起来像这样:
<wsHttpBinding>
<binding name="ServiceBinding" receiveTimeout="00:10:00" sendTimeout="00:10:00"
bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
maxReceivedMessageSize="20971520"
messageEncoding="Mtom" textEncoding="utf-8" useDefaultWebProxy="true"
allowCookies="false">
<security mode="Message">
<message clientCredentialType="Windows" negotiateServiceCredential="true"
establishSecurityContext="false" />
</security>
</binding>
</wsHttpBinding>
Run Code Online (Sandbox Code Playgroud)
此服务位于负载均衡器后面的2台服务器中.如此处所示
http://msdn.microsoft.com/en-us/library/vstudio/hh273122(v=vs.100).aspx
我已将establishSecurityContext设置为false.当我运行调用服务时,我得到与无效安全上下文令牌相关的间歇性问题.即使我说不要建立SeurityContext,似乎WCF正在做所有正常的握手事情.
此时使用Cert,BasicHttBinding或由于要求不允许安全性.
我甚至让基础架构团队在负载均衡器中启用粘性会话,但似乎没有任何东西像我们期望的那样工作.
我和我的团队几乎完成了互联网上所说的一切,但是当有负载均衡器时似乎没有任何工作,并且当没有负载均衡器时这种绑定工作正常.
这个绑定有没有运气好吗?
我们正在追逐微软向我们发送WCF专家,但显然人们很难掌握.
如何让这个东西与Load Balancer很好地配合?
我需要调用 Web 服务,我必须使用 C# 在下面发送这样的肥皂请求。SoapBody 和 TimeStamp 必须签名。
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:web="http://xyzt.com/">
<soap: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:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509PKIPathv1" wsu:Id="X509-F4AF9673207AC5E0B614180667985061">MIIFsDCCBawwggSUoAMCAQICBgCaWhnEajANBgkqhkiG9w0BAQsFADBcMQswCQYDVQQGEwJUUjFNMEsGA1UEAwxETWFsaSBNw7xow7xyIEVsZWt0cm9uaWsgU2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgLSBTw7xyw7xtIDEwHhcNMT</wsse:BinarySecurityToken>
<ds:Signature Id="SIG-3" xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces PrefixList="soap web" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:CanonicalizationMethod>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
<ds:Reference URI="#id-2">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces PrefixList="web" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>IZVrIpPCxiPcvyVOVv/d4nRPZWM=</ds:DigestValue>
</ds:Reference>
<ds:Reference URI="#TS-1">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<ec:InclusiveNamespaces PrefixList="wsse soap web" xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>fltghgDztDtuVQX7y4t0ZJxAnxE=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>IOVXxBTp053aNJMbQj+VTiBblZ63peyJ1vWazKmEWNxN7RaeFfKELoxede8xQEqzSaB/u8exC7LLGYiEdChboVCf9liLMN4MmNj5JR6gfDrsL3azThf5hxLQ+WIE20PRoU6ozpp20zC1IaO3IU4ZaRLw</ds:SignatureValue>
<ds:KeyInfo Id="KI-F4AF9673207AC5E0B614180667986422">
<wsse:SecurityTokenReference wsse11:TokenType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509PKIPathv1" wsu:Id="STR-F4AF9673207AC5E0B614180667986643" xmlns:wsse11="http://docs.oasis-open.org/wss/oasis-wss-wssecurity-secext-1.1.xsd">
<wsse:Reference URI="#X509-F4AF9673207AC5E0B614180667985061" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509PKIPathv1"/>
</wsse:SecurityTokenReference>
</ds:KeyInfo>
</ds:Signature>
<wsu:Timestamp wsu:Id="TS-1">
<wsu:Created>2014-12-08T21:26:36.191Z</wsu:Created>
<wsu:Expires>2014-12-08T21:36:36.191Z</wsu:Expires> …Run Code Online (Sandbox Code Playgroud) 我刚刚设置了一个SelfHost(InMem with WS-Fed) Thinktecture IdentityServer3项目示例,我正在尝试使用它来获取JWT,问题是我只使用alg接收使用非对称密钥签名的令牌,RS256但我需要使用alg对称,HS256所以我可以在客户端上使用相同的密钥.
我试图通过在服务器上配置依赖方而没有成功来遵循一些示例.
例如,我看到以下标记:
var relyingParty = new RelyingParty()
{
Enabled = true,
Realm = "urn:carbon",
Name = "Test party",
SymmetricSigningKey =
Convert.FromBase64String("R03W9kJERSSLH11Px+R/O7EYfAadSMQfZD5haQZj6eU="),
TokenLifeTime = 120
};
Run Code Online (Sandbox Code Playgroud)
但是,当我在我的代码上尝试它时,我有一个错误SymmetricSigningKey,它说:
'Thinktecture.IdentityServer.WsFederation.Models.RelyingParty'不包含'SymmetricSigningKey'的定义
我做错了什么?,提前谢谢!
UPDATE
启动文件的标记:
public void Configuration(IAppBuilder appBuilder)
{
var factory = InMemoryFactory.Create(
users: Users.Get(),
clients: Clients.Get(),
scopes: Scopes.Get()
);
var options = new IdentityServerOptions
{
IssuerUri = "https://idsrv3.com",
SiteName = "Thinktecture IdentityServer3 - WsFed", …Run Code Online (Sandbox Code Playgroud) c# ws-security claims-based-identity jwt thinktecture-ident-server
ws-security ×10
web-services ×5
c# ×4
java ×3
soap ×3
security ×2
ssl ×2
.net ×1
cryptography ×1
cxf ×1
encryption ×1
jax-ws ×1
jwt ×1
tomcat ×1
vbscript ×1
wcf ×1
wcf-security ×1
wse3.0 ×1
wss4j ×1