SecureBlackbox 2020 Node.js Edition

Questions / Feedback?

HTTPServer Class

Properties   Methods   Events   Configuration Settings   Errors  

The HTTPServer class offers server-side functionality for the HTTP/HTTPS protocols.

Syntax

secureblackbox.httpserver()

Remarks

Both plain (HTTP) and secure (HTTPS) connection types are supported.

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 Httpserver();
          server.RuntimeLicense = "5342..0000";
        
  • Set up the listening port (make sure it is not in use):
          server.Port = 443;
        
  • Tell the component whether TLS connections should be enforced:
          server.UseTLS = true; // set to false to disable TLS and server plain HTTP requests
        
  • Set up the document root (a directory where all static files are kept):
          server.DocumentRoot = "c:\\inetpub\\mywebserver";
        
  • (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; // this must be implicit for HTTPS
    
          // 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. The lower-level events deal with the underlying network connections:
    • Accept notifies you about a new incoming connection. This event lets you accept or reject it.
    • Connect notifies 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 notifies you that a connection has been closed.
    • TLSEstablished and TLSShutdown let you know that a TLS layer has been activated/deactivated.
    • Error reports a protocol or other error.
    • CertificateValidate communicates 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);          
              
    The higher-level events let you know what is going on at the HTTP layer, and let you serve your content on the fly:
    • GetRequest fires when a GET request is received from a connection.
    • PostRequest notifies your code about a POST request. Similar events for other HTTP request types (e.g. DELETE) are also available.
    • AuthAttempt fires when a connected client tries HTTP authentication (such as basic or digest) and let you accept or reject it.

    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 GetRequestStream, GetRequestString, and GetRequestHeader methods inside your GetRequest and similar event handlers to access request parameters and content supplied by the client. Use SetResponseHeader and SetResponseString method to supply the response content:
        void serverGetRequest(object sender, EventArgs e)
        {
            e.Handled = true; // telling the Httpserver object that we will supply our own content
    
            if (e.URI == "/index.html")
            {
                server.SetResponseStatus(e.ConnectionID, 200);
                server.SetResponseString(e.ConnectionID, "<html><head></head><body>Hello!</body></html>", "text/html");
            } 
            else if (e.URI == "/secretfile")
            {
                server.SetResponseStatus(e.ConnectionID, 200);
                server.SetResponseBytes(e.ConnectionID, m_secretData, "application/pdf");
            }
            else if (e.URI.StartsWith("/static/"))
            {
                e.Handled = false; // letting the server process the content and flush the file from the home directory (c:\inetpub\mywebserver)
            }
            else 
            {
                Flush404Page(e.ConnectionID);
            }
        }
        
  • To stop the server, call Stop:
          server.Stop();
        

HTTPServer 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.

