Skip to content

Commit 430667b

Browse files
committed
Add SslCa connection string option. Fixes #640
1 parent f7e6e04 commit 430667b

File tree

8 files changed

+36
-26
lines changed

8 files changed

+36
-26
lines changed

docs/content/connection-options.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,9 @@ These are the options that need to be used in order to configure a connection to
101101
<td>Specifies the password for the certificate specified using the <code>CertificateFile</code> option. Not required if the certificate file is not password protected.</td>
102102
</tr>
103103
<tr>
104-
<td>CA Certificate File, CACertificateFile</td>
104+
<td>CA Certificate File, CACertificateFile, SslCa, Ssl-Ca</td>
105105
<td></td>
106-
<td>This option specifies the path to a CA certificate file in a PEM Encoded (.pem) format. This should be used in with <code>SslMode=VerifyCA</code> or <code>SslMode=VerifyFull</code> to enable verification of a CA certificate that is not trusted by the Operating System's certificate store.</td>
106+
<td>This option specifies the path to a CA certificate file in a PEM Encoded (.pem) format. This should be used in with <code>SslMode=VerifyCA</code> or <code>SslMode=VerifyFull</code> to enable verification of a CA certificate that is not trusted by the Operating Systems certificate store.</td>
107107
</tr>
108108
<tr>
109109
<td>Certificate Store Location, CertificateStoreLocation</td>

docs/content/tutorials/migrating-from-connector-net.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ MySqlConnector has some different default connection string options:
6161
</tr>
6262
</table>
6363

64+
Connector/NET uses `CertificateFile` to specify the client’s private key, unless `SslCert` and `SslKey` are specified, in which case
65+
it is used to specify the server’s CA certificate file; `SslCa` is just an alias for this option. MySqlConnector always uses `CertificateFile`
66+
for the client’s private key (in PFX format); `SslCa` (aka `CACertificateFile`) is a separate option to specify the server’s CA certificate.
67+
6468
Some connection string options that are supported in Connector/NET are not supported in MySqlConnector. For a full list of options that are
6569
supported in MySqlConnector, see the [Connection Options](connection-options).
6670

src/MySqlConnector/Core/ConnectionSettings.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public ConnectionSettings(MySqlConnectionStringBuilder csb)
4646
SslMode = csb.SslMode;
4747
CertificateFile = csb.CertificateFile;
4848
CertificatePassword = csb.CertificatePassword;
49-
CACertificateFile = csb.CACertificateFile;
49+
CACertificateFile = csb.SslCa;
5050
CertificateStoreLocation = csb.CertificateStoreLocation;
5151
CertificateThumbprint = csb.CertificateThumbprint;
5252

src/MySqlConnector/MySql.Data.MySqlClient/MySqlConnectionStringBuilder.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,17 @@ public string CertificatePassword
8585
set => MySqlConnectionStringOption.CertificatePassword.SetValue(this, value);
8686
}
8787

88+
[Obsolete("Use SslCa instead.")]
8889
public string CACertificateFile
8990
{
90-
get => MySqlConnectionStringOption.CACertificateFile.GetValue(this);
91-
set => MySqlConnectionStringOption.CACertificateFile.SetValue(this, value);
91+
get => MySqlConnectionStringOption.SslCa.GetValue(this);
92+
set => MySqlConnectionStringOption.SslCa.SetValue(this, value);
93+
}
94+
95+
public string SslCa
96+
{
97+
get => MySqlConnectionStringOption.SslCa.GetValue(this);
98+
set => MySqlConnectionStringOption.SslCa.SetValue(this, value);
9299
}
93100

94101
public MySqlCertificateStoreLocation CertificateStoreLocation
@@ -352,7 +359,7 @@ internal abstract class MySqlConnectionStringOption
352359
public static readonly MySqlConnectionStringOption<string> CertificatePassword;
353360
public static readonly MySqlConnectionStringOption<MySqlCertificateStoreLocation> CertificateStoreLocation;
354361
public static readonly MySqlConnectionStringOption<string> CertificateThumbprint;
355-
public static readonly MySqlConnectionStringOption<string> CACertificateFile;
362+
public static readonly MySqlConnectionStringOption<string> SslCa;
356363

