Exception thrown: BIO routines:BIO_new_file:no such file
See original GitHub issuePossibly related to https://github.com/npgsql/npgsql/issues/3246?
I’ve been converting some of our projects to .NET 5, using Npgsql.EntityFrameworkCore 5 packages, and ran into the following issue with the latest (5.0.0-rc2
) package as well as the latest unstable package (5.0.0-rc2-ci.20201111T144547+sha.7d629c39d
).
When the library attempts to establish a connection to the DB (it’s an Azure managed PGSQL instance), the following exception is thrown:
"Depth": 0,
"ClassName": "Interop+Crypto+OpenSslCryptographicException",
"Message": "error:2006D080:BIO routines:BIO_new_file:no such file",
"Source": "System.Security.Cryptography.X509Certificates",
"StackTraceString": "at Interop.Crypto.CheckValidOpenSslHandle(SafeHandle handle)\n
at Internal.Cryptography.Pal.OpenSslX509CertificateReader.FromFile(String fileName, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)\n
at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags)\n
at Npgsql.NpgsqlConnector.<>c__DisplayClass192_0.<SslRootValidation>b__0(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)\n
at System.Net.Security.SecureChannel.VerifyRemoteCertificate(RemoteCertificateValidationCallback remoteCertValidationCallback, ProtocolToken& alertToken, SslPolicyErrors& sslPolicyErrors, X509ChainStatusFlags& chainStatus)\n
at System.Net.Security.SslStream.CompleteHandshake(ProtocolToken& alertToken, SslPolicyErrors& sslPolicyErrors, X509ChainStatusFlags& chainStatus)\n
at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](TIOAdapter adapter, Boolean receiveFirst, Byte[] reAuthenticationData, Boolean isApm)\n
at Npgsql.NpgsqlConnector.RawOpen(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)\n
at Npgsql.NpgsqlConnector.Open(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)\n
at Npgsql.ConnectorPool.OpenNewConnector(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)\n
at Npgsql.ConnectorPool.<>c__DisplayClass38_0.<<Rent>g__RentAsync|0>d.MoveNext()\n--- End of stack trace from previous location ---\n
at Npgsql.NpgsqlConnection.<>c__DisplayClass41_0.<<Open>g__OpenAsync|0>d.MoveNext()\n--- End of stack trace from previous location ---\n
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenInternalAsync(Boolean errorsExpected, CancellationToken cancellationToken)\n
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenInternalAsync(Boolean errorsExpected, CancellationToken cancellationToken)\n
at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenAsync(CancellationToken cancellationToken, Boolean errorsExpected)\n
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)\n
at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.InitializeReaderAsync(DbContext _, Boolean result, CancellationToken cancellationToken)\n
at Npgsql.EntityFrameworkCore.PostgreSQL.Storage.Internal.NpgsqlExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func`4 operation, Func`4 verifySucceeded, CancellationToken cancellationToken)\n
at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()\n
at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancellationToken)\n
at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancellationToken)\n
... our code",
"RemoteStackTraceString": null,
"RemoteStackIndex": 0,
"HResult": 537317504,
"HelpURL": null
I’ve tried setting the log level to verbose, but it didn’t provide any more info as to which file it’s failing to find.
This error manifests itself in the docker image we’re building based on the official Microsoft mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim
. Our docker file looks as follows:
FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
COPY ./*.sln ./
COPY */*.csproj ./
RUN for file in $(ls *.csproj); do mkdir -p ${file%.*} && mv $file ${file%.*}; done
RUN dotnet restore
COPY . ./
FROM build AS publish
WORKDIR /src/AppName
RUN dotnet publish -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "AppName.dll"]
When reverting back to 5.0.0-rc1
version of the nuget package, the problem is gone.
This is the connection string with which the problems manifests itself (sensitive values replaced of course):
Server=hostname.database.azure.com;Database=DbName;Port=5432;User Id=user;Password=pass;Ssl Mode=Require;
Issue Analytics
- State:
- Created 3 years ago
- Comments:7 (5 by maintainers)
There was npgsql/npgsql#3246 in the driver which is fixed for the final version, but not for RC2. Since the final release is available, you can update to it and safely continue development.
Thank you, will take a look.