ActiveIndicates whether the server is active and is listening to new connections.
AllowKeepAliveEnables or disables keep-alive mode.
AuthBasicEnables or disables basic authentication.
AuthDigestEnables or disables digest authentication.
AuthDigestExpireSpecifies digest expiration time for digest authentication.
AuthRealmSpecifies authentication realm for digest and NTLM authentication.
BoundPortIndicates the bound listening port.
CompressionLevelThe default compression level to use.
DocumentRootThe document root of the server.
ErrorOriginIndicates the endpoint where the error originates from.
ErrorSeverityThe severity of the error that happened.
ExternalCryptoCustomParamsCustom parameters to be passed to the signing service (uninterpreted).
ExternalCryptoDataAdditional data to be included in the async state and mirrored back by the requestor.
ExternalCryptoExternalHashCalculationSpecifies whether the message hash is to be calculated at the external endpoint.
ExternalCryptoHashAlgorithmSpecifies the request's signature hash algorithm.
ExternalCryptoKeyIDThe ID of the pre-shared key used for DC request authentication.
ExternalCryptoKeySecretThe pre-shared key used for DC request authentication.
ExternalCryptoMethodSpecifies the asynchronous signing method.
ExternalCryptoModeSpecifies the external cryptography mode.
ExternalCryptoPublicKeyAlgorithmProvide public key algorithm here if the certificate is not available on the pre-signing stage.
HandshakeTimeoutSpecifies the handshake timeout in milliseconds.
HostThe host to bind the listening port to.
PinnedClientAddressThe client's IP address.
PinnedClientChainValidationDetailsThe details of a certificate chain validation outcome.
PinnedClientChainValidationResultThe outcome of a certificate chain validation routine.
PinnedClientCiphersuiteThe cipher suite employed by this connection.
PinnedClientClientAuthenticatedSpecifies whether client authentication was performed during this connection.
PinnedClientDigestAlgorithmThe digest algorithm used in a TLS-enabled connection.
PinnedClientEncryptionAlgorithmThe symmetric encryption algorithm used in a TLS-enabled connection.
PinnedClientIDThe client connection's unique identifier.
PinnedClientKeyExchangeAlgorithmThe key exchange algorithm used in a TLS-enabled connection.
PinnedClientKeyExchangeKeyBitsThe length of the key exchange key of a TLS-enabled connection.
PinnedClientNamedECCurveThe elliptic curve used in this connection.
PinnedClientPFSCipherIndicates whether the chosen ciphersuite provides perfect forward secrecy (PFS).
PinnedClientPortThe remote port of the client connection.
PinnedClientPublicKeyBitsThe length of the public key.
PinnedClientResumedSessionIndicates whether a TLS-enabled connection was spawned from another TLS connection.
PinnedClientSecureConnectionIndicates whether TLS or SSL is enabled for this connection.
PinnedClientSignatureAlgorithmThe signature algorithm used in a TLS handshake.
PinnedClientSymmetricBlockSizeThe block size of the symmetric algorithm used.
PinnedClientSymmetricKeyBitsThe key length of the symmetric algorithm used.
PinnedClientTotalBytesReceivedThe total number of bytes received over this connection.
PinnedClientTotalBytesSentThe total number of bytes sent over this connection.
PinnedClientValidationLogContains the server certificate's chain validation log.
PinnedClientVersionIndicates the version of SSL/TLS protocol negotiated during this connection.
PinnedClientCertCountThe number of records in the PinnedClientCert arrays.
PinnedClientCertBytesReturns raw certificate data in DER format.
PinnedClientCertCAKeyIDA unique identifier (fingerprint) of the CA certificate's private key.
PinnedClientCertFingerprintContains the fingerprint (a hash imprint) of this certificate.
PinnedClientCertHandleAllows to get or set a 'handle', a unique identifier of the underlying property object.
PinnedClientCertIssuerThe common name of the certificate issuer (CA), typically a company name.
PinnedClientCertIssuerRDNA collection of information, in the form of [OID, Value] pairs, uniquely identifying the certificate issuer.
PinnedClientCertKeyAlgorithmSpecifies the public key algorithm of this certificate.
PinnedClientCertKeyBitsReturns the length of the public key.
PinnedClientCertKeyFingerprintReturns a fingerprint of the public key contained in the certificate.
PinnedClientCertKeyUsageIndicates the purposes of the key contained in the certificate, in the form of an OR'ed flag set.
PinnedClientCertPublicKeyBytesContains the certificate's public key in DER format.
PinnedClientCertSelfSignedIndicates whether the certificate is self-signed (root) or signed by an external CA.
PinnedClientCertSerialNumberReturns the certificate's serial number.
PinnedClientCertSigAlgorithmIndicates the algorithm that was used by the CA to sign this certificate.
PinnedClientCertSubjectThe common name of the certificate holder, typically an individual's name, a URL, an e-mail address, or a company name.
PinnedClientCertSubjectKeyIDContains a unique identifier (fingerprint) of the certificate's private key.
PinnedClientCertSubjectRDNA collection of information, in the form of [OID, Value] pairs, uniquely identifying the certificate holder (subject).
PinnedClientCertValidFromThe time point at which the certificate becomes valid, in UTC.
PinnedClientCertValidToThe time point at which the certificate expires, in UTC.
PortSpecifies the port number to listen for connections on.
PortRangeFromSpecifies the lower limit of the listening port range for incoming connections.
PortRangeToSpecifies the upper limit of the listening port range for incoming connections.
ServerCertCountThe number of records in the ServerCert arrays.
ServerCertBytesReturns raw certificate data in DER format.
ServerCertHandleAllows to get or set a 'handle', a unique identifier of the underlying property object.
SessionTimeoutSpecifies the default session timeout value in milliseconds.
SocketIncomingSpeedLimitThe maximum number of bytes to read from the socket, per second.
SocketLocalAddressThe local network interface to bind the socket to.
SocketLocalPortThe local port number to bind the socket to.
SocketOutgoingSpeedLimitThe maximum number of bytes to write to the socket, per second.
SocketTimeoutThe maximum period of waiting, in milliseconds, after which the socket operation is considered unsuccessful.
SocketUseIPv6Enables or disables IP protocol version 6.
TempDirThe temporary path to use.
TLSAutoValidateCertificatesSpecifies whether server-side TLS certificates should be validated automatically using internal validation rules.
TLSBaseConfigurationSelects the base configuration for the TLS settings.
TLSCiphersuitesA list of ciphersuites separated with commas or semicolons.
TLSECCurvesDefines the elliptic curves to enable.
TLSForceResumeIfDestinationChangesWhether to force TLS session resumption when the destination address changes.
TLSPreSharedIdentityDefines the identity used when the PSK (Pre-Shared Key) key-exchange mechanism is negotiated.
TLSPreSharedKeyContains the pre-shared for the PSK (Pre-Shared Key) key-exchange mechanism, encoded with base16.
TLSPreSharedKeyCiphersuiteDefines the ciphersuite used for PSK (Pre-Shared Key) negotiation.
TLSRenegotiationAttackPreventionModeSelects renegotiation attack prevention mechanism.
TLSRevocationCheckSpecifies the kind(s) of revocation check to perform.
TLSSSLOptionsVarious 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.
TLSTLSModeSpecifies the TLS mode to use.
TLSUseExtendedMasterSecretEnables Extended Master Secret Extension, as defined in RFC 7627.
TLSUseSessionResumptionEnables or disables TLS session resumption capability.
TLSVersionsTh SSL/TLS versions to enable by default.
UseChunkedTransferEnables chunked transfer.
UseCompressionEnables or disables server-side compression.
UserCountThe number of records in the User arrays.
UserAssociatedDataContains the user's Associated Data when SSH AEAD (Authenticated Encryption with Associated Data) algorithm is used.
UserBasePathBase path for this user in the server's file system.
UserCertContains the user's certificate.
UserDataContains uninterpreted user-defined data that should be associated with the user account, such as comments or custom settings.
UserHandleAllows to get or set a 'handle', a unique identifier of the underlying property object.
UserHashAlgorithmSpecifies the hash algorithm used to generate TOTP (Time-based One-Time Passwords) passwords for this user.
UserIncomingSpeedLimitSpecifies the incoming speed limit for this user.
UserOutgoingSpeedLimitSpecifies the outgoing speed limit for this user.
UserPasswordThe user's authentication password.
UserSharedSecretContains the user's secret key, which is essentially a shared secret between the client and server.
UserUsernameThe registered name (login) of the user.
UseTLSEnables or disables the TLS requirement.
WebsiteNameSpecifies 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.

