Я пытаюсь подключиться к веб-сервису, который находится в довольно нестандартной среде.
Перед IIS-сервером с веб-службой у меня есть обратный прокси-сервер, которому требуется сертификат клиента для проверки подлинности соединения.После этого сама веб-служба требует дополнительной аутентификации UserName.Более того, веб-служба использует basicHttpsBinding с потоковым режимом передачи, поскольку требуется отправка довольно больших двоичных файлов (до 1 ГБ).
Проблема в том, что я не могу заставить его работать на стороне клиента.Я попытался использовать следующую конфигурацию безопасности привязки на стороне клиента:
<security mode="TransportWithMessageCredential">
<transport clientCredentialType="Certificate" />
<message clientCredentialType="UserName" />
</security>
Сам сертификат прикреплен в коде:
client.ClientCredentials.ClientCertificate.SetCertificate(
System.Security.Cryptography.X509Certificates.StoreLocation.CurrentUser, System.Security.Cryptography.X509Certificates.StoreName.My,
System.Security.Cryptography.X509Certificates.X509FindType.FindByThumbprint, "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX");
К сожалению, я получил исключение SecurityNegotiationException: Не удалось установить безопасный канал дляSSL / TLS с полномочиями "ххх".Когда я проверил перехваченный сетевой трафик с помощью Wireshark, я увидел, что после запроса сертификата сервера клиент не отправил никакого сертификата:
Transmission Control Protocol, Src Port: 8325, Dst Port: 443, Seq: 174, Ack: 3566, Len: 197
Secure Sockets Layer
TLSv1.2 Record Layer: Handshake Protocol: Multiple Handshake Messages
Content Type: Handshake (22)
Version: TLS 1.2 (0x0303)
Length: 141
Handshake Protocol: Certificate
Handshake Type: Certificate (11)
Length: 3
Certificates Length: 0
Handshake Protocol: Client Key Exchange
TLSv1.2 Record Layer: Change Cipher Spec Protocol: Change Cipher Spec
TLSv1.2 Record Layer: Handshake Protocol: Encrypted Handshake Message
Однако, если я переключаюсь только в режим безопасности транспорта:
<security mode="Transport">
<transport clientCredentialType="Certificate" />
<message clientCredentialType="UserName" />
</security>
сертификат явно передан:
Transmission Control Protocol, Src Port: 8894, Dst Port: 443, Seq: 174, Ack: 3566, Len: 3215
Secure Sockets Layer
TLSv1.2 Record Layer: Handshake Protocol: Multiple Handshake Messages
Content Type: Handshake (22)
Version: TLS 1.2 (0x0303)
Length: 3159
Handshake Protocol: Certificate
Handshake Type: Certificate (11)
Length: 2757
Certificates Length: 2754
Certificates (2754 bytes)
Certificate Length: 1261
Certificate: 308204e9308203d1a003020102020e78d7243f087eb6a900... (pkcs-9-at-emailAddress=xxx@domain,id-at-commonName=xxx)
Certificate Length: 1487
Certificate: 308205cb308203b3a003020102020e1882d07958679ac300... (id-at-commonName=xxx,id-at-organizationalUnitName=xxx,id-at-organizationName=xxx,id-at-countryName=xxx)
Handshake Protocol: Client Key Exchange
Handshake Protocol: Certificate Verify
TLSv1.2 Record Layer: Change Cipher Spec Protocol: Change Cipher Spec
TLSv1.2 Record Layer: Handshake Protocol: Encrypted Handshake Message
Теперь связь передается обратным прокси-сервером, но IIS отклоняется со следующим исключением:
System.ServiceModel.Security.MessageSecurityException: процессору безопасности не удалось найти заголовок безопасности в сообщении.Это может быть связано с тем, что сообщение является незащищенной ошибкой или из-за несоответствия между связывающими сторонами.Это может произойти, если служба настроена для обеспечения безопасности, а клиент не использует защиту.
Это понятно, поскольку я явно отключил учетные данные сообщения.
К сожалению, мне не удалосьнайти точную информацию, если basicHttpsBinding с режимом безопасности TransportWithMessageCredentials поддерживает или не поддерживает сертификат для транспорта и имя пользователя для аутентификации сообщений.
Кто-нибудь пробовал подобную конфигурацию?Например, я нашел следующую статью Как настроить службу WCF с использованием базовых привязок Http с безопасностью транспортного уровня SSL , но в ней не показано, как прикрепить определенный сертификат клиента, если его запрашивает прокси на стороне сервера.
Буду очень признателен за любую подсказку.