@@ -203,7 +203,7 @@ public class CertPemManager
203203 /// <summary>
204204 /// Get certificate in PEM format from a server with CA pinning validation
205205 /// </summary>
206- public async Task < ( string ? , string ? ) > GetCertPemAsync ( string target , string serverName , int timeout = 4 )
206+ public async Task < ( string ? , string ? ) > GetCertPemAsync ( string target , string serverName , int timeout = 4 , bool allowInsecure = false )
207207 {
208208 try
209209 {
@@ -215,12 +215,14 @@ public class CertPemManager
215215 using var client = new TcpClient ( ) ;
216216 await client . ConnectAsync ( domain , port > 0 ? port : 443 , cts . Token ) ;
217217
218- await using var ssl = new SslStream ( client . GetStream ( ) , false , ValidateServerCertificate ) ;
218+ var callback = new RemoteCertificateValidationCallback ( ( sender , certificate , chain , sslPolicyErrors ) =>
219+ ValidateServerCertificate ( sender , certificate , chain , sslPolicyErrors , allowInsecure ) ) ;
220+ await using var ssl = new SslStream ( client . GetStream ( ) , false , callback ) ;
219221
220222 var sslOptions = new SslClientAuthenticationOptions
221223 {
222224 TargetHost = serverName ,
223- RemoteCertificateValidationCallback = ValidateServerCertificate
225+ RemoteCertificateValidationCallback = callback
224226 } ;
225227
226228 await ssl . AuthenticateAsClientAsync ( sslOptions , cts . Token ) ;
@@ -249,7 +251,7 @@ public class CertPemManager
249251 /// <summary>
250252 /// Get certificate chain in PEM format from a server with CA pinning validation
251253 /// </summary>
252- public async Task < ( List < string > , string ? ) > GetCertChainPemAsync ( string target , string serverName , int timeout = 4 )
254+ public async Task < ( List < string > , string ? ) > GetCertChainPemAsync ( string target , string serverName , int timeout = 4 , bool allowInsecure = false )
253255 {
254256 var pemList = new List < string > ( ) ;
255257 try
@@ -262,12 +264,14 @@ public class CertPemManager
262264 using var client = new TcpClient ( ) ;
263265 await client . ConnectAsync ( domain , port > 0 ? port : 443 , cts . Token ) ;
264266
265- await using var ssl = new SslStream ( client . GetStream ( ) , false , ValidateServerCertificate ) ;
267+ var callback = new RemoteCertificateValidationCallback ( ( sender , certificate , chain , sslPolicyErrors ) =>
268+ ValidateServerCertificate ( sender , certificate , chain , sslPolicyErrors , allowInsecure ) ) ;
269+ await using var ssl = new SslStream ( client . GetStream ( ) , false , callback ) ;
266270
267271 var sslOptions = new SslClientAuthenticationOptions
268272 {
269273 TargetHost = serverName ,
270- RemoteCertificateValidationCallback = ValidateServerCertificate
274+ RemoteCertificateValidationCallback = callback
271275 } ;
272276
273277 await ssl . AuthenticateAsClientAsync ( sslOptions , cts . Token ) ;
@@ -300,16 +304,23 @@ public class CertPemManager
300304 /// Validate server certificate with CA pinning
301305 /// </summary>
302306 private bool ValidateServerCertificate (
303- object sender ,
307+ object _ ,
304308 X509Certificate ? certificate ,
305309 X509Chain ? chain ,
306- SslPolicyErrors sslPolicyErrors )
310+ SslPolicyErrors sslPolicyErrors ,
311+ bool allowInsecure )
307312 {
308313 if ( certificate == null )
309314 {
310315 return false ;
311316 }
312317
318+ // In insecure mode, accept any certificate so self-signed certs can be fetched.
319+ if ( allowInsecure )
320+ {
321+ return true ;
322+ }
323+
313324 // Check certificate name mismatch
314325 if ( sslPolicyErrors . HasFlag ( SslPolicyErrors . RemoteCertificateNameMismatch ) )
315326 {
0 commit comments