Я знаю, что уже немного поздно, но я сталкивался с тем же вопросом.Почему-то это запутанная тема (возможно, из-за отсутствия точной документации).При настройке службы по коду (вместо использования файла политики) вы весьма ограничены.Вот что я нашел:
Когда клиент только подписывает сообщение, он прикрепляет свой сертификат в качестве токена безопасности (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] не является безопасным способом получить заголовок безопасности !!Это просто, чтобы показать простой способ получить сертификат клиента.