Configure TLS security settings
- Last Updated: May 18, 2026
- 10 minute read
- OpenEdge
- Version 12.8
- Documentation
Transport Layer Security (TLS) is a security protocol that specifies the use of digital certificates to verify identity and encrypt messages transmitted between client and server applications.
HTTPS is a combination of HTTP and TLS. The TLS protocol specifies that a client and server application must first perform a TLS 'handshake' before exchanging request or response messages. The TLS handshake is a process wherein the client and server:
- Prove their identity to each other through public key certificates.
- Agree upon a set of cipher suites (encryption algorithms).
- Generate a session key that will be used to encrypt messages.
In most cases, only the server proves its identity to the client. However, an organization's security policy may require a client application to also authenticate itself. In such situations, the client application must submit a public key certificate to the server.
If the handshake is successful, the client and server begin sending each other encrypted request or response messages. If the handshake fails, no further communication can happen between the client and the server.
The ABL HTTP client library supports two-way authentication. You can use it to verify a server certificate as well as send a client certificate to the server. The ABL HTTP client library performs the steps described in the handshake process under the covers.
Server authentication
To establish a successful HTTPS connection, a server sends its public key certificate to the client. The certificate must be signed by a Certificate Authority (CA) that is trusted by the client.
An ABL HTTP client verifies the identity of a server by checking the server's root certificate against the CA certificates installed in the OpenEdge certificate store. A root certificate is the public key certificate of the CA that has signed the server's certificate.
To learn more about installing root certificates, see Install trusted CA/root certificates in the Manage OpenEdge Keys and Certificates guide.
Client authentication
A server may have security policies that require a client to submit a client certificate during the TLS handshake. This process is called two-way TLS authentication or mutual TLS authentication.
If your ABL HTTP client needs to participate in mutual TLS authentication, you must, in addition to installing the server's root certificate in the OpenEdge certificate store, obtain a public/private key pair and a digital certificate containing the public key to prove the client's identity. You can do this in one of the following ways:
- You can create a self-signed certificate, where you act as your own CA. A self-signed certificate is often used in development and testing environments.
- Generate a public/private key pair, create a certificate signing request (CSR) containing the public key, and submit the CSR to a Certificate Authority. The CA will return a signed public key certificate for you to use. A public key certificate signed by a widely trusted CA is typically required in a production system.
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
root /usr/share/<proxy name>/html;
ssl_certificate "<path-to-server-certificate>";
ssl_certificate_key "<path-to-server-key>";
ssl_client_certificate "<path-to-CA-file-for-client-certificate-in-PEM-format>";
ssl_verify_client on;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass https:<PAS server IP address : port>/rest;
}
}You can use a similar approach to configure a proxy from other vendors.
OpenEdge provides a utility called pkiutil that enables you to create certificates as well as generate
CSRs.
To learn more about the pkiutil utility, see pkiutil.
To learn about creating self-signed certificates, see https://community.progress.com/articles/Knowledge/000027719.
The ABL HTTP client requires access to a PEM file that contains both
the public and the private key. You can generate a PEM file using the pkiutil utility.
Use TLS connections with ABL HttpClient
Once you have a PEM file ready, perform the following steps in your ABL HTTP client code:
- Create a
TlsClientCredentialsobject containing two properties:- A path to the PEM file. You can specify either an absolute path or a path
relative to a directory listed in the
PROPATH. When no path is provided, the system searches for the PEM file in the%DLC%\keysfolder (Windows) or$DLC/keysdirectory (Linux). - An encoded passphrase to enable the HTTP client to access the private key in the PEM file.
var EncodedString oEncSt. var TlsClientCredentials oCred. // Create a passphrase for the client certificate using plain-text encoding. oEncSt = new EncodedString(). oEncSt:encoding = EncodingTypeEnum:nopr0. oEncSt:value = "password". // Create credentials which consists of certificate path and encoded passphrase. oCred = new TlsClientCredentials(). oCred:identity = new OpenEdge.Core.String("PAS-default-cert.pem"). oCred:secret = oEncSt. - A path to the PEM file. You can specify either an absolute path or a path
relative to a directory listed in the
- Pass the
TlsClientCredentialsobject to theUsingClientCredentials()method during the construction of the HTTP request object.... // Create credentials which consists of certificate path and encoded passphrase. oCred = new TlsClientCredentials(). oCred:identity = new OpenEdge.Core.String("C:\OpenEdge\WRK\oepas1\bin\PAS-default-cert.pem"). oCred:secret = oEncSt. // Create the request with stated credentials, calling the built-in REST ping service. oRequest = RequestBuilder:Get("https://httpbin.org/get") :UsingClientCredentials(oCred) :Request.
Here is the complete code example:
|
SOAP and APSV.TLS Supported Groups
TLS supported groups are named groups used for key exchange during TLS handshake. A list of supported group is sent from the ABL HTTP client to any OpenEdge or non-OpenEdge server, arranged in order of the most preferred list to the least preferred. Each TLS vendor have their own preferred list of supported groups.
TLS supported group helps in reducing an additional cycle of TLS negotiation during the TLS handshake. If the preferred supported group list of a client does not match the preferred supported group list of the server, then the key exchange handshake may include an additional additional cycle of key exchange negotitation.
During a handshake between the client and the server, if the preferred list of the TLS vendor of the client does not match that of the TLS vendor of the server, then the handshake process involves an additional cycle of key exchange negotiations. Use TLS supported groups to reduce this additional cycle of TLS negotiation during the TLS handshake.
The client, with (TLSv1.2,TLSv1.3) as default, communicates with the server, which uses either (TLSv1.2,TLSv1.3) or (TLSv1.3). In such a scenario, the higher version (TLSv1.3) takes precedence.
- Environment variables—Used by the client to set the environment variables that will match the preferred list used by the server. For more information, see Change the default protocols and ciphers for Progress OpenEdge clients.
- Connection parameters—Used by the client to connect to the server with new parameters for the supported group. This allows the client to use the supported group set in the connection parameter to connect with the server. For more information, see CONNECT () method (Socket object).
- Configure the client with matching supported group of the server.
.
// Connect to Server using matching Supported Groups P-521:P-384. extent(tlsGroup) = 2. assign tlsGroup[1] = "P-521" tlsGroup[2] = "P-384" . clib = ClientLibraryBuilder:Build() :SslVerifyHost(false) :TlsSupportedGroups(tlsGroup) :Library. client = ClientBuilder:Build() :UsingLibrary(clib) :Client. req = RequestBuilder:Build("get", URI:Parse(cInstance)) :Request. - Run the request.
resp = client:Execute(req). message "Status Code:" resp:StatusCode. catch err as Progress.Lang.Error: message "Error:" err:GetMessage(1). message "Callstack:" err:CallStack. end catch.
block-level on error undo, throw.
using OpenEdge.Core.Assert.
using OpenEdge.Net.HTTP.IHttpClient.
using OpenEdge.Net.HTTP.IHttpClientLibrary.
using OpenEdge.Net.HTTP.IHttpRequest.
using OpenEdge.Net.HTTP.IHttpResponse.
using OpenEdge.Net.HTTP.ClientBuilder.
using OpenEdge.Net.HTTP.RequestBuilder.
using OpenEdge.Net.HTTP.Lib.ClientLibraryBuilder.
using OpenEdge.Net.URI.
var character[] tlsGroup.
var character cInstance = os-getenv("httpsURL").
var IHttpClient client.
var IHttpClientLibrary clib.
var IHttpRequest req.
var IHttpResponse resp.session:error-stack-trace = true.
// Connect to Server using matching Supported Groups P-521:P-384.
extent(tlsGroup) = 2.
assign
tlsGroup[1] = "P-521"
tlsGroup[2] = "P-384"
.
clib = ClientLibraryBuilder:Build()
:SslVerifyHost(false)
:TlsSupportedGroups(tlsGroup)
:Library.
client = ClientBuilder:Build()
:UsingLibrary(clib)
:Client.
req = RequestBuilder:Build("get", URI:Parse(cInstance))
:Request.
resp = client:Execute(req).
message "Status Code:" resp:StatusCode.
catch err as Progress.Lang.Error:
message "Error:" err:GetMessage(1).
message "Callstack:" err:CallStack.
end catch.Use a callback to get client credentials
In the previous code example illustrating client-side TLS
authentication, the TlsClientCredentials object
was constructed inside the ABL HTTP client code. This approach works well if the
same client certificate is used for every TLS connection to the server. However, if
you need to use different client certificates—for example, if you have multiple
users connecting to the server and each user has their own client certificate—you
should:
- Delegate the task of constructing the
TlsClientCredentialsobject to an ABL class that implementsISocketConnectionCredentialsHandler. - Use a callback from within the ABL HTTP client to obtain the
TlsClientCredentialsobject.
Here is an example of a callback class that implements ISocketConnectionCredentialsHandler:
|
The callback class must implement the ClientSocket_ConnectionCredentialsHandler() method. This method
takes two input parameters—a Progress.Lang.Object object and a CredentialsEventArgs object. Inside the method, you must construct
the TlsClientCredentials object and assign it
to the Credentials property of the CredentialsEventArgs object.
Then, from within the ABL HTTP client program, you create an object of the callback class and specify the callback object when building the HTTP request:
|
Use multiple callbacks to get client credentials from different sources
You can chain multiple client credential callbacks when building an HTTP request object. This is useful when credentials are stored in different locations, such as a database and a file system, and your code must search each location for a credential.
To use multiple callbacks, perform the following steps:
- Create a callback handler class for each source of
credentials. For example, you might create a
DatabaseCredentialsHandlerclass and aFileCredentialsHandlerclass to get credentials from a database and a file system respectively. The handler classes should implementISocketConnectionCredentialsHandler.class DatabaseCredentialsHandler implements ISocketConnectionCredentialsHandler: ... ... end class. - In each handler class, write the logic to obtain the
credential and implement the
ClientSocket_ConnectionCredentialsHandler()method, assigning the credential to theCredentialsEventArgs:Credentialsproperty.Note: You can also set theCredentialsEventArgs:Cancelproperty totrueto prevent other callbacks from executing if the credential is found in the current callback.class DatabaseCredentialsHandler implements ISocketConnectionCredentialsHandler: ... method public void ClientSocket_ConnectionCredentialsHandler (input pSender as Progress.Lang.Object, input pEventArgs as CredentialsEventArgs). // Get credentials from the DB var TlsClientCredentials oCred. ... pEventArgs:Credentials = oCred. pEventArgs:Cancel = yes. end method. ... end class. - In the ABL HTTP client program, instantiate the handler
classes and chain them as shown in this example:
var IHttpRequest oRequest. var DatabaseCredentialsHandler dbCallback = new DatabaseCredentialsHandler('sports2000'). var FileCredentialsHandler fileCallback = new FileCredentialsHandler('/path/to/certs'). oRequest = RequestBuilder:Get('http://localhost/') :UsingClientCredentials(dbCallback) // first check in the database :UsingClientCredentials(fileCallback)// then check in the files :Request.
Turn off host verification
If HTTPS is used as the communication protocol, the HTTP client verifies the server certificate by default. However, based on your needs, you may want to turn off this verification. To turn off host verification, create a customClientLibrary and set the sslVerifyHost property to NO. For
example:
|
Set TLS ciphers and protocols
An HTTP client begins communication with a server application over HTTPS by negotiating security settings. This includes the selection of a cipher suite — a set of algorithms that determine how keys are exchanged and how messages are encrypted.ClientLibrary and use the SetSSLProtocols() and SetSSLCiphers()
methods as shown in the following example.
|