1

在使用 wso2/php 编写 Web 服务时,我被困在一个地方。我想使用安全的 mtom。在使用加密或签名时,我如何知道在安全令牌中使用哪个客户端的公共证书???或者我应该尝试匹配所有现有的客户端公共证书?

我需要知道当前用户是谁。因为服务是客户特定的。请帮助...紧急:)

问候 Charanjeet Kaur

4

1 回答 1

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] 不是获取安全标头的安全方法!!这只是为了展示一种获取客户端证书的简单方法。

于 2012-06-14T14:47:41.723 回答