Skip to content
This repository was archived by the owner on Jul 9, 2023. It is now read-only.

Commit 3042d21

Browse files
committed
Move certificate handler
1 parent 7cf9be8 commit 3042d21

File tree

4 files changed

+123
-110
lines changed

4 files changed

+123
-110
lines changed
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
using System;
2+
using System.Linq;
3+
using System.Net.Security;
4+
using System.Security.Cryptography.X509Certificates;
5+
using System.Threading.Tasks;
6+
using Titanium.Web.Proxy.EventArguments;
7+
8+
namespace Titanium.Web.Proxy
9+
{
10+
public partial class ProxyServer
11+
{
12+
/// <summary>
13+
/// Call back to override server certificate validation
14+
/// </summary>
15+
/// <param name="sender"></param>
16+
/// <param name="certificate"></param>
17+
/// <param name="chain"></param>
18+
/// <param name="sslPolicyErrors"></param>
19+
/// <returns></returns>
20+
internal static bool ValidateServerCertificate(
21+
object sender,
22+
X509Certificate certificate,
23+
X509Chain chain,
24+
SslPolicyErrors sslPolicyErrors)
25+
{
26+
//if user callback is registered then do it
27+
if (ServerCertificateValidationCallback != null)
28+
{
29+
var args = new CertificateValidationEventArgs();
30+
31+
args.Certificate = certificate;
32+
args.Chain = chain;
33+
args.SslPolicyErrors = sslPolicyErrors;
34+
35+
36+
Delegate[] invocationList = ServerCertificateValidationCallback.GetInvocationList();
37+
Task[] handlerTasks = new Task[invocationList.Length];
38+
39+
for (int i = 0; i < invocationList.Length; i++)
40+
{
41+
handlerTasks[i] = ((Func<object, CertificateValidationEventArgs, Task>)invocationList[i])(null, args);
42+
}
43+
44+
Task.WhenAll(handlerTasks).Wait();
45+
46+
return args.IsValid;
47+
}
48+
49+
if (sslPolicyErrors == SslPolicyErrors.None)
50+
return true;
51+
52+
//By default
53+
//do not allow this client to communicate with unauthenticated servers.
54+
return false;
55+
}
56+
57+
/// <summary>
58+
/// Call back to select client certificate used for mutual authentication
59+
/// </summary>
60+
/// <param name="sender"></param>
61+
/// <param name="certificate"></param>
62+
/// <param name="chain"></param>
63+
/// <param name="sslPolicyErrors"></param>
64+
/// <returns></returns>
65+
internal static X509Certificate SelectClientCertificate(
66+
object sender,
67+
string targetHost,
68+
X509CertificateCollection localCertificates,
69+
X509Certificate remoteCertificate,
70+
string[] acceptableIssuers)
71+
{
72+
X509Certificate clientCertificate = null;
73+
var customSslStream = sender as SslStream;
74+
75+
if (acceptableIssuers != null &&
76+
acceptableIssuers.Length > 0 &&
77+
localCertificates != null &&
78+
localCertificates.Count > 0)
79+
{
80+
// Use the first certificate that is from an acceptable issuer.
81+
foreach (X509Certificate certificate in localCertificates)
82+
{
83+
string issuer = certificate.Issuer;
84+
if (Array.IndexOf(acceptableIssuers, issuer) != -1)
85+
clientCertificate = certificate;
86+
}
87+
}
88+
89+
if (localCertificates != null &&
90+
localCertificates.Count > 0)
91+
clientCertificate = localCertificates[0];
92+
93+
//If user call back is registered
94+
if (ClientCertificateSelectionCallback != null)
95+
{
96+
var args = new CertificateSelectionEventArgs();
97+
98+
args.targetHost = targetHost;
99+
args.localCertificates = localCertificates;
100+
args.remoteCertificate = remoteCertificate;
101+
args.acceptableIssuers = acceptableIssuers;
102+
args.clientCertificate = clientCertificate;
103+
104+
Delegate[] invocationList = ClientCertificateSelectionCallback.GetInvocationList();
105+
Task[] handlerTasks = new Task[invocationList.Length];
106+
107+
for (int i = 0; i < invocationList.Length; i++)
108+
{
109+
handlerTasks[i] = ((Func<object, CertificateSelectionEventArgs, Task>)invocationList[i])(null, args);
110+
}
111+
112+
Task.WhenAll(handlerTasks).Wait();
113+
114+
return args.clientCertificate;
115+
}
116+
117+
return clientCertificate;
118+
119+
}
120+
}
121+
}

Titanium.Web.Proxy/RequestHandler.cs

Lines changed: 0 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -482,114 +482,5 @@ private static async Task SendClientRequestBody(SessionEventArgs args)
482482
}
483483
}
484484

