Skip to content

Commit 423fdd6

Browse files
Make it possible to provide a custom remote cert validator and local cert selector
Manually integrates #12
1 parent d8daaa2 commit 423fdd6

File tree

2 files changed

+22
-2
lines changed

2 files changed

+22
-2
lines changed

projects/client/RabbitMQ.Client/src/client/api/SslHelper.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,15 @@ private bool CertificateValidationCallback(object sender,
9090
public static Stream TcpUpgrade(Stream tcpStream, SslOption sslOption, int timeout)
9191
{
9292
SslHelper helper = new SslHelper(sslOption);
93+
94+
RemoteCertificateValidationCallback remoteCertValidator =
95+
sslOption.CertificateValidationCallback ?? new RemoteCertificateValidationCallback(helper.CertificateValidationCallback);
96+
LocalCertificateSelectionCallback localCertSelector =
97+
sslOption.CertificateSelectionCallback ?? new LocalCertificateSelectionCallback(helper.CertificateSelectionCallback);
98+
9399
SslStream sslStream = new SslStream(tcpStream, false,
94-
new RemoteCertificateValidationCallback(helper.CertificateValidationCallback),
95-
new LocalCertificateSelectionCallback(helper.CertificateSelectionCallback));
100+
remoteCertValidator,
101+
localCertSelector);
96102

97103
sslStream.AuthenticateAsClient(sslOption.ServerName,
98104
sslOption.Certs,

projects/client/RabbitMQ.Client/src/client/api/SslOption.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,18 @@ public SslPolicyErrors AcceptablePolicyErrors
136136
set { m_acceptablePolicyErrors = value; }
137137
}
138138

139+
/// <summary>
140+
/// An optional client specified SSL certificate validation callback. If this is not specified,
141+
/// the default callback will be used in conjunction with the AcceptablePolicyErrors property to
142+
/// determine if the remote server certificate is valid.
143+
/// </summary>
144+
public RemoteCertificateValidationCallback CertificateValidationCallback { get; set; }
145+
146+
/// <summary>
147+
/// An optional client specified SSL certificate selection callback. If this is not specified,
148+
/// the first valid certificate found will be used.
149+
/// </summary>
150+
public LocalCertificateSelectionCallback CertificateSelectionCallback { get; set; }
139151

140152
///<summary>Construct an SslOption specifying both the server cannonical name
141153
///and the client's certificate path.
@@ -145,6 +157,8 @@ public SslOption(string serverName, string certPath, bool enabled)
145157
m_serverName= serverName;
146158
m_certPath = certPath;
147159
m_enabled = enabled;
160+
CertificateValidationCallback = null;
161+
CertificateSelectionCallback = null;
148162
}
149163

150164
///<summary>Construct an SslOption with just the server cannonical name.

0 commit comments

Comments
 (0)