Необходимо избегать того, чтобы открытый сертификат цифровой подписи BinarySecurityElement был зашифрован mtom

Я столкнулся с проблемой, которую не могу решить. Использование веб-службы на основе Java с использованием wcf и ws security. При использовании не-mtom-запросов сертификат открытого ключа отправляется как часть двоичного элемента безопасности в виде строки base64. Однако тот же сертификат кодируется в mtom для запросов mtom. Есть ли способ избежать такого использования wcf, чтобы сертификат открытого ключа отправлялся в виде встроенной строки base 64 внутри двоичного элемента безопасности, а не в виде многокомпонентного раздела под конвертом запроса мыла?

Это происходит для сертификата с открытым ключом RSA (2048 бит) и отлично работает для сертификата с открытым ключом: RSA (1024 бит)

Таким образом, с сертификатом, имеющим открытый ключ RSA 2048 бит, происходит нечто подобное ниже:

<o:BinarySecurityToken u:Id="uuid-4d4ee765-5717-4d53-9ac9-99bddc07df6c-2" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">
        <xop:Include href="cid:http%3A%2F%2Ftempuri.org%2F1%2F632618206525089430" xmlns:xop="http://www.w3.org/2004/08/xop/include"/>
      </o:BinarySecurityToken>

Вместо этого мне нужно встроенное значение сертификата base64 вместо элемента xop:include. Что происходит правильно для моего сертификата, имеющего 1024-битный открытый ключ RSA.

У меня также есть собственный кодировщик для написания сообщения, но я не могу найти какой-либо конкретный метод для переопределения, который позволил бы мне изменить способ генерирования двоичного маркера безопасности в запросе. Мысли?

Не уверен, что пользовательский кодировщик здесь тоже поможет, вызвал writemessage для объекта сообщения, используя xmlwriter для файла. Я вижу двоичный код безопасности, состоящий из строки base64, которая, по моему мнению, является необработанными байтами сертификата. Это, вероятно, после этого сообщение оптимизировано mtom?

1 ответ

Я не вижу здесь легкого пути. Вы можете отключить MTOM все вместе, но в противном случае это оптимизирует двоичные данные. У него есть внутренняя граница, которую я не думаю, что вы можете настроить (это экономически выгодно - вывести двоичные данные из сообщения только из определенного размера).

Если вы все равно захотите попробовать это, то вам, вероятно, потребуется реализовать специальный кодировщик сообщений, который очень похож на кодировщик MTOM (посмотрите на код в отражателе), и, возможно, вы даже можете вызвать его внутри. То, что вы хотите заменить, - это создание экземпляра XmlMtomWriter. В вашем собственном писателе переопределите метод writeBase64() так, чтобы он делегировал writeString, если данные не прошли через предельное значение. Вы можете выполнить пробный прогон всего этого сценария, имея.Net в режиме отладки исходного кода и устанавливая точки останова в правильных местах.

Другие вопросы по тегам