485-
/// <summary>
486-
/// Call back to override server certificate validation
487-
/// </summary>
488-
/// <param name="sender"></param>
489-
/// <param name="certificate"></param>
490-
/// <param name="chain"></param>
491-
/// <param name="sslPolicyErrors"></param>
492-
/// <returns></returns>
493-
internal static bool ValidateServerCertificate(
494-
object sender,
495-
X509Certificate certificate,
496-
X509Chain chain,
497-
SslPolicyErrors sslPolicyErrors)
498-
{
499-
//if user callback is registered then do it
500-
if (ServerCertificateValidationCallback != null)
501-
{
502-
var args = new CertificateValidationEventArgs();
503-
504-
args.Certificate = certificate;
505-
args.Chain = chain;
506-
args.SslPolicyErrors = sslPolicyErrors;
507-
508-
509-
Delegate[] invocationList = ServerCertificateValidationCallback.GetInvocationList();
510-
Task[] handlerTasks = new Task[invocationList.Length];
511-
512-
for (int i = 0; i < invocationList.Length; i++)
513-
{
514-
handlerTasks[i] = ((Func<object, CertificateValidationEventArgs, Task>)invocationList[i])(null, args);
515-
}
516-
517-
Task.WhenAll(handlerTasks).Wait();
518-
519-
return args.IsValid;
520-
}
521-
522-
if (sslPolicyErrors == SslPolicyErrors.None)
523-
return true;
524-
525-
//By default
526-
//do not allow this client to communicate with unauthenticated servers.
527-
return false;
528-
}
529-
530-
/// <summary>
531-
/// Call back to select client certificate used for mutual authentication
532-
/// </summary>
533-
/// <param name="sender"></param>
534-
/// <param name="certificate"></param>
535-
/// <param name="chain"></param>
536-
/// <param name="sslPolicyErrors"></param>
537-
/// <returns></returns>
538-
internal static X509Certificate SelectClientCertificate(
539-
object sender,
540-
string targetHost,
541-
X509CertificateCollection localCertificates,
542-
X509Certificate remoteCertificate,
543-
string[] acceptableIssuers)
544-
{
545-
X509Certificate clientCertificate = null;
546-
var customSslStream = sender as SslStream;
547-
548-
if (acceptableIssuers != null &&
549-
acceptableIssuers.Length > 0 &&
550-
localCertificates != null &&
551-
localCertificates.Count > 0)
552-
{
553-
// Use the first certificate that is from an acceptable issuer.
554-
foreach (X509Certificate certificate in localCertificates)
555-
{
556-
string issuer = certificate.Issuer;
557-
if (Array.IndexOf(acceptableIssuers, issuer) != -1)
558-
clientCertificate = certificate;
559-
}
560-
}
561-
562-
if (localCertificates != null &&
563-
localCertificates.Count > 0)
564-
clientCertificate = localCertificates[0];
565-
566-
//If user call back is registered
567-
if (ClientCertificateSelectionCallback != null)
568-
{
569-
var args = new CertificateSelectionEventArgs();
570-
571-
args.targetHost = targetHost;
572-
args.localCertificates = localCertificates;
573-
args.remoteCertificate = remoteCertificate;
574-
args.acceptableIssuers = acceptableIssuers;
575-
args.clientCertificate = clientCertificate;
576-
577-
Delegate[] invocationList = ClientCertificateSelectionCallback.GetInvocationList();
578-
Task[] handlerTasks = new Task[invocationList.Length];
579-
580-
for (int i = 0; i < invocationList.Length; i++)
581-
{
582-
handlerTasks[i] = ((Func<object, CertificateSelectionEventArgs, Task>)invocationList[i])(null, args);
583-
}
584-
585-
Task.WhenAll(handlerTasks).Wait();
586-
587-
return args.clientCertificate;
588-
}
589-
590-
return clientCertificate;
591-
592-
}
593-
594485
}
595486
}

Titanium.Web.Proxy/ResponseHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ await WriteResponseStatus(args.WebSession.Response.HttpVersion, "417",
5757
await args.ProxyClient.ClientStreamWriter.WriteLineAsync();
5858
}
5959

60-
//Write back response status
60+
//Write back response status to client
6161
await WriteResponseStatus(args.WebSession.Response.HttpVersion, args.WebSession.Response.ResponseStatusCode,
6262
args.WebSession.Response.ResponseStatusDescription, args.ProxyClient.ClientStreamWriter);
6363

Titanium.Web.Proxy/Titanium.Web.Proxy.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
<Reference Include="System.Xml" />
5050
</ItemGroup>
5151
<ItemGroup>
52+
<Compile Include="CertificateHandler.cs" />
5253
<Compile Include="Compression\CompressionFactory.cs" />
5354
<Compile Include="Compression\DeflateCompression.cs" />
5455
<Compile Include="Compression\GZipCompression.cs" />

0 commit comments

Comments
 (0)