private SecureSocket CreateSocketByUri(Uri uri)
{
if (!String.Equals(uri.Scheme, "http", StringComparison.OrdinalIgnoreCase) &&
!String.Equals(uri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
throw new InvalidOperationException("Unrecognized scheme: " + uri.Scheme);
SecurityOptions options;
var extensions = new ExtensionType[] { ExtensionType.Renegotiation, ExtensionType.ALPN };
if (!String.Equals(uri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
{
options = new SecurityOptions(SecureProtocol.None, null, ConnectionEnd.Client);
}
else
{
options = new SecurityOptions(SecureProtocol.Tls1, extensions, ConnectionEnd.Client);
}
options.Entity = ConnectionEnd.Client;
options.CommonName = uri.Host;
options.VerificationType = CredentialVerification.None;
options.Certificate = Org.Mentalis.Security.Certificates.Certificate.CreateFromCerFile(@"certificate.pfx");
options.Flags = SecurityFlags.Default;
options.AllowedAlgorithms = SslAlgorithms.RSA_AES_128_SHA | SslAlgorithms.NULL_COMPRESSION;
var s = new SecureSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp, options);
s.OnClose += SocketOnClose;
try
{
if (String.Equals(uri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
{
s.OnHandshakeFinish += this.HandshakeFinishedHandler;
}
s.Connect(new Net.DnsEndPoint(uri.Host, uri.Port));
if (String.Equals(uri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
{
this.handshakeFinishedEventRaised.WaitOne(60000);
if (!s.IsNegotiationCompleted)
{
throw new Exception("Handshake failed");
}
if (!s.Connected)
{
throw new Exception("Connection was lost!");
}
s.OnHandshakeFinish -= this.HandshakeFinishedHandler;
this.ApplyProtocolSelectionResults(options.GetSelectedProtocol());
}
}
catch (Exception ex)
{
s.Close();
// Emitting protocol error. It will emit session OnError
if (OnError != null)
this.OnError(this, new ProtocolErrorEventArgs(ex));
throw;
}
return s;
}