Skip to content

Commit 2119acc

Browse files
committed
CSHARP-3031:Fix AUTH testing so that it uses x.509 certificate authentication
1 parent 21aae35 commit 2119acc

File tree

9 files changed

+321
-111
lines changed

9 files changed

+321
-111
lines changed

build.cake

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,16 @@ Task("Test")
125125
{
126126
Console.WriteLine($"TEST_WITH_DEFAULT_GUID_REPRESENTATION={testWithDefaultGuidRepresentation}");
127127
}
128+
var mongoX509ClientCertificatePath = Environment.GetEnvironmentVariable("MONGO_X509_CLIENT_CERTIFICATE_PATH");
129+
if (mongoX509ClientCertificatePath != null)
130+
{
131+
Console.WriteLine($"MONGO_X509_CLIENT_CERTIFICATE_PATH={mongoX509ClientCertificatePath}");
132+
}
133+
var mongoX509ClientCertificatePassword = Environment.GetEnvironmentVariable("MONGO_X509_CLIENT_CERTIFICATE_PASSWORD");
134+
if (mongoX509ClientCertificatePassword != null)
135+
{
136+
Console.WriteLine($"MONGO_X509_CLIENT_CERTIFICATE_PASSWORD={mongoX509ClientCertificatePassword}");
137+
}
128138

