Enabling TLS Encryption on a PubSub+ Broker – Technical Guide

Secure communication between clients and your messaging broker is critical in modern distributed systems. Transport Layer Security (TLS) protects data in transit from eavesdropping and tampering by encrypting the connection between clients and the broker. In this guide, you’ll learn how to generate certificates, configure TLS on a Solace PubSub+ broker, and validate secure connections.

1. Overview

PubSub+ supports TLS encryption (e.g., TLSv1.1 and TLSv1.2) for secure client connections. This guide focuses on server-side authentication only (the broker authenticating to clients).

2. Certificate and Key Generation

Before enabling TLS, you must create the cryptographic materials:

2.1 Generate a Private Key (RSA 2048 bit)

Use OpenSSL to create a password-protected RSA private key in PEM format:

openssl genpkey -algorithm RSA \
  -aes-256-cbc \
  -out private_key.pem \
  -pkeyopt rsa_keygen_bits:2048

You will be prompted for a passphrase — make sure to record it.

2.2 Extract Public Key

From the private key, export the public key. You will need this later:

ssh-keygen -e -f private_key.pem > public_key.pem

Again you will enter the passphrase you set earlier.

2.3 Create a Certificate Signing Request (CSR)

Generate a CSR to issue a certificate:

openssl req -new -key private_key.pem -out certificate.csr

You will be asked to complete the Distinguished Name (DN) attributes (e.g., Common Name, Organization). Use your broker’s real hostname in Common Name (CN) — this ensures hostname verification works during TLS handshakes.

2.4 Generate the TLS Certificate

You can use the CSR to create a self-signed certificate (for testing), or send the CSR to a CA (recommended for production).

For a self-signed certificate:

openssl x509 -req -in certificate.csr \
  -signkey private_key.pem \
  -days 365 \
  -out server_certificate.pem

This results in a PEM-encoded TLS certificate valid for one year.

3. Prepare the PubSub+ Broker

TLS on PubSub+ requires the certificate file and key to be available in the broker’s certificate directory (/usr/sw/jail/certs)

4. Configure TLS on Solace PubSub+

4.1 Load the Certificate File

Transfer the certificate file to the broker’s /certs directory, for example using SFTP:

solace# copy sftp://admin@<host-ip>/server_certificate.pem /certs/server_certificate.pem

Replace <host-ip> and credentials as appropriate.

4.2 Set the Server Certificate

In the broker CLI:

solace(configure)# ssl
solace(configure/ssl)# server-certificate server_certificate.pem

This tells the broker to use that certificate for all TLS connections. Solace

⚠️ Only one TLS certificate can be active at a time.

4.3 Cipher Suite (Optional, Recommended)

Solace supports selecting specific cipher suites. For example:

solace(configure/ssl)# cipher-suite msg-backbone name AES256-SHA

This forces a secure symmetric cipher for session encryption.

5. Client-Side Requirements

5.1 Trust Store

Clients must trust the CA that signed the server’s certificate. For self-signed certificates, distribute the root certificate to all clients’ trust stores. If using a public CA, clients will automatically trust the certificate.

5.2 Secure Connection URI

Instead of using plaintext connections like:

tcp://broker.example.com:55555

Clients must connect over TLS, e.g.:

tcps://broker.example.com:55443

Where tcps:// indicates TLS transport.

6. Verify the Setup

Once TLS is enabled, attempt a secure connection from a client using TLS-enabled APIs (e.g., Solace Messaging APIs or MQTT with TLS support):

  • Confirm that the TLS handshake completes
  • Ensure the client validates the server certificate and hostname
  • Observe that plaintext connections are rejected

Tools like openssl s_client can also be used for validation:

openssl s_client -connect broker.example.com:55443 \
  -CAfile rootCA.pem

If the certificate is trusted and connection succeeds, you should see handshake details and certificate information.

Regards
Osama

Case study for software architect

Problem Description


We have two separate applications that we would like to integrate together. One is a WYSIWYG application for generating static websites. The other is an admin application for managing an online shopping site. We would like to be able to use the features of the Website Builder to design pages in the Webshop. In addition, we would also like to be able to manage product details (name, price, images, etc.) while updating Webshop pages in the Website Builder.

Website Builder Details

