在使用wso2 / php编写Web服务时,我被困在一个地方。 我想使用安全的mtom。 在使用加密或签名时,如何知道在安全令牌中使用哪个客户端的公共证书? 或者我应该尝试匹配所有现有的客户公共证书吗?
我需要知道当前用户是谁。由于服务是客户特定的。 请帮忙......紧急:))
此致 Charanjeet Kaur
答案 0 :(得分:2)
我知道这有点晚了,但我遇到了同样的问题。不知何故,这是一个令人困惑的话题,(可能是因为缺乏精确的文档)。 通过代码配置服务(而不是使用策略文件)时,您非常有限。这是我发现的:
当客户仅签署消息时,他会将其证书附加为标头中的安全令牌(wsse:binarysecuritytoken)。服务器获取该证书并使用它来检查签名。所以,你需要指定:
在客户端中: 客户端证书和私钥。
服务中的: 服务证书和私钥(从标头中获取客户端证书)。
当客户签名并加密邮件时,客户端会使用服务器证书加密并同时发送证书,以便服务器可以检查签名并加密回来。此处,服务使用标头中的证书来加密响应。所以,你只需要指定:
客户端 中的:客户端证书和私钥以及服务器证书。
服务器中的:服务器证书和私钥(从标头中获取客户端证书)。
当客户仅加密邮件时,他不会在请求中发送证书,因此您必须在服务中指定客户端证书。
客户端中的: 客户端证书和私钥以及服务器证书。
在服务器中: 服务器证书以及私钥和客户端证书。
因此,在第一种情况下,您不需要指定客户端的证书,并且您可以从请求标头中获取它并在需要对用户进行身份验证时进行进一步处理(可能会针对某些预共享进行检查)证书)。在最后一种情况下,我无法找到解决方法(可能正在使用xml策略)。
要在php中检索证书,你需要处理名称空间(硬连线)代码就像这样(在你的回复函数中):
$xml = simplexml_load_string($inMessage->outputHeaders[3]->str, NULL, NULL, "http://schemas.xmlsoap.org/soap/envelope/");
$ss= $xml->children("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")
->BinarySecurityToken;
警告!! outputHeaders [3]不是获取安全头的安全方法!这只是为了展示获取客户端证书的简单方法。