TLSServer Class
Properties Methods Events Configuration Settings Errors
The TLSServer class implements server-side functionality of the TLS protocol. In the TLS-disabled mode it works as a plain TCP server.
Syntax
secureblackbox.tlsserver()
Remarks
Use this component to accept TLS-encrypted or plain TCP connections in your application.
Follow the below steps to set up and run the server in your code:
- Create an instance of the server component and set up the license, if assumed by the edition you are using:
var server = new Tlsserver(); server.RuntimeLicense = "5342..0000";
- Set up the listening port (make sure it is not in use):
server.Port = 3456;
- Tell the component whether TLS connections should be enforced:
server.UseTLS = false; // set to true to enable TLS
- (TLS-enabled servers only) Configure TLS parameters. The exact way of doing that may vary for different scenarios and security requirements.
At the very least you need to set up the certificate chain that the server will use to authenticate itself to connecting clients. If you don"t,
the component will generate a dummy certificate itself, however, that certificate is unlikely to pass any security requirements.
It will let you accept test connections though.
Below is an example of tuning up the TLS parameters of the server:
// *** Switching TLS on and enabling the implicit mode *** server.UseTLS = true; server.TLSSettings.TLSMode = smImplicitTLS; // Loading the certificate chain var mgr = new Certificatemanager(); mgr.RuntimeLicense = "5342..0000"; // *** Setting up the host certificate *** // - it should be issued in the name that matches the hostname (such as domain.com) or its IP address (1.2.3.4), // - it must have an associated private key - so likely is provided in PFX or PEM format. mgr.ImportFromFile("CertTLSServer.pfx", "password"); server.ServerCertificates.Add(mgr.Certificate); // The CA certificate: this is to help connecting clients validate the chain. mgr.ImportFromFile("CertCA.cer", ""); server.ServerCertificates.Add(mgr.Certificate); // *** Adjusting finer-grained TLS settings *** // - session resumption (allows for faster handshakes for connections from the same origin) server.TLSSettings.UseSessionResumption = true; // - secure configuration server.TLSSettings.BaseConfiguration = stpcHighlySecure; // - disabling a ciphersuite we dislike (just because we can): server.TLSSettings.Ciphersuites = "-DHE_RSA_AES128_SHA" // *** Configuring versions *** // The default version setting at the time of writing (May 2021) is TLS 1.2 and TLS 1.3, // but that may change in future versions. The following tune-up additionally activates TLS 1.1 and TLS 1.0, // which weakens security, but may be necessary to accept connections from older clients: server.TLSSettings.Versions = csbTLS1 | csbTLS11 | csbTLS12 | csbTLS13;
- Now that your server has been fully set up, activate it:
server.Start();
- Once the Start call completes, your server can accept connections from clients. Each accepted connection runs in a separate thread, not interfering with each other
or your own threads. The server communicates its ongoing activities to your application by throwing events:
- Accept to notify you about a new incoming connection. This event lets you accept or reject it.
- Connect to notify your code of an accepted connection. This event introduces a ConnectionID, a unique identifier that you can use to track the connection throughout its lifetime.
- Disconnect to notify you that a connection has been closed.
- TLSEstablished and TLSShutdown to let you know that a TLS layer has been activated/deactivated.
- Data to notify you about a piece of data received from the remote side.
- Error to report a protocol or other error.
- CertificateValidate to communicate the client authentication event to your code. To access the certificate(s) provided by the authenticating client,
pin the client and use the PinnedClientChain property to access its chain:
server.PinClient(e.ConnectionID); e.Accept = CheckCert(server.PinnedClientChain);
Note: every such event is thrown from the respective connection thread, so make sure you use some synchronization mechanism when dispatching the events to your UI thread - for example, by updating UI controls by sending a Window Message rather than accessing the controls directly.
Use SendData and SendText to send data back to a client. When sending data, provide the ConnectionID that is associated with that client. Call DropClient to terminate a client connection.
- To stop the server, call Stop:
server.Stop();
TLSServer and SSLLabs
Qualys SSLLabs (https://www.ssllabs.com/) has been long known as a comprehensive TLS site quality checking tool. It is now a de-facto standard and a sign of good taste to aspire for the best SSLLabs test result for your web presence. SecureBlackbox developers share that effort and want to help their customers build secure TLS endpoints that can be independently endorsed by third-party evaluators like SSLLabs.Having said that, when assessing SecureBlackbox TLS-capable servers that are configured to use their default setup, you will often end up with a lower SSLLabs score than you could have. There is a simple reason for that. Being a vendor of a library used by thousands of customers, we have to find a delicate balance between security, compatibility, and keeping class contracts rolling from one product build to another. This makes the default configuration of the components not the strongest possible. To put it simple, we could easily make the default component setup bulletproof - but having done that, we would have likely ended up with hundreds of customers stuck with legacy environments (and there are a lot of them around) losing their connectivity.
If you are looking at achieving the best score at SSLLabs, please read on. The below guidance aims to help you tune up the server component in the way that should give you an A score.
First, switch your server to the highly secure base configuration:
server.TLSSettings.BaseConfiguration = stpcHighlySecure;This should immediately give you an A, or a T if your server certificate does not chain up to a trusted anchor.
Some warnings will still be included in the report. One of those is related to the session resumption. It is normally shown in orange:
Session resumption (caching): No (IDs assigned but not accepted)
This literally means that the server is not configured to re-use older sessions, which may put extra computational burden on clients and itself.
Use the following setting to enable session caching:
server.TLSSettings.UseSessionResumption = true;
Besides, the report may show that there are some weak ciphersuites. All of those should be shown in orange (there should not be any reds; if
there are - please let us know), which means they are only relatively weak. While switching them off may affect the interoperability level of
the server, you may still want to do that. By using the below approach you can disable individual ciphersuites selectively. For example, if
the report shows that TLS_DHE_RSA_WITH_AES128_CBC_SHA256 and TLS_DHE_RSA_WITH_AES256_CBC_SHA256 are weak (because of their CBC mode), you can
disable them in the following way:
server.TLSSettings.Ciphersuites = '-DHE_RSA_AES128_SHA256;-DHE_RSA_AES256_SHA256';Note that SBB uses slightly different, simpler naming convention by dropping unnecessart WITH and CBC. Let us know if you have difficulties matching the ciphersuite names.
Property List
The following is the full list of the properties of the class with short descriptions. Click on the links for further details.
Active | Indicates whether the server is active and is listening to new connections. |
BoundPort | Indicates the bound listening port. |
ErrorOrigin | Indicates the endpoint where the error originates from. |
ErrorSeverity | The severity of the error that happened. |
ExternalCryptoCustomParams | Custom parameters to be passed to the signing service (uninterpreted). |
ExternalCryptoData | Additional data to be included in the async state and mirrored back by the requestor. |
ExternalCryptoExternalHashCalculation | Specifies whether the message hash is to be calculated at the external endpoint. |
ExternalCryptoHashAlgorithm | Specifies the request's signature hash algorithm. |
ExternalCryptoKeyID | The ID of the pre-shared key used for DC request authentication. |
ExternalCryptoKeySecret | The pre-shared key used for DC request authentication. |
ExternalCryptoMethod | Specifies the asynchronous signing method. |
ExternalCryptoMode | Specifies the external cryptography mode. |
ExternalCryptoPublicKeyAlgorithm | Provide public key algorithm here if the certificate is not available on the pre-signing stage. |
HandshakeTimeout | Specifies the handshake timeout in milliseconds. |
Host | The host to bind the listening port to. |
PinnedClientAddress | The client's IP address. |
PinnedClientChainValidationDetails | The details of a certificate chain validation outcome. |
PinnedClientChainValidationResult | The outcome of a certificate chain validation routine. |
PinnedClientCiphersuite | The cipher suite employed by this connection. |
PinnedClientClientAuthenticated | Specifies whether client authentication was performed during this connection. |
PinnedClientDigestAlgorithm | The digest algorithm used in a TLS-enabled connection. |
PinnedClientEncryptionAlgorithm | The symmetric encryption algorithm used in a TLS-enabled connection. |
PinnedClientID | The client connection's unique identifier. |
PinnedClientKeyExchangeAlgorithm | The key exchange algorithm used in a TLS-enabled connection. |
PinnedClientKeyExchangeKeyBits | The length of the key exchange key of a TLS-enabled connection. |
PinnedClientNamedECCurve | The elliptic curve used in this connection. |
PinnedClientPFSCipher | Indicates whether the chosen ciphersuite provides perfect forward secrecy (PFS). |
PinnedClientPort | The remote port of the client connection. |
PinnedClientPublicKeyBits | The length of the public key. |
PinnedClientResumedSession | Indicates whether a TLS-enabled connection was spawned from another TLS connection. |
PinnedClientSecureConnection | Indicates whether TLS or SSL is enabled for this connection. |
PinnedClientSignatureAlgorithm | The signature algorithm used in a TLS handshake. |
PinnedClientSymmetricBlockSize | The block size of the symmetric algorithm used. |
PinnedClientSymmetricKeyBits | The key length of the symmetric algorithm used. |
PinnedClientTotalBytesReceived | The total number of bytes received over this connection. |
PinnedClientTotalBytesSent | The total number of bytes sent over this connection. |
PinnedClientValidationLog | Contains the server certificate's chain validation log. |
PinnedClientVersion | Indicates the version of SSL/TLS protocol negotiated during this connection. |
PinnedClientCertCount | The number of records in the PinnedClientCert arrays. |
PinnedClientCertBytes | Returns raw certificate data in DER format. |
PinnedClientCertCAKeyID | A unique identifier (fingerprint) of the CA certificate's private key. |
PinnedClientCertFingerprint | Contains the fingerprint (a hash imprint) of this certificate. |
PinnedClientCertHandle | Allows to get or set a 'handle', a unique identifier of the underlying property object. |
PinnedClientCertIssuer | The common name of the certificate issuer (CA), typically a company name. |
PinnedClientCertIssuerRDN | A collection of information, in the form of [OID, Value] pairs, uniquely identifying the certificate issuer. |
PinnedClientCertKeyAlgorithm | Specifies the public key algorithm of this certificate. |
PinnedClientCertKeyBits | Returns the length of the public key. |
PinnedClientCertKeyFingerprint | Returns a fingerprint of the public key contained in the certificate. |
PinnedClientCertKeyUsage | Indicates the purposes of the key contained in the certificate, in the form of an OR'ed flag set. |
PinnedClientCertPublicKeyBytes | Contains the certificate's public key in DER format. |
PinnedClientCertSelfSigned | Indicates whether the certificate is self-signed (root) or signed by an external CA. |
PinnedClientCertSerialNumber | Returns the certificate's serial number. |
PinnedClientCertSigAlgorithm | Indicates the algorithm that was used by the CA to sign this certificate. |
PinnedClientCertSubject | The common name of the certificate holder, typically an individual's name, a URL, an e-mail address, or a company name. |
PinnedClientCertSubjectKeyID | Contains a unique identifier (fingerprint) of the certificate's private key. |
PinnedClientCertSubjectRDN | A collection of information, in the form of [OID, Value] pairs, uniquely identifying the certificate holder (subject). |
PinnedClientCertValidFrom | The time point at which the certificate becomes valid, in UTC. |
PinnedClientCertValidTo | The time point at which the certificate expires, in UTC. |
Port | Specifies the port number to listen for connections on. |
PortRangeFrom | Specifies the lower limit of the listening port range for incoming connections. |
PortRangeTo | Specifies the upper limit of the listening port range for incoming connections. |
ServerCertCount | The number of records in the ServerCert arrays. |
ServerCertBytes | Returns raw certificate data in DER format. |
ServerCertHandle | Allows to get or set a 'handle', a unique identifier of the underlying property object. |
SessionTimeout | Specifies the default session timeout value in milliseconds. |
SocketIncomingSpeedLimit | The maximum number of bytes to read from the socket, per second. |
SocketLocalAddress | The local network interface to bind the socket to. |
SocketLocalPort | The local port number to bind the socket to. |
SocketOutgoingSpeedLimit | The maximum number of bytes to write to the socket, per second. |
SocketTimeout | The maximum period of waiting, in milliseconds, after which the socket operation is considered unsuccessful. |
SocketUseIPv6 | Enables or disables IP protocol version 6. |
TLSAutoValidateCertificates | Specifies whether server-side TLS certificates should be validated automatically using internal validation rules. |
TLSBaseConfiguration | Selects the base configuration for the TLS settings. |
TLSCiphersuites | A list of ciphersuites separated with commas or semicolons. |
TLSECCurves | Defines the elliptic curves to enable. |
TLSForceResumeIfDestinationChanges | Whether to force TLS session resumption when the destination address changes. |
TLSPreSharedIdentity | Defines the identity used when the PSK (Pre-Shared Key) key-exchange mechanism is negotiated. |
TLSPreSharedKey | Contains the pre-shared for the PSK (Pre-Shared Key) key-exchange mechanism, encoded with base16. |
TLSPreSharedKeyCiphersuite | Defines the ciphersuite used for PSK (Pre-Shared Key) negotiation. |
TLSRenegotiationAttackPreventionMode | Selects renegotiation attack prevention mechanism. |
TLSRevocationCheck | Specifies the kind(s) of revocation check to perform. |
TLSSSLOptions | Various SSL (TLS) protocol options, set of cssloExpectShutdownMessage 0x001 Wait for the close-notify message when shutting down the connection cssloOpenSSLDTLSWorkaround 0x002 (DEPRECATED) Use a DTLS version workaround when talking to very old OpenSSL versions cssloDisableKexLengthAlignment 0x004 Do not align the client-side PMS by the RSA modulus size. |
TLSTLSMode | Specifies the TLS mode to use. |
TLSUseExtendedMasterSecret | Enables Extended Master Secret Extension, as defined in RFC 7627. |
TLSUseSessionResumption | Enables or disables TLS session resumption capability. |
TLSVersions | Th SSL/TLS versions to enable by default. |
UseTLS | Enables or disables the TLS requirement. |
WebsiteName | Specifies the web site name to use in the certificate. |
Method List
The following is the full list of the methods of the class with short descriptions. Click on the links for further details.
Config | Sets or retrieves a configuration setting. |
DropClient | Terminates a client connection. |
ListClients | Enumerates the connected clients. |
PinClient | Takes a snapshot of the connection's properties. |
SendData | Sends a data buffer to a connection client. |
SendKeepAlive | Sends a keep-alive packet. |
SendText | Sends a text string to a client. |
Start | Starts the TLS server. |
Stop | Stops the TLS server. |
Event List
The following is the full list of the events fired by the class with short descriptions. Click on the links for further details.
Accept | Reports an incoming connection. |
CertificateValidate | Fires when a client certificate needs to be validated. |
Connect | Reports an accepted connection. |
Data | Supplies a data chunk received from a client. |
Disconnect | Fires to report a disconnected client. |
Error | Information about errors during data delivery. |
ExternalSign | Handles remote or external signing initiated by the server protocol. |
Notification | This event notifies the application about an underlying control flow event. |
TLSEstablished | Reports the setup of a TLS session. |
TLSPSK | Requests a pre-shared key for TLS-PSK. |
TLSShutdown | Reports closure of a TLS session. |
Configuration Settings
The following is a list of configuration settings for the class with short descriptions. Click on the links for further details.
ClientAuth | Enables or disables certificate-based client authentication. |
DualStack | Allows the use of ip4 and ip6 simultaneously. |
Host | The host to bind to. |
ServerSSLDHKeyLength | Sets the size of the TLS DHE key exchange group. |
TLSExtensions | Provides access to TLS extensions. |
WebsiteName | The website name for the TLS certificate. |
CheckKeyIntegrityBeforeUse | Enables or disable private key integrity check before use. |
CookieCaching | Specifies whether a cookie cache should be used for HTTP(S) transports. |
Cookies | Gets or sets local cookies for the class (supported for HTTPClient, RESTClient and SOAPClient only). |
DefDeriveKeyIterations | Specifies the default key derivation algorithm iteration count. |
EnableClientSideSSLFFDHE | Enables or disables finite field DHE key exchange support in TLS clients. |
GlobalCookies | Gets or sets global cookies for all the HTTP transports. |
HttpUserAgent | Specifies the user agent name to be used by all HTTP clients. |
LogDestination | Specifies the debug log destination. |
LogDetails | Specifies the debug log details to dump. |
LogFile | Specifies the debug log filename. |
LogFilters | Specifies the debug log filters. |
LogFlushMode | Specifies the log flush mode. |
LogLevel | Specifies the debug log level. |
LogMaxEventCount | Specifies the maximum number of events to cache before further action is taken. |
LogRotationMode | Specifies the log rotation mode. |
MaxASN1BufferLength | Specifies the maximal allowed length for ASN.1 primitive tag data. |
MaxASN1TreeDepth | Specifies the maximal depth for processed ASN.1 trees. |
OCSPHashAlgorithm | Specifies the hash algorithm to be used to identify certificates in OCSP requests. |
UseOwnDNSResolver | Specifies whether the client classes should use own DNS resolver. |
UseSharedSystemStorages | Specifies whether the validation engine should use a global per-process copy of the system certificate stores. |
UseSystemOAEPAndPSS | Enforces or disables the use of system-driven RSA OAEP and PSS computations. |
UseSystemRandom | Enables or disables the use of the OS PRNG. |