The Website Builder is a single page app written in React. It is mostly served by a monolithic backend with a few services for select features. The app follows a component-driven architecture using Redux for application state management. Each static page in a user’s website is composed of components. Each component is responsible for rendering the view within its container and for supplying the callbacks for displaying its settings panel. The settings panel is unique per component but may share various individual controls for certain
settings (eg: background color, fonts).


When the user is ready to publish their site, the publication service will generate static assets for each page. The Webshop is one component in the Website Builder. When a Webshop is included on a page, a JavaScript snippet is included in the generated HTML.

Webshop Details


The Webshop has 2 parts: the admin portion is a single page app written in KnockoutJS. It is in the process of being rewritten in React. The second portion is the public-facing shop front, also a Knockout application written in KnockoutJS. The admin application lists products, orders, and other management details. The Webshop backend is quite similar to the Website Builder – monolithic aside from a few minor services for certain features.

The documentation is HERE

Cheers


Osama

adop exiting with status = 255 (Fail)

[oracle@ebsnew appl]$ adop phase=abort

Enter the APPS password:
Enter the SYSTEM password:
Enter the WLSADMIN password:

 Please wait. Validating credentials…

Enter the RUN file system context file name [/u01/oracle/EBSTST/fs1/inst/apps/EBSTST_ebsnew/appl/admin/EBSTST_ebsnew.xml]:

Enter the PATCH file system context file name [/u01/oracle/EBSTST/fs2/inst/apps/EBSTST_ebsnew/appl/admin/EBSTST_ebsnew.xml]:

[STATEMENT] [END   2016/11/22 17:15:45] Performing verification of parameters
[STATEMENT] [START 2016/11/22 17:15:45] Checking for the required ENV setup
[STATEMENT] [END   2016/11/22 17:15:45] Checking for the required ENV setup

************* Start of  session *************
 version: 12.2.0
 started at: Tue Nov 22 2016 17:15:45