357364
// Connection Pooling Options
358365
public static readonly MySqlConnectionStringOption<bool> Pooling;
@@ -461,8 +468,8 @@ static MySqlConnectionStringOption()
461468
keys: new[] { "CertificatePassword", "Certificate Password" },
462469
defaultValue: null));
463470

464-
AddOption(CACertificateFile = new MySqlConnectionStringOption<string>(
465-
keys: new[] { "CACertificateFile", "CA Certificate File" },
471+
AddOption(SslCa = new MySqlConnectionStringOption<string>(
472+
keys: new[] { "CACertificateFile", "CA Certificate File", "SslCa", "Ssl-Ca" },
466473
defaultValue: null));
467474

468475
AddOption(CertificateStoreLocation = new MySqlConnectionStringOption<MySqlCertificateStoreLocation>(

tests/MySqlConnector.Tests/MySqlConnectionStringBuilderTests.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ public void Defaults()
4040
Assert.False(csb.ForceSynchronous);
4141
Assert.Equal(MySqlGuidFormat.Default, csb.GuidFormat);
4242
Assert.False(csb.IgnoreCommandTransaction);
43-
Assert.Null(csb.CACertificateFile);
4443
Assert.Equal(MySqlLoadBalance.RoundRobin, csb.LoadBalance);
4544
#endif
4645
Assert.True(csb.IgnorePrepare);
@@ -59,6 +58,7 @@ public void Defaults()
5958
Assert.Null(csb.ServerRsaPublicKeyFile);
6059
Assert.Null(csb.ServerSPN);
6160
#endif
61+
Assert.Null(csb.SslCa);
6262
Assert.Equal(MySqlSslMode.Preferred, csb.SslMode);
6363
Assert.True(csb.TreatTinyAsBoolean);
6464
Assert.False(csb.UseCompression);
@@ -100,7 +100,6 @@ public void ParseConnectionString()
100100
"connectionidletimeout=30;" +
101101
"forcesynchronous=true;" +
102102
"ignore command transaction=true;" +
103-
"ca certificate file=ca.pem;" +
104103
"server rsa public key file=rsa.pem;" +
105104
"load balance=random;" +
106105
"guidformat=timeswapbinary16;" +
@@ -120,6 +119,7 @@ public void ParseConnectionString()
120119
"protocol=pipe;" +
121120
"pwd=Pass1234;" +
122121
"Treat Tiny As Boolean=false;" +
122+
"ssl-ca=ca.pem;" +
123123
"ssl mode=verifyca;" +
124124
"Uid=username;" +
125125
"useaffectedrows=true"
@@ -128,7 +128,10 @@ public void ParseConnectionString()
128128
Assert.True(csb.AllowUserVariables);
129129
Assert.True(csb.AllowZeroDateTime);
130130
Assert.False(csb.AutoEnlist);
131+
#if !BASELINE
132+
// Connector/NET treats "CertificateFile" (client certificate) and "SslCa" (server CA) as aliases
131133
Assert.Equal("file.pfx", csb.CertificateFile);
134+
#endif
132135
Assert.Equal("Pass1234", csb.CertificatePassword);
133136
Assert.Equal(MySqlCertificateStoreLocation.CurrentUser, csb.CertificateStoreLocation);
134137
Assert.Equal("thumbprint123", csb.CertificateThumbprint);
@@ -149,7 +152,6 @@ public void ParseConnectionString()
149152
Assert.Equal(30u, csb.ConnectionIdleTimeout);
150153
Assert.True(csb.ForceSynchronous);
151154
Assert.True(csb.IgnoreCommandTransaction);
152-
Assert.Equal("ca.pem", csb.CACertificateFile);
153155
Assert.Equal("rsa.pem", csb.ServerRsaPublicKeyFile);
154156
Assert.Equal(MySqlLoadBalance.Random, csb.LoadBalance);
155157
Assert.Equal(MySqlGuidFormat.TimeSwapBinary16, csb.GuidFormat);
@@ -169,6 +171,7 @@ public void ParseConnectionString()
169171
Assert.Equal(1234u, csb.Port);
170172
Assert.Equal("db-server", csb.Server);
171173
Assert.False(csb.TreatTinyAsBoolean);
174+
Assert.Equal("ca.pem", csb.SslCa);
172175
Assert.Equal(MySqlSslMode.VerifyCA, csb.SslMode);
173176
Assert.True(csb.UseAffectedRows);
174177
Assert.True(csb.UseCompression);

tests/MySqlConnector.Tests/MySqlConnector.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
</ItemGroup>
3232

3333
<ItemGroup Condition=" '$(Configuration)' == 'Baseline' ">
34-
<PackageReference Include="MySql.Data" Version="8.0.13" />
34+
<PackageReference Include="MySql.Data" Version="8.0.16" />
3535
<Compile Remove="ByteBufferWriterTests.cs;CachedProcedureTests.cs;ConnectionTests.cs;FakeMySqlServer.cs;FakeMySqlServerConnection.cs;LoadBalancerTests.cs;MySqlExceptionTests.cs;NormalizeTests.cs;ServerVersionTests.cs;StatementPreparerTests.cs;TypeMapperTests.cs;UtilityTests.cs" />
3636
</ItemGroup>
3737

tests/SideBySide/SideBySide.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
</ItemGroup>
4040

4141
<ItemGroup Condition=" '$(Configuration)' == 'Baseline' ">
42-
<PackageReference Include="MySql.Data" Version="8.0.15" />
42+
<PackageReference Include="MySql.Data" Version="8.0.16" />
4343
</ItemGroup>
4444

4545
<ItemGroup Condition=" '$(TargetFramework)' == 'netcoreapp1.1.2' ">

tests/SideBySide/SslTests.cs

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,7 @@ public async Task ConnectSslClientCertificate(string certFile, string certFilePa
5454
if (caCertFile != null)
5555
{
5656
csb.SslMode = MySqlSslMode.VerifyCA;
57-
#if !BASELINE
58-
csb.CACertificateFile = Path.Combine(AppConfig.CertsPath, caCertFile);
59-
#endif
57+
csb.SslCa = Path.Combine(AppConfig.CertsPath, caCertFile);
6058
}
6159
using (var connection = new MySqlConnection(csb.ConnectionString))
6260
{
@@ -132,24 +130,22 @@ public async Task ConnectSslBadClientCertificate()
132130
csb.CertificatePassword = "";
133131
using (var connection = new MySqlConnection(csb.ConnectionString))
134132
{
135-
#if BASELINE
136-
var exType = typeof(IOException);
137-
#else
138-
var exType = typeof(MySqlException);
139-
#endif
140-
await Assert.ThrowsAsync(exType, async () => await connection.OpenAsync());
133+
await Assert.ThrowsAsync<MySqlException>(async () => await connection.OpenAsync());
141134
}
142135
}
143136

144-
[SkippableFact(ServerFeatures.KnownCertificateAuthority, ConfigSettings.RequiresSsl, Baseline = "MySql.Data does not support CACertificateFile")]
137+
[SkippableFact(ServerFeatures.KnownCertificateAuthority, ConfigSettings.RequiresSsl)]
145138
public async Task ConnectSslBadCaCertificate()
146139
{
147140
var csb = AppConfig.CreateConnectionStringBuilder();
148-
csb.CertificateFile = Path.Combine(AppConfig.CertsPath, "ssl-client.pfx");
149-
csb.SslMode = MySqlSslMode.VerifyCA;
150141
#if !BASELINE
151-
csb.CACertificateFile = Path.Combine(AppConfig.CertsPath, "non-ca-client-cert.pem");
142+
csb.CertificateFile = Path.Combine(AppConfig.CertsPath, "ssl-client.pfx");
143+
#else
144+
csb.SslCert = Path.Combine(AppConfig.CertsPath, "ssl-client-cert.pem");
145+
csb.SslKey = Path.Combine(AppConfig.CertsPath, "ssl-client-key.pem");
152146
#endif
147+
csb.SslMode = MySqlSslMode.VerifyCA;
148+
csb.SslCa = Path.Combine(AppConfig.CertsPath, "non-ca-client-cert.pem");
153149
using (var connection = new MySqlConnection(csb.ConnectionString))
154150
{
155151
await Assert.ThrowsAsync<MySqlException>(async () => await connection.OpenAsync());

0 commit comments

Comments
 (0)