Skip to content

Ошибка при чтении HTTP ответа через HttpContent.ReadAsStreamAsync() #92

@tonisimakov99

Description

@tonisimakov99

Приложение собирается под .NET 10 (под .NET 6 то же самое работает корректно)

Версии пакетов:

<PackageReference Include="CryptoPro.Net.Security" Version="2025.7.21" />
<PackageReference Include="CryptoPro.Security.Cryptography" Version="2025.7.21" />
<PackageReference Include="CryptoPro.Security.Cryptography.Pkcs" Version="2025.7.21" />
<PackageReference Include="CryptoPro.Security.Cryptography.Xml" Version="2025.7.21" />

Столкнулись с проблемой при попытке получить шаблоны сертификатов с КриптоПро УЦ 2.0. Сервер ЦР (API). Сборка 1.70.0.19.

Минимальный пример:

public static async Task Main(string[] args)
{
    var readAsString  = bool.Parse(args[0]); 

    using (var gostStore = new CpX509Store(StoreLocation.CurrentUser))
    {
        gostStore.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);

        var gostCert = gostStore.Certificates.Find(X509FindType.FindByThumbprint, "96271fdf86a81d8f5ea42139861a397b16b41976", false).First();

        var handler = new CpHttpHandler
        {
            SslOptions = new CpSslClientAuthenticationOptions
            {
                // Указываем сертификат клиента.
                ClientCertificates = new CpX509Certificate2Collection { gostCert },
            }
        };

        var client = new HttpClient(handler);

        using (var request_ = new System.Net.Http.HttpRequestMessage())
        {
            request_.Method = new System.Net.Http.HttpMethod("GET");
            request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json"));


            request_.RequestUri = new System.Uri("https://cpca2.fqdn3.local/api/ra/templates", System.UriKind.RelativeOrAbsolute);

            var response = await client.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(false);

            if (readAsString)
            {
                var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
                Console.WriteLine(responseText);
            }
            else
            {
                using (var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false))
                using (var streamReader = new System.IO.StreamReader(responseStream))
                using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(streamReader))
                {

                    var serializer = Newtonsoft.Json.JsonSerializer.Create();
                    var typedBody = serializer.Deserialize(jsonTextReader);
                }
            }
        }

    }
    Console.WriteLine("end");
}

При попытке прочитать как строку var responseText = await response.Content.ReadAsStringAsync().ConfigureAwait(false); отрабатывает корректно.

При попытке десериализовывать через Newtonsoft.Json.JsonSerializer получаем ошибку:

Unhandled exception. System.IO.IOException: The decryption operation failed, see inner exception.
 ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at Interop.OpenSsl.Decrypt(SafeSslHandle context, Span`1 buffer, SslErrorCode& errorCode)
   at System.Net.Security.SslStreamPal.DecryptMessage(SafeDeleteSslContext securityContext, Span`1 buffer, Int32& offset, Int32& count)
   --- End of inner exception stack trace ---
   at System.Net.Security.SslStream.ReadAsyncInternal[TIOAdapter](Memory`1 buffer, CancellationToken cancellationToken)
   at System.Runtime.CompilerServices.PoolingAsyncValueTaskMethodBuilder`1.StateMachineBox`1.System.Threading.Tasks.Sources.IValueTaskSource<TResult>.GetResult(Int16 token)
   at System.Net.Security.SslStream.Read(Span`1 buffer)
   at System.Net.Http.HttpConnection.FillAsync(Boolean async)
   at System.Net.Http.HttpConnection.ChunkedEncodingReadStream.Fill()
   at System.Net.Http.HttpConnection.ChunkedEncodingReadStream.Read(Span`1 buffer)
   at System.IO.StreamReader.ReadBuffer(Span`1 userBuffer, Boolean& readToUserBuffer)
   at System.IO.StreamReader.ReadSpan(Span`1 buffer)
   at Newtonsoft.Json.JsonTextReader.ReadData(Boolean append, Int32 charsRequired)
   at Newtonsoft.Json.JsonTextReader.ReadData(Boolean append)
   at Newtonsoft.Json.JsonTextReader.ReadStringIntoBuffer(Char quote)
   at Newtonsoft.Json.JsonTextReader.ParseProperty()
   at Newtonsoft.Json.JsonTextReader.ParseObject()
   at Newtonsoft.Json.JsonTextReader.Read()
   at Newtonsoft.Json.JsonWriter.WriteToken(JsonReader reader, Boolean writeChildren, Boolean writeDateConstructorAsDate, Boolean writeComments)
   at Newtonsoft.Json.Linq.JTokenWriter.WriteToken(JsonReader reader, Boolean writeChildren, Boolean writeDateConstructorAsDate, Boolean writeComments)
   at Newtonsoft.Json.JsonWriter.WriteToken(JsonReader reader, Boolean writeChildren)
   at Newtonsoft.Json.JsonWriter.WriteToken(JsonReader reader)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateJToken(JsonReader reader, JsonContract contract)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String id)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
   at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType)
   at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader)
   at ConsoleApp1.Program.Main(String[] args) in C:\Users\Anton\source\repos\ConsoleApp1\ConsoleApp1\Program.cs:line 58
   at ConsoleApp1.Program.<Main>(String[] args)

Понимаю, что под .NET 10 поддержка пока не заявлена, но на всякий случай.

Metadata

Metadata

Assignees

Labels

invalidThis doesn't seem right

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions