WatsonTcpClientSslConfiguration.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. namespace WatsonTcp
  2. {
  3. using System;
  4. using System.Net.Security;
  5. using System.Security.Cryptography.X509Certificates;
  6. /// <summary>
  7. /// Stores the parameters for the <see cref="SslStream"/> used by clients.
  8. /// </summary>
  9. public class WatsonTcpClientSslConfiguration
  10. {
  11. #region Public-Members
  12. /// <summary>
  13. /// Gets or sets a <see cref="LocalCertificateSelectionCallback"/> delegate responsible for
  14. /// selecting the certificate used for authentication.
  15. /// </summary>
  16. /// <remarks>The default delegate returns the first certificate in the collection</remarks>
  17. public LocalCertificateSelectionCallback ClientCertificateSelectionCallback
  18. {
  19. get
  20. {
  21. if (_ClientCertSelectionCallback == null)
  22. _ClientCertSelectionCallback = DefaultSelectClientCertificate;
  23. return _ClientCertSelectionCallback;
  24. }
  25. set
  26. {
  27. _ClientCertSelectionCallback = value;
  28. }
  29. }
  30. /// <summary>
  31. /// Gets or sets a <see cref="RemoteCertificateValidationCallback"/> delegate responsible
  32. /// for validating the certificate supplied by the remote party.
  33. /// </summary>
  34. /// <remarks>
  35. /// The default delegate returns true for all certificates
  36. /// </remarks>
  37. public RemoteCertificateValidationCallback ServerCertificateValidationCallback
  38. {
  39. get
  40. {
  41. if (_ServerCertValidationCallback == null)
  42. _ServerCertValidationCallback = DefaultValidateServerCertificate;
  43. return _ServerCertValidationCallback;
  44. }
  45. set
  46. {
  47. _ServerCertValidationCallback = value;
  48. }
  49. }
  50. #endregion
  51. #region Private-Members
  52. private LocalCertificateSelectionCallback _ClientCertSelectionCallback;
  53. private RemoteCertificateValidationCallback _ServerCertValidationCallback;
  54. #endregion
  55. #region Constructors-and-Factories
  56. /// <summary>
  57. /// Initializes a new instance of <see cref="WatsonTcpClientSslConfiguration"/>.
  58. /// </summary>
  59. public WatsonTcpClientSslConfiguration()
  60. {
  61. }
  62. /// <summary>
  63. /// Initializes a new instance of <see cref="WatsonTcpClientSslConfiguration"/>
  64. /// that stores the parameters copied from another configuration.
  65. /// </summary>
  66. /// <param name="configuration">
  67. /// A <see cref="WatsonTcpClientSslConfiguration"/> from which to copy.
  68. /// </param>
  69. /// <exception cref="ArgumentNullException" />
  70. public WatsonTcpClientSslConfiguration(WatsonTcpClientSslConfiguration configuration)
  71. {
  72. if (configuration == null)
  73. throw new ArgumentNullException("Can not copy from null client SSL configuration");
  74. _ClientCertSelectionCallback = configuration._ClientCertSelectionCallback;
  75. _ServerCertValidationCallback = configuration._ServerCertValidationCallback;
  76. }
  77. #endregion
  78. #region Public-Methods
  79. #endregion
  80. #region Private-Methods
  81. private static X509Certificate DefaultSelectClientCertificate(
  82. object sender,
  83. string targetHost,
  84. X509CertificateCollection clientCertificates,
  85. X509Certificate serverCertificate,
  86. string[] acceptableIssuers
  87. )
  88. {
  89. if (clientCertificates == null || clientCertificates.Count == 0)
  90. {
  91. return null;
  92. }
  93. return clientCertificates[0];
  94. }
  95. private static bool DefaultValidateServerCertificate(
  96. object sender,
  97. X509Certificate certificate,
  98. X509Chain chain,
  99. SslPolicyErrors sslPolicyErrors
  100. )
  101. {
  102. return true;
  103. }
  104. #endregion
  105. }
  106. }