3 using System.Net.Sockets;
\r
4 using System.Security.Cryptography;
\r
5 using System.Security.Cryptography.X509Certificates;
\r
7 using Mono.Security.Protocol.Tls;
\r
9 class TestSslClientStream {
\r
11 static Mono.Security.X509.PKCS12 p12;
\r
14 static void Main(string[] args)
\r
16 string host = "localhost";
\r
17 if (args.Length > 0)
\r
20 SecurityProtocolType protocol = SecurityProtocolType.Tls;
\r
21 if (args.Length > 1) {
\r
22 switch (args [1].ToUpper ()) {
\r
24 protocol = SecurityProtocolType.Ssl3;
\r
29 X509CertificateCollection certificates = null;
\r
30 if (args.Length > 2) {
\r
31 string password = null;
\r
32 if (args.Length > 3)
\r
33 password = args [3];
\r
35 p12 = Mono.Security.X509.PKCS12.LoadFromFile(args [2], password);
\r
37 certificates = new X509CertificateCollection ();
\r
38 foreach (Mono.Security.X509.X509Certificate cert in p12.Certificates) {
\r
39 certificates.Add(new X509Certificate(cert.RawData));
\r
43 TcpClient client = new TcpClient ();
\r
44 client.Connect (host, 4433);
\r
46 SslClientStream ssl = new SslClientStream (client.GetStream(), host, false, protocol, certificates);
\r
47 ssl.ServerCertValidationDelegate += new CertificateValidationCallback (CertificateValidation);
\r
48 ssl.ClientCertSelectionDelegate += new CertificateSelectionCallback (ClientCertificateSelection);
\r
49 ssl.PrivateKeyCertSelectionDelegate += new PrivateKeySelectionCallback (PrivateKeySelection);
\r
51 StreamWriter sw = new StreamWriter (ssl, System.Text.Encoding.ASCII);
52 sw.WriteLine ("GET /clientcert.aspx{0}", Environment.NewLine);
55 StreamReader sr = new StreamReader (ssl);
56 Console.WriteLine (sr.ReadToEnd ());
\r
59 static bool CertificateValidation (X509Certificate certificate, int[] certificateErrors)
\r
61 Console.WriteLine ("CertificateValidation");
\r
62 Console.WriteLine (certificate.ToString (true));
\r
63 Console.WriteLine ("\tError(s)");
\r
64 foreach (int error in certificateErrors)
\r
65 Console.WriteLine ("\t\t#{0}", error);
\r
66 Console.WriteLine ();
\r
70 static X509Certificate ClientCertificateSelection (X509CertificateCollection clientCertificates,
\r
71 X509Certificate serverCertificate, string targetHost, X509CertificateCollection serverRequestedCertificates)
\r
73 Console.WriteLine ("ClientCertificateSelection");
\r
74 Console.WriteLine ("\tClient Certificates ({0})", clientCertificates.Count);
\r
76 foreach (X509Certificate client in clientCertificates)
\r
77 Console.WriteLine ("#{0} - {1}", i++, client.ToString (true));
\r
78 Console.WriteLine ("\tHost: {0}", targetHost);
\r
79 Console.Write ("SERVER {0}", serverCertificate.ToString (true));
\r
80 Console.WriteLine ();
\r
81 return clientCertificates [0];
\r
84 static AsymmetricAlgorithm PrivateKeySelection (X509Certificate certificate, string targetHost)
\r
86 Console.WriteLine ("PrivateKeySelection");
\r
87 Console.WriteLine ("\tHost: {0}", targetHost);
\r
88 Console.WriteLine (certificate.ToString (true));
\r
89 Console.WriteLine ("\tPrivateKeySelection ({0})", p12.Keys.Count);
\r
90 Console.WriteLine ();
\r
91 return (AsymmetricAlgorithm) p12.Keys [0];
\r