ConfigSets or retrieves a configuration setting.
DropClientTerminates a client connection.
GetRequestBytesReturns the contents of the client's HTTP request.
GetRequestHeaderReturns a request header value.
GetRequestStringReturns the contents of the client's HTTP request.
GetRequestUsernameReturns the username for a connection.
ListClientsEnumerates the connected clients.
PinClientTakes a snapshot of the connection's properties.
SetResponseBytesSets a byte array to be served as a response.
SetResponseFileSets a file to be served as a response.
SetResponseHeaderSets a response header.
SetResponseStatusSets an HTTP status to be sent with the response.
SetResponseStringSets a string to be served as a response.
StartStarts the server.
StopStops the 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.

AcceptReports an incoming connection.
AuthAttemptFires when a connected client makes an authentication attempt.
CertificateValidateFires when a client certificate needs to be validated.
ConnectReports an accepted connection.
CustomRequestReports a request of a non-standard type (method).
DataSupplies a data chunk received within a POST or PUT upload.
DeleteRequestReports a DELETE request.
DisconnectFires to report a disconnected client.
ErrorInformation about errors during data delivery.
ExternalSignHandles remote or external signing initiated by the server protocol.
FileErrorReports a file access error to the application.
GetRequestReports a GET request.
HeadRequestReports a HEAD request.
NotificationThis event notifies the application about an underlying control flow event.
OptionsRequestReports an OPTIONS request.
PatchRequestReports a PATCH request.
PostRequestReports a POST request.
PutRequestReports a PUT request.
TLSEstablishedReports the setup of a TLS session.
TLSPSKRequests a pre-shared key for TLS-PSK.
TLSShutdownReports closure of a TLS session.
TraceRequestReports a TRACE request.

