Closed
Description
Software versions
MySqlConnector version: 2.3.1
Server type (MySQL, MariaDB, Aurora, etc.) and version: mysql:8.2.0
.NET version: 8.0
Describe the bug
Attempt to connect to a MySQL server using a SSL certificate but specify an invalid path to the client certificate file. MySqlConnector will throw InvalidOperationException: The collection already contains item with same key 'net.transport'
. It should throw a FileNotFoundException
or some other more self-explanatory error.
Exception
[INFO] ConnectionPool Creating new connection pool 1 for Server=localhost;Port=3306;User ID=root;SSL Mode=VerifyFull;SSL Cert=C:\client-cert.pem;SSL Key=C:\DoesNotExist\client-key.pem;SSL CA=C:\ssl-ca-cert.pem
[TRACE] ConnectionPool Pool 1 waiting for an available session
[TRACE] MySqlConnection Created new session 1.1
[DEBUG] ConnectionPool Pool 1 has no pooled session available; created new session 1.1
[TRACE] MySqlConnection Session 1.1 connecting to IP address 127.0.0.1 (1 of 2) for host name localhost (1 of 1)
[TRACE] MySqlConnection Session 1.1 connected to IP address 127.0.0.1 for host name localhost with local port 61277
[TRACE] MySqlConnection Session 1.1 server sent auth plugin name caching_sha2_password
[DEBUG] MySqlConnection Session 1.1 made connection; server version 8.2.0; connection ID 28; supports: compression False, attributes True, deprecate EOF True, cached metadata False, SSL True, session track True, pipelining True, query attributes True
[TRACE] MySqlConnection Session 1.1 initializing TLS connection
[WARN] MySqlConnection Session 1.1 failed negotiating TLS; falling back to TLS 1.1
System.IO.FileNotFoundException: Could not find file 'C:\DoesNotExist\client-key.pem'.
File name: 'C:\DoesNotExist\client-key.pem'
at Microsoft.Win32.SafeHandles.SafeFileHandle.CreateFile(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options)
at Microsoft.Win32.SafeHandles.SafeFileHandle.Open(String fullPath, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
at System.IO.Strategies.OSFileStreamStrategy..ctor(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
at System.IO.Strategies.FileStreamHelpers.ChooseStrategyCore(String path, FileMode mode, FileAccess access, FileShare share, FileOptions options, Int64 preallocationSize, Nullable`1 unixCreateMode)
at System.IO.StreamReader.ValidateArgsAndOpenPath(String path, Encoding encoding, Int32 bufferSize)
at System.IO.File.ReadAllText(String path, Encoding encoding)
at System.Security.Cryptography.X509Certificates.X509Certificate2.CreateFromPemFile(String certPemFilePath, String keyPemFilePath)
at MySqlConnector.Core.ServerSession.<>c__DisplayClass114_0.<InitSslAsync>g__LoadCertificate|2(String sslKeyFile, String sslCertificateFile) in C:\Code\MySqlConnector\src\MySqlConnector\Core\ServerSession.cs:line 1532
at MySqlConnector.Core.ServerSession.InitSslAsync(ProtocolCapabilities serverCapabilities, ConnectionSettings cs, MySqlConnection connection, SslProtocols sslProtocols, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\Code\MySqlConnector\src\MySqlConnector\Core\ServerSession.cs:line 1302
at MySqlConnector.Core.ServerSession.ConnectAsync(ConnectionSettings cs, MySqlConnection connection, Int64 startingTimestamp, ILoadBalancer loadBalancer, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\Code\MySqlConnector\src\MySqlConnector\Core\ServerSession.cs:line 542
[TRACE] MySqlConnection Session 1.1 sending QUIT command
[DEBUG] MySqlConnection Session 1.1 closing stream/socket
InvalidOperationException: "The collection already contains item with same key 'net.transport''"
at System.Diagnostics.ActivityTagsCollection.Add(String key, Object value)
at MySqlConnector.Core.ServerSession.OpenTcpSocketAsync(ConnectionSettings cs, ILoadBalancer loadBalancer, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\Code\MySqlConnector\src\MySqlConnector\Core\ServerSession.cs:line 989
at MySqlConnector.Core.ServerSession.ConnectAsync(ConnectionSettings cs, MySqlConnection connection, Int64 startingTimestamp, ILoadBalancer loadBalancer, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\Code\MySqlConnector\src\MySqlConnector\Core\ServerSession.cs:line 444
at MySqlConnector.Core.ConnectionPool.ConnectSessionAsync(MySqlConnection connection, Action`4 logMessage, Int64 startingTimestamp, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\Code\MySqlConnector\src\MySqlConnector\Core\ConnectionPool.cs:line 428
at MySqlConnector.Core.ConnectionPool.ConnectSessionAsync(MySqlConnection connection, Action`4 logMessage, Int64 startingTimestamp, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\Code\MySqlConnector\src\MySqlConnector\Core\ConnectionPool.cs:line 433
at MySqlConnector.Core.ConnectionPool.GetSessionAsync(MySqlConnection connection, Int64 startingTimestamp, Int32 timeoutMilliseconds, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\Code\MySqlConnector\src\MySqlConnector\Core\ConnectionPool.cs:line 113
at MySqlConnector.Core.ConnectionPool.GetSessionAsync(MySqlConnection connection, Int64 startingTimestamp, Int32 timeoutMilliseconds, Activity activity, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\Code\MySqlConnector\src\MySqlConnector\Core\ConnectionPool.cs:line 146
at MySqlConnector.MySqlConnection.CreateSessionAsync(ConnectionPool pool, Int64 startingTimestamp, Activity activity, Nullable`1 ioBehavior, CancellationToken cancellationToken) in C:\Code\MySqlConnector\src\MySqlConnector\MySqlConnection.cs:line 919
at MySqlConnector.MySqlConnection.OpenAsync(Nullable`1 ioBehavior, CancellationToken cancellationToken) in C:\Code\MySqlConnector\src\MySqlConnector\MySqlConnection.cs:line 419
at MySqlConnector.MySqlConnection.Open() in C:\Code\MySqlConnector\src\MySqlConnector\MySqlConnection.cs:line 381
at UserQuery.Main(), line 21
**Code sample**
```csharp
MySqlConnectionStringBuilder csb = new MySqlConnectionStringBuilder()
{
Server = "localhost",
Port = 3306,
UserID = "root",
Password = "pass",
SslMode = MySqlSslMode.VerifyFull,
SslCa = @"C:\ssl-ca-cert.pem",
SslCert = @"C:\client-cert.pem",
SslKey = @"C:\DoesNotExist\client-key.pem",
};
using var connection = new MySqlConnection(csb.ConnectionString);
connection.Open();
Expected behavior
It should throw a FileNotFoundException
or some other more self-explanatory error.
Additional context
Possibly related to #1074.