129139
var settings = new DotNetCoreTestSettings
130140
{

build.ps1

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,11 @@ if ($Experimental) { $cakeArguments += "-experimental" }
275275
if ($Mono) { $cakeArguments += "-mono" }
276276
$cakeArguments += $ScriptArgs
277277

278+
# Verify that the environment variables we care about have been passed in from bash
279+
Write-Host "Verifying environment variables values..."
280+
Write-Host "MONGO_X509_CLIENT_CERTIFICATE_PATH = " $env:MONGO_X509_CLIENT_CERTIFICATE_PATH
281+
Write-Host "MONGO_X509_CLIENT_CERTIFICATE_PASSWORD = " $env:MONGO_X509_CLIENT_CERTIFICATE_PASSWORD
282+
278283
# Start Cake
279284
Write-Host "Running build script..."
280285
echo $CAKE_EXE $cakeArguments
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#!/usr/bin/env bash
2+
3+
set -o xtrace # Write all commands first to stderr
4+
set -o errexit # Exit the script with an error if any of the commands fail
5+
6+
# Environment variables used as input:
7+
# CLIENT_PEM Path to mongo -orchestration's client.pem: must be set.
8+
# MONGO_X509_CLIENT_P12 Filename for client certificate in p12 format
9+
#
10+
# Environment variables produced as output:
11+
# MONGODB_X509_CLIENT_P12_PATH Absolute path to client certificate in p12 format
12+
# MONGO_X509_CLIENT_CERTIFICATE_PASSWORD Password for client certificate
13+
14+
15+
CLIENT_PEM=${CLIENT_PEM:-nil}
16+
MONGO_X509_CLIENT_P12=${MONGO_X509_CLIENT_P12:-client.p12}
17+
MONGO_X509_CLIENT_CERTIFICATE_PASSWORD=${MONGO_X509_CLIENT_CERTIFICATE_PASSWORD:-Picard-Alpha-Alpha-3-0-5}
18+
19+
if [[ "$CLIENT_PEM" == "nil" ]]; then
20+
exit 1
21+
fi
22+
23+
openssl pkcs12 -export -in "${CLIENT_PEM}" \
24+
-out "${MONGO_X509_CLIENT_P12}" \
25+
-name "Drivers Client Certificate" \
26+
-password "pass:${MONGO_X509_CLIENT_CERTIFICATE_PASSWORD}"
27+
28+
MONGO_X509_CLIENT_CERTIFICATE_PATH=$(realpath "${MONGO_X509_CLIENT_P12}")
29+
30+
if [[ "$OS" =~ Windows|windows ]]; then
31+
MONGO_X509_CLIENT_CERTIFICATE_PATH=$(cygpath -w "${MONGO_X509_CLIENT_CERTIFICATE_PATH}")
32+
fi
33+
34+
export MONGO_X509_CLIENT_CERTIFICATE_PATH
35+
export MONGO_X509_CLIENT_CERTIFICATE_PASSWORD

evergreen/evergreen.yml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,14 @@ functions:
240240
export FLE_AWS_SECRET_ACCESS_KEY=${FLE_AWS_SECRET_ACCESS_KEY}
241241
${PREPARE_SHELL}
242242
SSL=${SSL} evergreen/add-certs-if-needed.sh
243-
AUTH=${AUTH} SSL=${SSL} MONGODB_URI="${MONGODB_URI}" TOPOLOGY=${TOPOLOGY} OS=${OS} COMPRESSOR=${COMPRESSOR} evergreen/run-tests.sh
243+
AUTH=${AUTH} \
244+
SSL=${SSL} \
245+
MONGODB_URI="${MONGODB_URI}" \
246+
TOPOLOGY=${TOPOLOGY} \
247+
OS=${OS} \
248+
COMPRESSOR=${COMPRESSOR} \
249+
CLIENT_PEM=${DRIVERS_TOOLS}/.evergreen/x509gen/client.pem \
250+
evergreen/run-tests.sh
244251
echo "Skipping certificate removal..."
245252
246253
run-atlas-connectivity-tests:

evergreen/run-tests.sh

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,27 @@
33
set -o xtrace # Write all commands first to stderr
44
set -o errexit # Exit the script with error if any of the commands fail
55

6-
# Supported/used environment variables:
7-
# AUTH Set to enable authentication. Values are: "auth" / "noauth" (default)
8-
# SSL Set to enable SSL. Values are "ssl" / "nossl" (default)
9-
# MONGODB_URI Set the suggested connection MONGODB_URI (including credentials and topology info)
10-
# TOPOLOGY Allows you to modify variables and the MONGODB_URI based on test topology
11-
# Supported values: "server", "replica_set", "sharded_cluster"
12-
# OCSP_TLS_SHOULD_SUCCEED Set to test OCSP. Values are true/false/nil
6+
# Environment variables used as input:
7+
# AUTH Set to enable authentication. Values are: "auth" / "noauth" (default)
8+
# SSL Set to enable SSL. Values are "ssl" / "nossl" (default)
9+
# MONGODB_URI Set the suggested connection MONGODB_URI (including credentials and topology info)
10+
# TOPOLOGY Allows you to modify variables and the MONGODB_URI based on test topology
11+
# Supported values: "server", "replica_set", "sharded_cluster"
12+
# OCSP_TLS_SHOULD_SUCCEED Set to test OCSP. Values are true/false/nil
13+
# MONGODB_X509_CLIENT_P12_PATH Absolute path to client certificate in p12 format
14+
# MONGO_X509_CLIENT_CERTIFICATE_PASSWORD password for client certificate
15+
#
16+
# Environment variables produced as output:
17+
# MONGODB_X509_CLIENT_P12_PATH Absolute path to client certificate in p12 format
18+
# MONGO_X509_CLIENT_CERTIFICATE_PASSWORD Password for client certificate
1319

1420
AUTH=${AUTH:-noauth}
1521
SSL=${SSL:-nossl}
1622
MONGODB_URI=${MONGODB_URI:-}
1723
TOPOLOGY=${TOPOLOGY:-server}
1824
COMPRESSOR=${COMPRESSOR:-none}
1925
OCSP_TLS_SHOULD_SUCCEED=${OCSP_TLS_SHOULD_SUCCEED:-nil}
26+
CLIENT_PEM=${CLIENT_PEM:-nil}
2027

2128
############################################
2229
# Functions #
@@ -97,4 +104,16 @@ fi
97104
for var in TMP TEMP NUGET_PACKAGES NUGET_HTTP_CACHE_PATH APPDATA; do
98105
export $var=z:\\data\\tmp;
99106
done
100-
powershell.exe .\\build.ps1 -target ${TARGET}
107+
108+
if [[ "$CLIENT_PEM" != "nil" ]]; then
109+
CLIENT_PEM=${CLIENT_PEM} source evergreen/convert-client-cert-to-pkcs12.sh
110+
fi
111+
112+
if [[ -z "$MONGO_X509_CLIENT_CERTIFICATE_PATH" && -z "$MONGO_X509_CLIENT_CERTIFICATE_PASSWORD" ]]; then
113+
powershell.exe '.\build.ps1 -target' $TARGET
114+
else
115+
powershell.exe \
116+
'$env:MONGO_X509_CLIENT_CERTIFICATE_PATH="'${MONGO_X509_CLIENT_CERTIFICATE_PATH}'";'\
117+
'$env:MONGO_X509_CLIENT_CERTIFICATE_PASSWORD="'${MONGO_X509_CLIENT_CERTIFICATE_PASSWORD}'";'\
118+
'.\build.ps1 -target' $TARGET
119+
fi

tests/MongoDB.Driver.Core.TestHelpers/CoreTestConfiguration.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
using MongoDB.Bson;
2525
using MongoDB.Bson.Serialization.Serializers;
2626
using MongoDB.Driver.Core;
27+
using MongoDB.Driver.Core.Authentication;
2728
using MongoDB.Driver.Core.Bindings;
2829
using MongoDB.Driver.Core.Clusters;
2930
using MongoDB.Driver.Core.Clusters.ServerSelectors;
@@ -107,14 +108,17 @@ public static ClusterBuilder ConfigureCluster(ClusterBuilder builder)
107108
.ConfigureWithConnectionString(__connectionString.Value)
108109
.ConfigureCluster(c => c.With(serverSelectionTimeout: TimeSpan.FromMilliseconds(int.Parse(serverSelectionTimeoutString))));
109110

110-
if (__connectionString.Value.Tls.HasValue && __connectionString.Value.Tls.Value)
111+
if (__connectionString.Value.Tls.HasValue &&
112+
__connectionString.Value.Tls.Value &&
113+
__connectionString.Value.AuthMechanism != null &&
114+
__connectionString.Value.AuthMechanism == MongoDBX509Authenticator.MechanismName)
111115
{
112-
var certificateFilename = Environment.GetEnvironmentVariable("MONGO_SSL_CERT_FILE");
116+
var certificateFilename = Environment.GetEnvironmentVariable("MONGO_X509_CLIENT_CERTIFICATE_PATH");
113117
if (certificateFilename != null)
114118
{
115119
builder.ConfigureSsl(ssl =>
116120
{
117-
var password = Environment.GetEnvironmentVariable("MONGO_SSL_CERT_PASS");
121+
var password = Environment.GetEnvironmentVariable("MONGO_X509_CLIENT_CERTIFICATE_PASSWORD");
118122
X509Certificate cert;
119123
if (password == null)
120124
{

tests/MongoDB.Driver.Core.TestHelpers/XunitExtensions/RequireServer.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,18 @@ public RequireServer StorageEngines(params string[] storageEngines)
162162
throw new SkipException($"Test skipped because storage engine is \"{actualStorageEngine}\" and not one of ({storageEnginesString}).");
163163
}
164164

165+
public RequireServer Tls(bool required = true)
166+
{
167+
var usingTls = CoreTestConfiguration.ConnectionString.Tls;
168+
if (usingTls == required)
169+
{
170+
return this;
171+
}
172+
throw new SkipException(
173+
$"Test skipped because the connection string specifies TLS={usingTls} " +
174+
$"and this test requires TLS={required}.");
175+
}
176+
165177
public RequireServer VersionGreaterThanOrEqualTo(SemanticVersion version)
166178
{
167179
var actualVersion = CoreTestConfiguration.ServerVersion;

tests/MongoDB.Driver.TestHelpers/DriverTestConfiguration.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ public static DisposableMongoClient CreateDisposableClient(
120120
useMultipleShardRouters = false;
121121
}
122122

123-
var connectionString = useMultipleShardRouters
123+
var connectionString = useMultipleShardRouters
124124
? CoreTestConfiguration.ConnectionStringWithMultipleShardRouters.ToString()
125125
: CoreTestConfiguration.ConnectionString.ToString();
126126
var clientSettings = MongoClientSettings.FromUrl(new MongoUrl(connectionString));
@@ -134,6 +134,11 @@ public static DisposableMongoClient CreateDisposableClient(EventCapturer capture
134134
return CreateDisposableClient((ClusterBuilder c) => c.Subscribe(capturer));
135135
}
136136

137+
public static DisposableMongoClient CreateDisposableclient(MongoClientSettings settings)
138+
{
139+
return new DisposableMongoClient(new MongoClient(settings));
140+
}
141+
137142
public static MongoClientSettings GetClientSettings()
138143
{
139144
var connectionString = CoreTestConfiguration.ConnectionString.ToString();

0 commit comments

Comments
 (0)