Configuration Settings


The following is a list of configuration settings for the class with short descriptions. Click on the links for further details.

AllowOptionsResponseWithoutAuthEnables unauthenticated responses to OPTIONS requests.
ClientAuthEnables or disables certificate-based client authentication.
DualStackAllows the use of ip4 and ip6 simultaneously.
HomePageSpecifies the home page resource name.
HostThe host to bind to.
RequestFilterThe request string modifier.
ServerSSLDHKeyLengthSets the size of the TLS DHE key exchange group.
TLSExtensionsProvides access to TLS extensions.
WebsiteNameThe website name for the TLS certificate.
CheckKeyIntegrityBeforeUseEnables or disable private key integrity check before use.
CookieCachingSpecifies whether a cookie cache should be used for HTTP(S) transports.
CookiesGets or sets local cookies for the class (supported for HTTPClient, RESTClient and SOAPClient only).
DefDeriveKeyIterationsSpecifies the default key derivation algorithm iteration count.
EnableClientSideSSLFFDHEEnables or disables finite field DHE key exchange support in TLS clients.
GlobalCookiesGets or sets global cookies for all the HTTP transports.
HttpUserAgentSpecifies the user agent name to be used by all HTTP clients.
LogDestinationSpecifies the debug log destination.
LogDetailsSpecifies the debug log details to dump.
LogFileSpecifies the debug log filename.
LogFiltersSpecifies the debug log filters.
LogFlushModeSpecifies the log flush mode.
LogLevelSpecifies the debug log level.
LogMaxEventCountSpecifies the maximum number of events to cache before further action is taken.
LogRotationModeSpecifies the log rotation mode.
MaxASN1BufferLengthSpecifies the maximal allowed length for ASN.1 primitive tag data.
MaxASN1TreeDepthSpecifies the maximal depth for processed ASN.1 trees.
OCSPHashAlgorithmSpecifies the hash algorithm to be used to identify certificates in OCSP requests.
UseOwnDNSResolverSpecifies whether the client classes should use own DNS resolver.
UseSharedSystemStoragesSpecifies whether the validation engine should use a global per-process copy of the system certificate stores.
UseSystemOAEPAndPSSEnforces or disables the use of system-driven RSA OAEP and PSS computations.
UseSystemRandomEnables or disables the use of the OS PRNG.

Copyright (c) 2022 /n software inc. - All rights reserved.
SecureBlackbox 2020 Node.js Edition - Version 20.0 [Build 8165]