У меня очень специфическая ситуация:
Веб-сайт, который использует конечные точки веб-службы WCF с помощью рукопожатия TSL.Многие пользователи могут зарегистрироваться на этом сайте, загрузить свои сертификаты A1 и использовать конечные точки веб-службы через эту систему.
Локально, в Windows, размещенной в IIS, он прекрасно работал, когда пользователь загружает свой сертификат, он сохраняется в базе данных как большой двоичный объект, когда мне нужно поговорить с веб-службой, я делаю следующее:
certificate = new X509Certificate2(company.Certificate.File, password, X509KeyStorageFlags.MachineKeySet);
// the SendFileServiceClient object is an auto-generated object, created when the WCF web service was registered
var sendFile = new SendFileServiceClient();
sendFile.ClientCredentials.ClientCertificate.Certificate = certificate;
await sendFile.OpenAsync();
answer = await sendFile.SendFileAsync(XElement.Parse(xmlFile));
await sendFile.CloseAsync();
Но проблема возникает, когда я контейнер приложения.С докером это не работает, я могу загрузить свой сертификат, большой двоичный объект создается в БД, я даже могу получить его и создать объект X509Certificate2 (вся информация о сертификате есть, когда я проверяю его во время отладки), нов строке answer =
я получаю следующее:
Не удалось установить доверительные отношения для безопасного канала SSL / TLS с полномочиями 'webservices.foo.bar'
Вот трассировка стека:
at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, ExceptionDispatchInfo exception)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.PartialFrameCallback(AsyncProtocolRequest asyncRequest)
--- End of stack trace from previous location where exception was thrown ---
at System.Net.Security.SslState.ThrowIfExceptional()
at System.Net.Security.SslState.InternalEndProcessAuthentication(LazyAsyncResult lazyResult)
at System.Net.Security.SslState.EndProcessAuthentication(IAsyncResult result)
at System.Net.Security.SslStream.EndAuthenticateAsClient(IAsyncResult asyncResult)
at System.Net.Security.SslStream.<>c.<AuthenticateAsClientAsync>b__47_1(IAsyncResult iar)
at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)
--- End of stack trace from previous location where exception was thrown ---
at System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore(Stream stream, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken)
База для моего образа Docker:
FROM microsoft/dotnet:2.2-aspnetcore-runtime
Может кто-нибудь сказать мне, в чем здесь проблема?Можно ли даже сделать то, что мне нужно, с помощью образа докера?