Ваши настройки безопасности полностью неверны на основании вашего описания.Вы хотите подписи в сообщении?=> вам нужна защита сообщений, но вы используете безопасность транспорта и только передаете сертификат в качестве идентификации клиента.Это имеет несколько последствий:
- Клиент подключается к службе через HTTPS - он проверяет доверие к сертификату, используемому службой для создания HTTPS-соединения
- Сам HTTPS (безопасность транспорта) обеспечивает шифрование и целостность притранспортный уровень
- Сертификат предназначен только для аутентификации клиента - у службы нет сертификата (настроенный вами сертификат не используется).
- Клиент передает сертификат (открытый ключ) службе и использует свой закрытый ключ для подписи заголовков.
- Служба получает сертификат и подтверждает, что доверяет ему
- Служба использует полученный открытый ключ для проверки подписей
- Служба обрабатывает запрос и возвращает ответ
- Службане имеет никакого собственного сертификата, и клиент не ожидает никакого => он не может подписывать заголовки (клиентский сертификат также не может использоваться, потому что служба не знает закрытый ключ клиента)
- Клиент получает ответ и ему просто доверяют, потому что он возвращается через установленное HTTPS-соединение
Если вы хотите иметь подписи как в запросе, так и в ответе, вы должны перейти к полной безопасности сообщений (HTTPS не понадобится)что означает изменение режима безопасности с TransportWithMessageSecurity
на Message
.После этого и клиент, и служба будут иметь свой собственный сертификат и использовать их для защиты каждого сообщения отдельно.По умолчанию весь контент вашего сообщения также будет зашифрован и подписан.Если вы не хотите этого, вы должны настроить ProtectionLevel
в своих контрактах.