APPL_TOP is set to /u01/oracle/EBSTST/fs1/EBSapps/appl
[STATEMENT] [START 2016/11/22 17:15:45] Determining admin node
[STATEMENT] [END   2016/11/22 17:15:47] Determining admin node
[STATEMENT] [START 2016/11/22 17:15:49] Acquiring lock on sessions table
[STATEMENT] [END   2016/11/22 17:15:50] Acquiring lock on sessions table
[STATEMENT] [START 2016/11/22 17:15:50] Checking for any pending sessions
[STATEMENT] There is already a hotpatch session which is incomplete. Details are:
[STATEMENT]     Session Id: 2
[STATEMENT]     Prepare phase status: X
[STATEMENT]     Apply phase status: P
[STATEMENT]     Cutover  phase status: R
[STATEMENT]     Abort phase status: X
[STATEMENT]     Session status: F
[STATEMENT] [Note: Y denotes that the phase is done
[STATEMENT]        N denotes that the phase has not been completed
[STATEMENT]        X denotes that the phase is not applicable
[STATEMENT]        R denotes that the phase is running (in progress) or ran
[STATEMENT]        F denotes that the phase has failed
[STATEMENT]        P (is applicable only to APPLY phase) denotes atleast
[STATEMENT]           one patch is already applied for the session id
[STATEMENT] Online patching tool cannot proceed when a previous patching session is incomplete
[STATEMENT] Please ensure no pending patching sessions exist before trying a new patch
[ERROR]     Unrecoverable error occured. Exiting the current session.
[STATEMENT] [START 2016/11/22 17:16:08] Unlocking sessions table
[STATEMENT] [END   2016/11/22 17:16:09] Unlocking sessions table
[STATEMENT] Log file: /adop_20161122_171500.log
[STATEMENT] [START 2016/11/22 17:16:11] Unlocking sessions table
[STATEMENT] [END   2016/11/22 17:16:12] Unlocking sessions table
Can’t call method “close” on an undefined value at /u01/oracle/EBSTST/fs1/EBSapps/appl/au/12.0.0/perl/ADOP/Phase.pm line 239.

adop exiting with status = 255 (Fail)

I tried different thing but we run the abort again it’s working , and do the following as well.

Run Autoconfig
run adop phase=fs_clone

Thanks.

Installing SIEBEL 15 on RAC took a lot of time

The Situation like the following when we was trying to install SIEBEL On RAC 12C its took 10 hours for importing 2 database which is usually takes 2 hours at max, storage was NFS , enabled DNFS for sure.

simulate the following case :-

  • On single node , 2 hours like usual.
  • On RAC 12c using DNFS file system 10 hours.
  • On RAC 12c using DNFS but single node of RAC took 10 hours.
  • On RAC 12c using local file system and single node 10 hours.
  • Install oracle 11gR2 RAC and try it again took 4 hours using ASM on DNFS.

Using SLOB didn’t see anything related to storage issue.

After investigation and a lot of working without tuning on 12c it’s took 1 Hour and 37 min.

The problem with two different way :-

  • Heartbeat not configured correctly.
  • SIEBEL Installation should not run with Index parallel option.
Thanks
Osama.

Install Oracle EBS R12.2 StartCD 51 on RAC

this post is questionnaire more than a technical, EBS startCD 51 released before 1 month and it’s comes with different features such as DB 12c will be installed and it’s support RAC installation Features immediately which mean you don’t have to install EBS on Single node then convert to RAC.

Like the above pic, well everything done successfully for DB installation without any problem same as below :-

The installation is multi – node which mean Apps on different server, when trying to connect APPS to RAC DB each time the same error appered with no sense which is 
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
Be noted that the DB is reigster with SCAN and tnsping is working , and i can access DB using TOAD thru SCAN or Local Listener
Therefore after multi try of the installation and fix the error, i choose the old way which is Single node and covert to RAC and the funny thing it’s working without any issue.
If there is any idea about this error please comment below maybe i missed something 
Thanks
Osama

Unable to retrieve config file from Database

The above error shown up when trying to install APPS and connect it to the RAC/single database to fix this issue Just copy the configuration file after the installation is done successfully under the path :- /ebs1stag/oracle/SEBSDB/12.1.0/appsutil for example  the file name usually conf_SEBSDB.txt and load the file, try again.
Thank you
Osama

oracle.security.jps.wls.listeners.JpsApplicationLifecycleListener’ Class not Found

Aug 24, 2016 2:23:57 PM weblogic.nodemanager.server.AbstractServerManager log
INFO: Server output log file is ‘/u01/Oracle/Middleware/domains/mserver/STAGEDQ/servers/EDQ_INS1_SIPEDQ1/logs/EDQ_INS1_SIPEDQ1.out’

java.io.IOException: Server failed to start up. See server output log for more details.
        at weblogic.nodemanager.server.AbstractServerManager.start(AbstractServerManager.java:196)
        at weblogic.nodemanager.server.ServerManager.start(ServerManager.java:23)
        at weblogic.nodemanager.server.Handler.handleStart(Handler.java:609)
        at weblogic.nodemanager.server.Handler.handleCommand(Handler.java:121)
        at weblogic.nodemanager.server.Handler.run(Handler.java:71)
        at java.lang.Thread.run(Thread.java:745)
Aug 24, 2016 2:26:00 PM weblogic.nodemanager.server.Handler handleStart
WARNING: Exception while starting server ‘EDQ_INS1_SIPEDQ1’
java.io.IOException: Server failed to start up. See server output log for more details.
        at weblogic.nodemanager.server.AbstractServerManager.start(AbstractServerManager.java:196)
        at weblogic.nodemanager.server.ServerManager.start(ServerManager.java:23)
        at weblogic.nodemanager.server.Handler.handleStart(Handler.java:609)
        at weblogic.nodemanager.server.Handler.handleCommand(Handler.java:121)
        at weblogic.nodemanager.server.Handler.run(Handler.java:71)
        at java.lang.Thread.run(Thread.java:745)

The above is EDQ Cluster Error, Fresh installation after searching inside the logs i found the following :-

‘oracle.security.jps.wls.listeners.JpsApplicationLifecycleListener’ Class not Found

This is simply happened because StartScriptEnabled property in nodemanager.properties file was set to ‘false’. therefore must set to true

adstpall.sh: Database connection could not be established. Either the database is down or the APPS credentials supplied are wrong.

trying to startup EBS R12.2. with the following error :-

adstpall.sh: Database connection could not be established. Either the database is down or the APPS credentials supplied are wrong.

to solve this do the following :-

[oracle@tiperp tsterp]$ cd $APPL_TOP
[oracle@tiperp appl]$ pwd
/u01/app/product/tsterp/fs1/EBSapps/appl

after souring the environment try to startup the EBS again. 
Thank you 
Osama