Исключение запроса HTTPS клиента WCF - PullRequest
0 голосов
/ 14 января 2020

Я нахожусь в процессе создания клиента WCF для веб-службы SOAP HTTPS в. Net Core 2.1.

Поставщик услуг предоставил файл .key и .cert, который я преобразовал в файл .p12 с помощью openssl. Добавив это в хранилище ключей, я могу через SoapUI успешно отправить запрос в веб-службу (никакой другой проверки подлинности, кроме сертификата, не требуется).

Чтобы выполнить ту же операцию в. Net Ядро Я добавил подключенную службу в свой проект с помощью мастера WCF в Visual Studio. Эта услуга основана на предоставленном сервисном контракте (файл WSDL). Затем я установил сертификат .p12 локально на моем P C, и я использую следующий код для выполнения запроса. «MyService» - это подключенная служба.

var binding = new BasicHttpsBinding();
binding.Security.Mode = BasicHttpsSecurityMode.Transport;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;

var endpoint = new EndpointAddress("https://x.x.x.x:8300/MyService.asmx");
var channelFactory = new ChannelFactory<MyService>(binding, endpoint);    
channelFactory.Credentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
channelFactory.Credentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication()
        {
            CertificateValidationMode = X509CertificateValidationMode.None,                
            RevocationMode = X509RevocationMode.NoCheck,
            TrustedStoreLocation = StoreLocation.LocalMachine
        };

channelFactory.Credentials.ClientCertificate.SetCertificate(
        StoreLocation.CurrentUser,
        StoreName.My,
        X509FindType.FindByIssuerName,
        "xxxxxxxxxxxxxxxxxxxxxxxxxx");  

var service = channelFactory.CreateChannel(); 


ExecuteResponse response = service.Execute(new ExecuteRequest());

При выполнении этого кода я получаю следующую ошибку:

System.ServiceModel.Security.MessageSecurityException: 'HTTP-запрос несанкционированный со схемой аутентификации клиента «Аноним». Заголовок аутентификации, полученный от сервера, был 'Negotiate'. '

Странно то, что мне разрешено сделать запрос, если я использую HttpClientHandler, который говорит мне, что должно быть несоответствие между Основная структура двух реализаций. Кто-нибудь, кто знает, как я могу исправить эту ошибку?

1 Ответ

0 голосов
/ 15 января 2020

Сертификат может быть использован только для установления sh доверительных отношений между клиентской и серверной сторонами.
Для успешного вызова службы нам следует сохранить тип привязки между клиентом и сервером. сторона и сторона сервера согласованы. Поэтому я хотел бы узнать автоматически сгенерированную конфигурацию на стороне клиента путем добавления ссылки на службу, пожалуйста, опубликуйте раздел System.servicemodel, расположенный в appconfig клиентского проекта.
enter image description here
Если сервер аутентифицирует клиентскую часть с помощью сертификата, ошибка обычно указывает, что доверительные отношения между клиентской и серверной сторонами еще не установлены.
На клиентской стороне мы должны установить сервер сертификат в LocalCA. На стороне сервера мы должны установить клиентский сертификат в хранилище сертификатов LocalCA.
Не стесняйтесь сообщить мне, если проблема все еще существует.

...