Prosys OPC Blog

Security Advisory: eMudhra Intermediate CA Compromise (CVE-2026-91403, CVE-2026-114820)

The private keys of eight eMudhra intermediate certificate authorities (CAs) have been compromised (OpenJDK guidance). A Java runtime that trusts the eMudhra root CAs can be made to accept a faked server certificate.

For Java this is tracked as CVE-2026-91403 and CVE-2026-114820, CVSS Base Score 9.1 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N).

The Java runtime bundled with Prosys OPC UA Forge trusts these root CAs, so outbound TLS connections of Forge may be affected. No exploitation in the wild is known as of 26.10.2026. We will publish a Forge release with an updated Java runtime that no longer trusts the affected CAs; until it is available, apply the mitigations described below.

Details

An attacker who holds one of the compromised CA keys can issue a certificate for any host name, and an affected Java runtime accepts it as valid. Forge checks both the certificate chain and the host name, but the faked certificate passes both checks when the connection trusts the Java runtime’s default CA list.

To exploit this, the attacker must also be able to intercept the network traffic between Forge and the server it connects to, for example on the local network, on a compromised router or through DNS manipulation. The attacker can then act as the server towards Forge:

  • Read and modify outbound data: values and events that Forge publishes to MQTT brokers and HTTP endpoints.
  • Capture credentials that Forge sends: MQTT user names and passwords, HTTP credentials and tokens, OAuth2 client credentials, and the user names and passwords of users who log in through an LDAP or Active Directory provider.
  • Inject inbound data: messages from MQTT subscriptions, HTTP responses and OPC UA PubSub subscriptions are written to Forge nodes through their mappings. If such nodes are connected to devices, the injected values can reach the devices.
  • Log in to Forge: an attacker who answers LDAP or Active Directory login requests can accept any password.

The issue does not allow remote code execution, does not affect connections that the attacker cannot intercept, and does not allow decrypting previously recorded traffic.

Prosys OPC UA Products Affected

The Vulnerability Affects Directly

Prosys OPC UA Forge, all released versions, both the installer packages (Windows, Linux) and the Docker images. The bundled Java runtime (Eclipse Temurin 25) trusts the root CAs emSign Root CA – G1, emSign ECC Root CA – G3, emSign Root CA – C1 and emSign ECC Root CA – C3.

Only outbound TLS connections that rely on the Java runtime’s default CA list are affected:

Connection Affected when
MQTT connections (Payload) with SSL/TLS
No CA certificates are selected for the connection
HTTP connections (Payload) over HTTPS
No CA certificates are selected for the connection
OAuth2 token requests of HTTP connections
Always: the token request uses the default CA list
OPC UA PubSub connections over MQTT with SSL/TLS
No CA certificates are selected for the connection
LDAP and Active Directory login providers (ldaps://)
No CA certificates are selected for the provider

Connections that have Disable Certificate Validation enabled do not verify the server at all, regardless of this issue. We recommend turning that option off.

The Vulnerability Might Affect

Prosys OPC UA Simulation Server and Prosys OPC UA Browser bundle a Java runtime that trusts the same root CAs. They are affected only when they connect to an MQTT broker over SSL/TLS for OPC UA PubSub. Their OPC UA connections are not affected. These are testing and development tools that usually run in lab networks, so the practical risk for real incidents is low. Their mitigations are described in Avoiding the Issue in Existing Products.

Not Affected

  • Connections with CA certificates selected: they trust only those certificates.
  • OPC UA client and server connections: they use the application certificate store (PKI), not the Java CA list.
  • The Forge web interface and REST API (HTTPS server).
  • Prosys OPC UA SDK for Java does not bundle a Java runtime. Applications built with it use the CA list of the Java runtime they run on, for example in OPC UA PubSub over MQTT with SSL/TLS when the application does not provide its own socket factory.

Avoiding the Issue in Existing Products

Prosys OPC UA Forge

Until the fixed Forge release is available, use one or both of the following mitigations. Mitigation 2 covers every connection, including OAuth2 token requests.

Mitigation 1: Select CA Certificates for Each TLS Connection

In the configuration of each affected MQTT, HTTP, OPC UA PubSub and LDAP / Active Directory connection, select the CA certificates that issued the server’s certificate. The connection then trusts only those certificates and ignores the Java runtime’s CA list. This setting is kept when Forge is updated. It does not cover OAuth2 token requests.

Mitigation 2: Remove the eMudhra Root CAs from the Bundled Java Runtime

The commands below delete the four eMudhra root CAs from the CA list of the Java runtime bundled with Forge. Run them with administrator (root) rights and restart Forge afterwards.

Windows

(PowerShell as Administrator, default installation folder):
Go to the installation folder and back up the CA list:

				
					cd "C:\Program Files\ProsysOPC\Prosys OPC UA Forge"
				
			
				
					Copy-Item jre\lib\security\cacerts jre\lib\security\cacerts.bak
				
			

Delete the four root CAs:

				
					.\jre\bin\keytool.exe -delete -keystore jre\lib\security\cacerts -storepass changeit -alias "cn_emsign_root_ca__g1,o_emudhra_technologies_limited,ou_emsign_pki,c_in [jdk]"
				
			
				
					.\jre\bin\keytool.exe -delete -keystore jre\lib\security\cacerts -storepass changeit -alias "cn_emsign_ecc_root_ca__g3,o_emudhra_technologies_limited,ou_emsign_pki,c_in [jdk]"
				
			
				
					.\jre\bin\keytool.exe -delete -keystore jre\lib\security\cacerts -storepass changeit -alias "cn_emsign_root_ca__c1,o_emudhra_inc,ou_emsign_pki,c_us [jdk]"
				
			
				
					.\jre\bin\keytool.exe -delete -keystore jre\lib\security\cacerts -storepass changeit -alias "cn_emsign_ecc_root_ca__c3,o_emudhra_inc,ou_emsign_pki,c_us [jdk]"
				
			

Check that no eMudhra root CA remains (the command should print nothing):

				
					.\jre\bin\keytool.exe -list -keystore jre\lib\security\cacerts -storepass changeit | Select-String -Pattern emsign
				
			

Linux

Go to the installation folder (default installation folder /opt/prosys-opc-ua-forge) and back up the CA list:

				
					cd /opt/prosys-opc-ua-forge
				
			
				
					cp jre/lib/security/cacerts jre/lib/security/cacerts.bak
				
			

Delete the four root CAs:

				
					jre/bin/keytool -delete -keystore jre/lib/security/cacerts -storepass changeit -alias "cn_emsign_root_ca__g1,o_emudhra_technologies_limited,ou_emsign_pki,c_in [jdk]"
				
			
				
					jre/bin/keytool -delete -keystore jre/lib/security/cacerts -storepass changeit -alias "cn_emsign_ecc_root_ca__g3,o_emudhra_technologies_limited,ou_emsign_pki,c_in[jdk]"
				
			
				
					jre/bin/keytool -delete -keystore jre/lib/security/cacerts -storepass changeit -alias "cn_emsign_root_ca__c1,o_emudhra_inc,ou_emsign_pki,c_us [jdk]"
				
			
				
					jre/bin/keytool -delete -keystore jre/lib/security/cacerts -storepass changeit -alias "cn_emsign_ecc_root_ca__c3,o_emudhra_inc,ou_emsign_pki,c_us [jdk]"
				
			

Check that no eMudhra root CA remains (the command should print nothing):

				
					jre/bin/keytool -list -keystore jre/lib/security/cacerts -storepass changeit | grep -i emsign
				
			

Docker

Changes made inside a running container are lost when the container is recreated. Build a derived image instead and run Forge from it:

Create a file named Dockerfile with the following two lines, replacing <version> with your Forge version:

				
					FROM prosys-opc-ua-forge:<version>
				
			
				
					RUN keytool -delete -cacerts -storepass changeit -alias "cn_emsign_root_ca__g1,o_emudhra_technologies_limited,ou_emsign_pki,c_in [jdk]" && keytool -delete -cacerts -storepass changeit -alias "cn_emsign_ecc_root_ca__g3,o_emudhra_technologies_limited,ou_emsign_pki,c_in [jdk]" && keytool -delete -cacerts -storepass changeit -alias "cn_emsign_root_ca__c1,o_emudhra_inc,ou_emsign_pki,c_us [jdk]" && keytool -delete -cacerts -storepass changeit -alias "cn_emsign_ecc_root_ca__c3,o_emudhra_inc,ou_emsign_pki,c_us [jdk]"
				
			

Build the image in the folder of the file and use it instead of the original image when you run Forge:

				
					docker build -t prosys-opc-ua-forge:<version>-emudhra .
				
			

Check that no eMudhra root CA remains in the new image (the command should print nothing):

				
					docker run --rm --entrypoint keytool prosys-opc-ua-forge:<version>-emudhra -list -cacerts -storepass changeit | grep -i emsign
				
			

Restart Forge after the change. In Docker, recreate the container from the new image. Note the following:

  • Repeat Mitigation 2 after every Forge update or reinstallation until you have installed the fixed release, because the update replaces the bundled Java runtime.
  • The commands in OpenJDK’s guidance use different certificate names (for example emsignrootcag1 [jdk] ). On the Java runtime bundled with Forge they report that the alias does not exist and remove nothing. Use the names above.
  • Servers whose certificate is issued under an eMudhra root CA are no longer trusted after Mitigation 2. Select their CA certificates explicitly (Mitigation 1) if you need to keep connecting to them.
  • We do not recommend enabling Java’s online certificate revocation checking as a mitigation in plant networks: if the revocation servers cannot be reached, all TLS connections fail.
  • Keep Disable Certificate Validation and Disable Hostname Verification turned off.

Prosys OPC UA Simulation Server and Browser

To avoid the issue, set the broker’s CA certificate for the PubSub connection, or remove the eMudhra root CAs from the Java runtime in the jre folder of the installation. Run the commands in the installation folder with administrator (root) rights; in each pair, the first command is for Linux and the second for Windows PowerShell.

List the eMudhra root CAs:

				
					jre/bin/keytool -list -keystore jre/lib/security/cacerts -storepass changeit | grep -i emsign
				
			
				
					.\jre\bin\keytool.exe -list -keystore jre\lib\security\cacerts -storepass changeit | Select-String -Pattern emsign
				
			

Delete each listed root CA, replacing <name> with its name as shown before the date, for example

cn_emsign_root_ca__g1,o_emudhra_technologies_limited,ou_emsign_pki,c_in [jdk] :

				
					jre/bin/keytool -delete -keystore jre/lib/security/cacerts -storepass changeit -alias "<name>"
				
			
				
					.\jre\bin\keytool.exe -delete -keystore jre\lib\security\cacerts -storepass changeit -alias "<name>"
				
			

Restart the application afterwards.

Fixed Products

The next Prosys OPC UA Forge release removes trust in the affected eMudhra root CAs by bundling an updated Java runtime, in both the installer packages and the Docker images. We will update this advisory with the version number and a link to the release notes when it is available, and we recommend everyone to update.

Prosys OPC UA Simulation Server and Prosys OPC UA Browser will also be updated with a fixed Java runtime.

Mitigation 1 stays in effect after the update; Mitigation 2 is no longer needed once the fixed release is installed.

More Security Information

The announced security issues of Prosys OPC products are listed in our blog under the #Security tag. If you have any questions or comments, please contact us at sales@prosysopc.com or through our contact form.

Related Posts

Run Prosys OPC UA Simulation Server Headless and in Docker

Run Prosys OPC UA Simulation Server Headless and in Docker Prosys OPC UA Simulation Server 2026.2.0 adds a headless mode and a container image, so the server can run on a build agent, a shared test machine or in Kubernetes. This makes it easy to use in automated tests and CI/CD pipelines. This guide covers: Preparing a Project on the desktop Starting the headless server in Docker Connecting with and without security Licenses, certificates and saved state Controlling playback and simulation over OPC UA with the ServerControl Object What you need Prosys OPC UA Simulation Server 2026.2.0 or later, to

Read More »

Interested in this topic?

Just leave a message and we’ll get in touch