internal void UpdateOptions(SslServerAuthenticationOptions sslServerAuthenticationOptions) { if (sslServerAuthenticationOptions.ServerCertificate == null && sslServerAuthenticationOptions.ServerCertificateContext == null && sslServerAuthenticationOptions.ServerCertificateSelectionCallback == null && CertSelectionDelegate == null) { throw new NotSupportedException(SR.net_ssl_io_no_server_cert); } if ((sslServerAuthenticationOptions.ServerCertificate != null || sslServerAuthenticationOptions.ServerCertificateContext != null || CertSelectionDelegate != null) && sslServerAuthenticationOptions.ServerCertificateSelectionCallback != null) { throw new InvalidOperationException(SR.Format(SR.net_conflicting_options, nameof(ServerCertificateSelectionCallback))); } if (CertValidationDelegate == null) { CertValidationDelegate = sslServerAuthenticationOptions.RemoteCertificateValidationCallback; } else if (sslServerAuthenticationOptions.RemoteCertificateValidationCallback != null && CertValidationDelegate != sslServerAuthenticationOptions.RemoteCertificateValidationCallback) { // Callback was set in constructor to differet value. throw new InvalidOperationException(SR.Format(SR.net_conflicting_options, nameof(RemoteCertificateValidationCallback))); } IsServer = true; AllowRenegotiation = sslServerAuthenticationOptions.AllowRenegotiation; ApplicationProtocols = sslServerAuthenticationOptions.ApplicationProtocols; EnabledSslProtocols = FilterOutIncompatibleSslProtocols(sslServerAuthenticationOptions.EnabledSslProtocols); EncryptionPolicy = sslServerAuthenticationOptions.EncryptionPolicy; RemoteCertRequired = sslServerAuthenticationOptions.ClientCertificateRequired; CipherSuitesPolicy = sslServerAuthenticationOptions.CipherSuitesPolicy; CertificateRevocationCheckMode = sslServerAuthenticationOptions.CertificateRevocationCheckMode; if (sslServerAuthenticationOptions.ServerCertificateContext != null) { CertificateContext = sslServerAuthenticationOptions.ServerCertificateContext; } else if (sslServerAuthenticationOptions.ServerCertificate != null) { X509Certificate2?certificateWithKey = sslServerAuthenticationOptions.ServerCertificate as X509Certificate2; if (certificateWithKey != null && certificateWithKey.HasPrivateKey) { // given cert is X509Certificate2 with key. We can use it directly. CertificateContext = SslStreamCertificateContext.Create(certificateWithKey, null); } else { // This is legacy fix-up. If the Certificate did not have key, we will search stores and we // will try to find one with matching hash. certificateWithKey = SslStream.FindCertificateWithPrivateKey(this, true, sslServerAuthenticationOptions.ServerCertificate); if (certificateWithKey == null) { throw new AuthenticationException(SR.net_ssl_io_no_server_cert); } CertificateContext = SslStreamCertificateContext.Create(certificateWithKey); } } if (sslServerAuthenticationOptions.ServerCertificateSelectionCallback != null) { ServerCertSelectionDelegate = sslServerAuthenticationOptions.ServerCertificateSelectionCallback; } }