Document 1591073.1
Document 1591073.1
1
Copyright (c) 2025, Oracle. All rights reserved. Oracle Confidential.
Signing JAR Files for Oracle E-Business Suite Release 12 (Doc ID 1591073.1)
This document describes how to sign Oracle E-Business Suite (EBS) desktop client Java Archive (JAR) files, using code
signing certificates from either a Commercial CA or a Private CA.
Note: As of August 2024, this document has been completely rewritten to describe the configurable options that are
now available for JAR signing. For the previous content, refer to My Oracle Support Knowledge Document 3015098.1.
The instructions provided are supported for use with Oracle E-Business Suite Release 12.
This Document 1591073.1 is updated as required. All updates are noted in the change log.
Note: To receive automatic notifications of updates, subscribe to the Hot Topics Notification feature in My Oracle
Support, as described in Document 793436.2, Subscribing to Hot Topic E-Mails.
In This Document
Section 1: Introduction
Section 2: Required Java Versions
Section 3: Required EBS Patches
Section 4: New Features
Section 5: Signing the Desktop JARs
5.1 Using a Private CA for Code Signing
5.1.1. Create Your Code Signing Keystore
5.1.2. Register Your Code Signing Keystore with AD
5.1.3. Configure JRE Client Trust
5.2 Using a Commercial CA for Code Signing
5.2.1 AD_SIGN_MODE is CUSTOM
5.2.2 AD_SIGN_MODE is NONE
Section 6: Setting up a Custom Signing Process to Use with an HSM
Section 7: Setting up a Custom Signing Process to be Called from AD Tools
7.1 Testing Your Own Signing Script
Section 8: References
Appendix A: Creating a Minimally Viable Private CA for JAR Signing
A1. Create a Private CA Using keytool
A1.1. One-Time CA Initialization
A1.2. CA Operations
A2. Create a Private CA Using openssl
A2.1. One-Time CA Initialization
A2.2. CA Operations
A3. Create a Private CA Using OCI Certificates service
Appendix B: Desktop JRE Configuration
B1. Making the Desktop JRE Trust Your Private CA - User Level
B2. Allowlisting EBS JARs via Exception Site List - User Level
B3. Allowlisting EBS JARs via Deployment Rule Set - System Level
B4. Example Desktop JRE Configuration
Appendix C: Using the adjss Utility for Configurable JAR Signing
Appendix D: Identifying JARs That Need Signing
Section 1: Introduction
The Java code that runs on the desktop (EBS client tier) is downloaded from EBS as JAR files (often just called JARs).
These files need to be signed by a certificate from a Certificate Authority (CA) that is trusted by the Java code on the
desktop.
The granular patching approach used by EBS means that the JARs used on the desktop may change when EBS is patched.
This requires the changed or updated JARs to be signed on your EBS application tier after patching, and prior to the
updated environment being released to users.
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 1/29
3/20/25, 12:36 PM Document 1591073.1
The Java Runtime Environment (JRE) is the Java component that runs on the EBS desktop tier.
JRE 8 is recommended and required for Java Web Start (See Document 2188898.1, Using Java Web Start
with Oracle E-Business Suite.)
The Java Development Kit (JDK) is the Java component that runs on the EBS application tier.
JDK 7 is recommended for the application tier.
Java 7 and Java 8 updates are released on the quarterly Critical Patch Update (CPU) schedule, and the most recent update
of each is supported for use with EBS. To be able to use the JAR signing configuration described in this document, you
must at a minimum install JRE 1.8.0_411 (April 2024) on all desktops, and JDK 1.7.0_421 (April 2024) on your application
tier. For more information, refer to My Oracle Support Knowledge Document 3007752.1, Oracle E-Business Suite Release
12.2 Critical Patch Update Availability Document (April 2024).
Oracle recommends that you apply the latest JRE and JDK updates at the earliest opportunity. To find the latest updates,
refer to My Oracle Support Knowledge Document 2484000.1, Identifying the Latest Critical Patch Update for Oracle E-
Business Suite Release 12 and identify the latest quarterly CPU knowledge document. In that document, navigate to "Table
3: Security Patches for Technology Stack Components With a New Patch in This CPU" to see the latest JRE and JDK
updates available.
12.2
General prerequisite patches:
Note: You must apply this patch and complete the patching cycle before applying the rest of the
patches listed below.
12.1
General prerequisite patches:
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 2/29
3/20/25, 12:36 PM Document 1591073.1
With the new adjss utility, the signing mode can be set to one of the following three values:
KEYSTORE - Sign using local disk based keystore file, use the keytool command to create the keystore file.
NONE - AD will not sign JARs. AD will produce jarlist.txt and optionally customjarlist.txt.
CUSTOM - Same as NONE, but AD will call a new customjarsign.sh script that has your own signing
implementation.
The KEYSTORE mode can only be used with a private certificate authority. If you are using a new commercial certificate
authority, either NONE or CUSTOM mode must be specified. If you are currently using a Hardware Security Module (HSM)
for signing, you can run adjss to set the signing mode to NONE. See Section 5 for details.
The benefit of using a certificate from Commercial CA is that the Java 8 JRE on the desktop by default will trust the
commercial CA's root certificate. If using a certificate from private CA, the root certificate of that private CA must be added
as a trusted certificate in the truststore of the desktop JRE.
Irrespective of the chosen CA, the signing of updated JARs was automatically done by the EBS patch tool and when using
adadmin to regenerate the JARs. The EBS server does not look at the code signing certificate. Only the desktop JRE will
validate the signature of the downloaded client JARs.
Starting in the summer of 2023, the commercial CAs changed their policy and ceased to issue code signing certificates
where your private key was kept in a disk file such as the Java KeyStore (JKS) file used by EBS JAR signing tools. In
essence, the private key used for code signing now needs to be kept in a Hardware Security Module. For details, refer to
applicable communications from the relevant commercial CAs.
As an Oracle E-Business Suite customer, your choices for JAR signing are now either (a) or (b) below:
a. Use a private CA issued code signing certificate and keep using existing AD tools.
b. Use a commercial CA issued code signing certificate, and implement a custom signing process that satisfies the
commercial CA's requirements.
Be aware that is not necessary for others outside your organization to trust your EBS JARs. These JARs only need to be
trusted by your internal users, and specifically the subset of internal users that need to run Oracle Forms.
Similarly, the JRE on Forms users' desktops probably only needs to run JARs from EBS. Allowing the JRE to run Java from
anywhere else does not improve security (and there may be licensing issues with doing so).
To use Private CA for Code Signing, you will need to set up a Private CA if you do not already have one. See Appendix A for
some basic examples.
You will create the AD code signing keystore by following these steps:
The keystore will be created using Java's keytool command. The keytool documentation is available at
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html.
Decide on the location of your code signing keystore file, and set that as your current directory.
Traditionally, AD has stored the keystore file (adkeystore.dat) in a release-specific location as follows:
12.2 $APPL_TOP_NE/ad/admin
12.1 $APPL_TOP/admin
However, you can chose any directory available to the AD tools when patching or running adadmin.
Note: We recommend that you copy the following commands to a file in the current directory and adjust the variables
for your organization, and run the commands from your own file. That way you will have documentation of what you
actually did which will be handy when you have to redo any of the steps, either for complete keystore replacement or
for certificate renewal.
Note: The variables above contain keystore passwords in environment variables. If you would rather be prompted to
type the passwords, do not set those variables, and omit the -storepass and -keypass arguments in the commands
below. For reference, a brief description is shown at the end of each command.
You now need to set variables describing the code signing certificate's distinguished name.
Note: Do not include commas in the values, unless you are prepared to escape them when using keytool.
Then create the keystore with the private/public key pair, choosing 'pkcs12' to avoid warnings:
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 4/29
3/20/25, 12:36 PM Document 1591073.1
Next, provide the CSR file to the private CA and wait to receive the code signing certificate and any required chain
certificates.
Once you have received the certificate(s) in PEM format, import them into the $KS keystore file.
The number of files and names of the received certificate files are determined by your private CA.
The example below assumes you received the following aptly named certificate files: privateCAroot.crt,
privateCAchain.crt, and ebsjarsign.crt.
Combine the code signing certificate and its intermediate chain certificates (the identity) into a single file:
Now add this file as the trusted identity for your PrivateKeyEntry:
If you want to use the jarsigner command to verify a signed JAR, you can tell jarsigner -verify to use this keystore
during verification.
List the completed code signing keystore by running the following command:
With the code signing keystore holding the private key and the signed code signing certificate, it is ready to be used for
signing your EBS client JARs.
For the signing to work, you must register the information about your keystore so the AD signing code can access it. You
do that by running the adjss utility:
$ echo $SP $KP # remind yourself of the chosen keystore password(s); adjss wants to know.
adjss will prompt for the storepass ($SP) and keypass ($KP) and store them in the database. To do that, it will also
prompt for the APPS password.
The server side of the JAR signing setup is now complete, with the default signing mode of KEYSTORE.
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 5/29
3/20/25, 12:36 PM Document 1591073.1
Note: Once you have configured the signing mode to be KEYSTORE, one of the cloning steps will be different. Refer
to Step 1, Copy JAR signing files from source instance, in Section 4 of My Oracle Support Knowledge Document
1383621.1, Cloning Oracle E-Business Suite Release 12.2 with Rapid Clone.
You can view and verify setup of the signing mode by using the -list and -verify options of adjss.
For example:
$ adjss -verify
SIGNING MODE : KEYSTORE
Enter APPS password:
keystore file : /home/oracle/tst/ebsjarsign.jks
keystore alias : ebsjarsign
keystore password : stored in database
keystore key password : stored in database
jarsigner sigfile : CUST
Before you use adadmin to force regeneration of EBS JARs and signing of client JARs, you must ensure that the client JREs
on the end-user desktops trust the CA that signed the client JARs.
Note:
If you have multiple EBS environments, you can reuse the same code signing keystore file across them all by
copying the keystore file in place and registering it using adjss.
If you have multiple EBS application tiers without a shared file system, you can copy the keystore files
(adsignmode.txt, adsignparameters.txt, and adkeystore.dat) to the same full path location on the new
node.
The privateCAroot.crt certificate received from the private CA must be trusted by the desktop JREs on each desktop
that must run Oracle Forms. This is required for the JRE to successfully verify the JAR signature.
Adding the trust of the private root CA can be done in one of the following ways:
Each Oracle Forms user downloads the rootCA certificate and installs it using the Java Control Panel.
A centrally prepared trust file file can be downloaded to each desktop.
Centralized desktop device management software can be used to push the root certificate - and JRE updates as
well.
If you want to have individual users interactively trust the private CA, you can provide a page with instructions on the EBS
web server.
$ mkdir $INST_TOP/portal/jre8/
$ cp privateCAroot.crt $INST_TOP/portal/jre8/rootca.crt
$ cp html-page-with-instructions.html $INST_TOP/portal/jre8/
An example of the instructions can be found in Appendix B, Section B4, "Example Desktop JRE Configuration". The
instructions there assume that a Deployment Rule Set (Appendix B, Section B3) is also deployed.
If you choose to use a commercial CA for the code signing certificate, you must:
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 6/29
3/20/25, 12:36 PM Document 1591073.1
You will implement your custom signing in the customjarsign.sh script, and place it in $APPL_TOP_NE/ad/admin/.
AD will call the custom script in the places where it would normally have signed the JARs using the KEYSTORE mode.
EBS ships sample scripts called customjarsign.sh (for UNIX) and customjarsign.cmd (for Windows) that contain
example code you can use as the basis of your chosen signing solution. The script will be called from AD with the name of
a file, jarlist.txt, that contains JAR files identified by their full pathname. The script must sign each JAR file, and the
result must overwrite the unsigned JAR.
Note: Once you have configured the signing mode to be CUSTOM, one of the cloning steps will be different. Refer to
Step 1, Copy JAR signing files from source instance, in Section 4 of My Oracle Support Knowledge Document
1383621.1, Cloning Oracle E-Business Suite Release 12.2 with Rapid Clone.
The patch places the shipped sample script in the following location:
EBS
Full UNIX Pathname Full Windows Pathname
Release
Once you have developed and tested your customjarsign.sh script. set AD Jar signing into CUSTOM mode by calling
adjss:
adjss will verify the existence of $APPL_TOP_NE/ad/admin/customjarsign.sh before setting CUSTOM mode.
EBS tools will display a message to remind you to sign any updated JARs when the automatic JAR signing has been
disabled.
The AD tools will regenerate the JARs as part of patching, and will also generate a file jarlist.txt that lists the JARs in
need of signing. If you have added custom code that is being signed, AD tools will optionally generate
customjarlist.txt, listing the custom JAR named $OA_JAVA/customall.jar by default.
You will use the jarlist file(s) to identify the JARs that must be signed by your custom commercial CA solution.
You can use the following command to merge the jarlist.txt generated during multiple patching cycles:
Your signing tool will have to sign each of the JARs indicated in jarlist.txt, and the signed JARs must overwrite the
unsigned JARs at the same location.
The EBS Release 12.2 adop phase=finalize command will display warning messages if the JARs have not been signed,
but the cutover phase will still be allowed to run.
Note: If you do not sign the required JAR files, users will not be able to run Oracle Forms applications.
When adadmin generates jarlist.txt, and optionally customjarlist.txt, they are created in the following location:
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 7/29
3/20/25, 12:36 PM Document 1591073.1
12.2 $NE_BASE/EBSapps/log/adadmin/log/jarlist.txt
12.1 $APPL_TOP/admin/$TWO_TASK/log/jarlist.txt
When the patch tool generates jarlist.txt, it will be created in the log directory for that patching cycle:
12.2 $NE_BASE/EBSapps/log/adop/*/*/*/*/<patch#>/log/jarlist.txt
12.1 $APPL_TOP/admin/$TWO_TASK/log/jarlist.txt
You can use the following commands to merge the jarlist.txt generated during multiple patching cycles:
$ cd $NE_BASE/EBSapps/log/adop/*/*/*/*/
$ find . -name jarlist.txt | xargs cat | sort -u
For more information about your Java customizations and and customjarlist.txt, refer to My Oracle Support Knowledge
Document 1577661.1, Developing and Deploying Customizations in Oracle E-Business Suite Release 12.2.
The commercial CA may accept some forms of existing HSM devices in your possession, or will sell you an HSM that could
be a USB-stick like device. You will need to check the offerings from your chosen commercial CA.
If acquiring a HSM you will most likely be implementing a single, central signing service on a host that can reach the HSM-
based private key. Once the HSM and supporting software has been installed, you will have to decide how the EBS client
JARs will be sent to the signing server and then back to EBS. A directory holding the JARs could be made accessible to the
signing server (NFS mount), or the signing server could have a REST service that accepts a unsigned JAR and returns a
signed JAR.
Some commercial CAs also offer a cloud-based signing service, where the JARs never leave the EBS application tier. A
cloud-enhanced JAR signer runs on the application tier, and the META-INF file with the hashes of the included files is sent
to the cloud service for signing by an acceptably stored key. The application tier local JAR signer program then puts the
signed META-INF file in the JAR. The cloud service keeps a record of who signed what and when.
EBS ships a sample script called customjarsign.sh.sample. You will need to create your own customjarsign.sh script,
which you can base on this script. An example is shown below.
The script ships with a signjar_custom function that does nothing except print the name of the JAR it should sign.
There is a sample signjar_keystore function that builds on the old-style adkeystore.dat + adsign.txt files and
adds a timestamp.
There is a signjar_pkcs11 function that resembles what it might take to sign with a DigiCert commercial code
signing certificate. This has not been tested, but is based on publicly available information at https://digicert.com.
customjarsign.sh.sample
#! /bin/bash
# Code signing script to sign client jars using custom process.
# This script will be called from AD patch tools and from adadmin when AD_SIGN_MODE is CUSTOM.
# This script will be called by AD with the full pathname of the jarlist.txt file.
# The jarlist.txt file contains full pathnames of JARs that must be signed, one per line.
# this script must exit 0 upon success and something else in case of error.
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 8/29
3/20/25, 12:36 PM Document 1591073.1
# This script should do its own logging (transcript error and debug).
# This sample script simply writes to stdout and stderr.
if [ ! -r "$jarlist" ] ;then
errexit "Cannot read jarlist file '$jarlist'"
fi
# This test function relies on an already configured native JAR signing setup.
# Adjust keystore passwords if not default.
export AD_KEYSTORE_SPASS="puneet"
export AD_KEYSTORE_KPASS="myxuan"
ztsaurl="http://timestamp.digicert.com"
zproxyhost="www-proxy"
zproxyport=80
timestamp="-tsa ${ztsaurl} -J-Dhttp.proxyHost=${zproxyhost} -J-Dhttp.proxyPort=${zproxyport}"
return $?
}
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 9/29
3/20/25, 12:36 PM Document 1591073.1
# This test function assumes Digicert PKCS11 signing cloud service
# You will have to install the code and set parameters provided by Digicert
# Other commercial CAs have similar PKCS11 solutions
zproxyhost="www-proxy"
zproxyport=80
timestamp="-tsa $AD_PKCS11_TIMESTAMP -J-Dhttp.proxyHost=${zproxyhost} -J-Dhttp.proxyPort=${zproxyport}"
# set variables required by the the DLL or SO that implements the PKCS11 provider
export SM_HOST=https://clientauth.one.digicert.com
export SM_API_KEY=""
export SM_CLIENT_CERT_FILE=idkeystore.p12
export SM_CLIENT_CERT_PASSWORD=""
return $?
}
# MAIN processing
#-------------------------------------------------------------------------------
pgm=$(basename "$0")
pgm=$0
case $# in
1 ) : ;; # one and only parameter is the pathname of jarlist.txt
* ) usage ;;
esac
signjars "$1" # sign all JARs in input file, exits in case of error
exit $?
# END of customjarsign.sh
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 10/29
3/20/25, 12:36 PM Document 1591073.1
Testing Your Own Signing Script
Once you have used this sample as the basis for your own customjarsign.sh script, you can test your efforts as follows.
3. Prepare jarlist.txt:
4. Run your customjarsign.sh script. Here, it is an unmodified copy of the customjarsign.sh.sample that uses the
DUMMY signjar_custom function:
$ ./customjarsign.sh $PWD/jars/jarlist.txt
INFO: Validated read/write-ability of 1 JAR files from
'/u01/install/APPS/fs_ne/EBSapps/appl/ad/admin/jars/jarlist.txt'
INFO: DUMMY Signing JAR '/u01/install/APPS/fs_ne/EBSapps/appl/ad/admin/jars/test.jar' ...
Be aware that if you change the signjar function in the script to call the sample signjar_keystore function
(which depends on an existing, pre-patch jar signing setup) and then run the script again, you will see the following
output as jarsigner is called:
$ ./customjarsign.sh $PWD/jars/jarlist.txt
INFO: Validated read/write-ability of 1 JAR files from
'/u01/install/APPS/fs_ne/EBSapps/appl/ad/admin/jars/jarlist.txt'
INFO: KEYSTORE Signing JAR '/u01/install/APPS/fs_ne/EBSapps/appl/ad/admin/jars/test.jar' ... jar
signed.
In this second case, jarsigner was called both to sign the JAR and add a timestamp.
To verify that the signing information is valid, use the jarsigner -verify command in either simple or verbose
mode.
Simple verification:
Verbose verification:
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 11/29
3/20/25, 12:36 PM Document 1591073.1
- Signed by "CN=EBS Customer, OU=JAR Sign, O=EBS Customer, L=Redwood Shores, ST=California, C=US"
Digest algorithm: SHA-256
Signature algorithm: SHA256withRSA, 2048-bit key
Timestamped by "CN=DigiCert Timestamp 2023, O="DigiCert, Inc.", C=US" on Wed Mar 06 19:43:13 UTC 2024
Timestamp digest algorithm: SHA256
Timestamp signature algorithm: SHA256withRSA, 4096-bit key
jar verified.
>>> Signer
X.509, CN=EBS Customer, OU=JAR Sign, O=EBS Customer, L=Redwood Shores, ST=California, C=US (ebsjars
[
Signature algorithm: SHA256withRSA, 2048-bit key
[certificate is valid from 10/27/23 2:29 AM to 12/27/25 5:00 AM]
X.509, CN=Example EBS JAR Private CA Root R1, O=ATG, C=US (privateca)
[
Signature algorithm: SHA256withRSA, 4096-bit key
[trusted certificate]
>>> TSA
X.509, CN=DigiCert Timestamp 2023, O="DigiCert, Inc.", C=US
[
Signature algorithm: SHA256withRSA, 4096-bit key
[certificate is valid from 7/13/23 8:00 PM to 10/13/34 7:59 PM]
X.509, CN=DigiCert Trusted G4 RSA4096 SHA256 TimeStamping CA, O="DigiCert, Inc.", C=US
[
Signature algorithm: SHA256withRSA, 4096-bit key
[certificate is valid from 3/22/22 8:00 PM to 3/22/37 7:59 PM]
X.509, CN=DigiCert Trusted Root G4, OU=www.digicert.com, O=DigiCert Inc, C=US
[
Signature algorithm: SHA384withRSA, 4096-bit key
[certificate is valid from 7/31/22 8:00 PM to 11/9/31 6:59 PM]
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 12/29
3/20/25, 12:36 PM Document 1591073.1
- Signed by "CN=EBS Customer, OU=JAR Sign, O=EBS Customer, L=Redwood Shores, ST=California, C=US"
Digest algorithm: SHA-256
Signature algorithm: SHA256withRSA, 2048-bit key
Timestamped by "CN=DigiCert Timestamp 2023, O="DigiCert, Inc.", C=US" on Wed Mar 06 19:43:13 UTC 2024
Timestamp digest algorithm: SHA256
Timestamp signature algorithm: SHA256withRSA, 4096-bit key
jar verified.
References
The following resources support the contents of this document and should be consulted as appropriate.
If the JRE on the desktops is configured to check for certificate revocation (CRL or OCSP) you must also provide these as
always running services (CRL http download, or OCSP service) or the verification will fail. If your private CA does not
provide revocation service you can turn off revocation check for code signing certificates.
You can implement a private CA in many ways, there are open source and commercial solutions available for on-premises
installation or cloud services for certificate management.
Sections A1 to A3 below provide examples of creating a private CA for issuing (also known as signing) code signing
certificates for EBS client JAR files in three different scenarios:
These examples can be used as the basis for your efforts for deployment on development, test, or even production
systems. The private JAR CA may only have to issue (sign) one single certificate in its lifetime: your organization's EBS JAR
Signing certificate.
to set up a minimal Private CA for JAR signing using only the Java keytool command.
It is possible
This private CA will not support certificate revocation and will not generate a certificate revocation list (CRL). The CA will
consist of a root CA certificate, and will sign the code signing certificate signing requests (CSR) using the proper keyUsage
(KU) and extendedKeyUsage (EKU) extensions.
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 13/29
3/20/25, 12:36 PM Document 1591073.1
To make the commands shorter and avoid excessive typing, a few shell variables are used. Adjust for your organization
before running the keytool commands.
We recommend that you copy the following commands to a file in the current directory, adjust the variables for your
organization, and run the commands from your own file. That way you will have documentation of what you did, which will
be useful if you have to create a new private CA.
This example uses keytool from Java 7 on the EBS application tier. You can also run your keytool CA in a very small (1×1)
VM that is shut down after signing the code signing certificate.
Create CA Directory:
$ mkdir ~/ebsJarCA
$ cd ~/ebsJarCA
Now that the private CA has been created, clients must trust rootca.crt.
A1.2. CA Operations
There is only one CA operation for this simple CA, as it does not deal with revocation.
To sign a certificate signing request (CSR) for a JAR signing certificate, run the following command to sign the received
CSR (jarsign.csr) and generate the requested code signing certificate (jarsign.crt).
The signing command adds the required keyUsage (KU) and extendedKeyUsage (EKU) extensions to the signed code
signing certificate.
$ cat ebsjarsign.csr |
keytool -gencert -keystore rootca.p12 -alias rootca -rfc -outfile ebsjarsign.crt \
-validity $CVAL -ext ku:c=dig,keyEncipherment -ext eku:c=codeSigning \
-storepass:env RPASS
Return the signed certificate and the root CA certificate to the requestor.
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 14/29
3/20/25, 12:36 PM Document 1591073.1
With the chosen validity period of three years (CVAL) for the code signing certificate, the (re-)signing must be repeated
every three years.
You could also set the CVAL=$RVAL and have the code signing certificate live as long as the CA, 20 years. However, if you
do that you risk that the JRE8 in a future version will reject long-lived code signing certificates.
Create CA Directory
$ mkdir ~/ebsJarCA
$ cd ~/ebsJarCA
For your own organization's use you must chose values that reflect your domain name in the [default] section and your
organization information in the [ca_dn] section.
[ca_dn]
countryName = "US"
organizationName = "Example"
commonName = "Example EBS JAR Private Root CA R1"
[ca_default]
home = .
database = $home/db/index
serial = $home/db/serial
crlnumber = $home/db/crlnumber
certificate = $home/$name.crt
private_key = $home/private/$name.key
RANDFILE = $home/private/random
new_certs_dir = $home/certs
unique_subject = no
copy_extensions = none
default_days = 7305
default_crl_days = 7305
default_md = sha256
policy = policy_c_o_match
[policy_c_o_match]
countryName = supplied
stateOrProvinceName = optional
organizationName = supplied
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[req]
default_bits = 4096
encrypt_key = yes
default_md = sha256
utf8 = yes
string_mask = utf8only
prompt = no
distinguished_name = ca_dn
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 15/29
3/20/25, 12:36 PM Document 1591073.1
req_extensions = ca_ext
[ca_ext]
basicConstraints = critical,CA:true,pathlen:0
keyUsage = critical,keyCertSign,cRLSign
subjectKeyIdentifier = hash
[crl_info]
URI.0 = $crl_url
[issuer_info]
caIssuers;URI.0 = $aia_url
EOF
$ openssl ca -selfsign \
-config ebsca.conf \
-in ebsca.csr \
-out ebsca.crt \
-extensions ca_ext
Enter pass phrase for ./private/ebsca.key:
The generated ebsca.crt is the root CA certificate that the Oracle Forms clients must trust. The openssl ca command
keeps track of issued certificates in the text file db/index.
This example shows that so far this CA has only signed its own certificate:
$ openssl ca -gencrl \
-config ebsca.conf \
-out ebsca.crl
The generated ebsca.crl is used by clients to check the revocation status of a certificate.
The CRL must be regenerated and redeployed if certificate revocation takes place.
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 16/29
3/20/25, 12:36 PM Document 1591073.1
subjectKeyIdentifier = hash
EOF
If you are not going to make the CRL and the Root CA certificate available at http://ebsca.example.com/ebsca.{crl,crt} you
must comment out the following lines in leaf.conf before signing any code signing CSRs.
authorityInfoAccess = @issuer_info
crlDistributionPoints = @crl_info
If you do not, the clients will report an error when they cannot use the CRL specified in the certificate for revocation check.
If you want to support certificate revocation check via CRL for an Oracle Forms client, you must make the ebsca.crl and
ebsca.crt files from this directory available for download at :
http://ebsca.example.com/ebsca.crt
http://ebsca.example.com/ebsca.crl
A2.2. CA Operations
As the operator of the private CA, you will receive a Certificate Signing Request in the form of a *.csr file. Sign it to
produce a signed code signing certificate by running the following command:
The generated code.crt file must be provided to the requestor, along with the root CA certificate.
The requestor can then import the code.certs file into the EBS code signing keystore file ebsjarsign.p12.
The openssl ca command keeps track of issued certificates in the text file db/index.
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 17/29
3/20/25, 12:36 PM Document 1591073.1
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
...(hex)...
3e:01
Exponent: 65537 (0x10001)
X509v3 extensions:
Authority Information Access:
CA Issuers - URI:http://ebsca.example.com/ebsca.crt
X509v3 Authority Key Identifier:
8F:68:1C:D8:91:13:32:21:DC:30:B7:61:C2:D6:89:05:2C:20:AB:F5
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 CRL Distribution Points:
Full Name:
URI:http://ebsca.example.com/ebsca.crl
X509v3 Extended Key Usage:
Code Signing
X509v3 Key Usage: critical
Digital Signature
X509v3 Subject Key Identifier:
C1:BA:56:F5:CD:A0:32:21:50:EA:9C:9E:67:41:88:01:AE:4E:74:2F
Signature Algorithm: sha256WithRSAEncryption
Signature Value:
...(hex)...
f9:5a:48:08:25:9d:21:06
Revoke a Certificate
In the uncommon situation that you need to revoke a certificate (that is, invalidate a not yet expired leaf certificate), use a
command like the following:
The value of -crl_reason can be one of the following: unspecified, keyCompromise, CACompromise,
affiliationChanged, superseded, cessationOfOperation, certificateHold, and removeFromCRL.
You can locate the correct certificate serial number via the db/index file:
If you revoke a certificate, or once a year when the CRL will expire according to the config parameter default_crl_days
= 400, you must generate a new CRL file.
You must then make the regenerated CRL available for download from the URL specified in the crl_url config parameter.
The OCI Certificates service can be used to set up a simple private CA, with revocation support via CRL.
https://docs.oracle.com/en-us/iaas/Content/certificates/
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 18/29
3/20/25, 12:36 PM Document 1591073.1
5. Create an externally-managed certificate where you will upload your code signing CSR, and have it signed by the
CA.
A known issue with the OCI Certificates service is that when creating a certificate as Issued by internal CA, managed
externally the BUI does not prompt you to select and apply a Certificate Profile Type that sets the appropriate keyUsage
and extendedKeyUsage certificate extensions.
To make an OCI Certificates signed certificate work as a code signing certificate, you must add the required TLS extensions
in the CSR. This means that when generating the CSR for the EBS code signing keystore file you must specify the key
usage extensions.
The keytool command to generate the CSR, with keyUsage and extendedKeyUsage extensions, becomes:
After the certificate has been created based on your CSR, you can download the code signing certificate and its certificate
chain from the BUI by selecting the certificate from the list and choosing View Details from the vertical '?' menu to the
right.
https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/
and the Deployment Configuration File and Properties section is available at:
https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/properties.html
These properties are stored outside the JRE installation folder, and will not be affected by the quarterly security updates to
the JRE.
A default installation of the JRE does not have any system-level properties: each user gets a default set of properties, and
can modify the user-level properties via the Java Control Panel application.
A set of system-level properties can either provide default values that can be overridden by user-level properties, or set the
required values and be locked to prevent the user setting possibly conflicting user-level properties.
The default location for property files on the desktop depends on the desktop OS:
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 19/29
3/20/25, 12:36 PM Document 1591073.1
Client
User-Level Location System-Level Location
OS
Depending on your chosen mode of operation for desktop management, you can either make a web page available listing
the steps that each user must perform to set user-level properties (trust a CA, create exception list, turn off revocation
checking for code signing certificates), or you can implement system-level settings for deployment on the users' desktops
(Window or macOS).
B1. Making the Desktop JRE Trust Your Private CA - User Level
B2. Allowlisting EBS JARs via Exception Site List - User Level
B3. Allowlisting EBS JARs via Deployment Rule Set - System Level
B4. Example Desktop JRE Configuration
B1. Making the Desktop JRE Trust Your Private CA - User Level
If you are using a code signing certificate from a private CA to sign your EBS JARs, you must make the desktop JRE trust
that private CA as a signer of code.
The folllowing steps describe how to install the private CA root certificate in the JRE manually using the Java Control Panel.
1. Download the root CA certificate to your desktop where the JRE8 is installed.
2. Open the Java Control Panel on your desktop and select the Security tab.
To locate the Java Control Panel, see the instructions for Windows and macOS as applicable.
The full documentation of the Java Control Panel for Java 8 is available at:
https://docs.oracle.com/javase/8/docs/technotes/guides/deploy/jcp.html.
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 20/29
3/20/25, 12:36 PM Document 1591073.1
Note: If your private CA does not provide server(s) for certificate revocation checking (CRL or OCSP), do not select
Very High as your Security Level.
4. Choose Certificate type: Signer CA, User tab (The System tab list certificates from cacerts in read-only mode.).
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 21/29
3/20/25, 12:36 PM Document 1591073.1
5. Click Import to import the <root>.crt file you downloaded to your desktop
The above image shows the window after the private root has been imported.
6. Click Close to close the Certificates Window and the Java Control Panel.
Your desktop JRE will now trust JARs signed by your private CA.
The Signer CA - User certificate has been imported into a Java keystore file that serves as an additional truststore for the
JRE.
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 22/29
3/20/25, 12:36 PM Document 1591073.1
Extracts from the verbose (-v) listing show:
If your chosen Private CA does not support revocation checking, turn it off using the JCP 'Advanced' tab.
B2. Allowlisting EBS JARs via Exception Site List - User Level
The JRE has a feature whereby you can declare JARs from a particular site as allowed-to-run. This allow code to run if it is
downloaded from specific sites identified by the webentry URL. Warning popups will be shown, but the user will be allowed
to acknowledge and ignore the warning.
The documentation for this is in the Java 8 Deployment Guide - specifically in Chapter 29 Exception Site List.
You can add one or more EBS webentries, such as for production and test environments:
Note: If an active Deployment Rule Set is installed on the system, the deployment rules take precedence over the
Exception Site List. The exception site list is considered only when the default rule applies. Since the Exception List
only allows you to run applications with “issues”, the Exception List is not required if you have correctly configured EBS
JARs and the desktop JRE.
B3. Allowlisting EBS JARs via Deployment Rule Set - System Level
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 23/29
3/20/25, 12:36 PM Document 1591073.1
The JRE has a feature whereby you can declare JARs either from a particular site, or signed by a particular code signing
certificate, as being trusted. This will typically result in fewer security warnings. You can also enforce the Java version of
the JRE. For further information, see Java 8 Deployment Guide - specifically, Chapter 28: Deployment Rule Set.
The high-level steps involved in setting up a Deployment Rule Set are as follows:
The following XML will make JARs signed with your organization's code signing certificate trusted, where the SHA-
256 hash value is the hash of your code signing certificate.
<ruleset version="1.0+">
<rule>
<id>
<certificate algorithm="SHA-256" hash="66C99395E35525F84...18A2497A51C85E" />
</id>
<action permission="run" version="SECURE-1.8" />
</rule>
<rule>
<id></id>
<action permission="block">
<message>Blocked by corporate.</message>
</action>
</rule>
</ruleset>
You can retrieve the hash of your code signing certificate from:
The certificate PEM file that you received from the CA.
The ebsjarsign.p12 keystore file (where you imported it).
A JAR file signed by your code signing certificate (where jarsigner embedded it).
You have to use Java's keytool command to do the listing of the certificate and capture the SHA2 hash.
If you have the certificate in a PEM file, the following command will provide the value:
$ keytool -printcert -file ebsjarsign.crt | awk '/SHA256:/ {print $2; exit 0}' | tr -d :
If you already imported the code signing certificate into ebsjarsign.p12, you can run the following command:
$ keytool -printcert -keystore ebsjarsign.p12 -alias ebsjarsign | awk '/SHA256:/ {print $2; exit 0}' |
tr -d :
If you have already used your code signing certificate to sign EBS JARs, run this command:
$ keytool -printcert -jarfile fndforms.jar | awk '/SHA256:/ {print $2; exit 0}' | tr -d :
You can get the alias in your ebsjarsign.p12 by having keytool list it as follows:
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 24/29
3/20/25, 12:36 PM Document 1591073.1
The signed DeploymentRuleSet.jar file will have to be deployed to each desktop than must run Forms.
The default location for DeploymentRuleSet.jar on the desktop depends on the desktop operating system:
Client OS Location
Windows %windir%\Sun\Java\Deployment\
You will need to create the directory if it does not already exist.
You can make the signed DeploymentRuleSet.jar file available for download by client from any internal
webserver. If you are using a private CA, it makes sense to make the private CA's root certificate available from the
same location.
Once the DeploymentRuleSet.jar file is correctly installed, the Security tab in the Java Control Panel on your
desktop will display a link to View the active Deployment Rule Set.
If you have decided to use a Private CA for signing the EBS client JAR files, and you want a Deployment Rule Set (DRS) file
to ensure that the JRE only runs JARs signed by your organization's EBS JAR signing certificate, you can have your end
users configure their own desktop JRE for that.
The below example for Windows require your end users to have administrative privileges on their desktops to be able to
write in the JRE's SYSTEM Level directory to install the Deployment Rule Set (DRS).
$ mkdir $INST_TOP/portal/jre8/
$ cp jarca.crt $INST_TOP/portal/jre8/
$ cp DeploymentRuleSet.jar $INST_TOP/portal/jre8/
Copy the instructions, including two image files referenced from the instructions:
$ cp index.html $INST_TOP/portal/jre8/
$ cp JCP-Import.png $INST_TOP/portal/jre8/
$ cp JCP-no-revocation.png $INST_TOP/portal/jre8/
You could send an email to your EBS Forms users pointing them to <ebs-web-entry>/jre8/.
Below is an example of index.html. You can adjust it for your situation, in particular by:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Untitled Document</title>
</head>
<!DOCTYPE html>
<html>
<head>
<title>ii Private CA - JAR Signing</title>
<style>
body { font-family: ariel, sans-serif; font-size:11pt; }
h1, h2, h3 { font-family: ariel, sans-serif; color:#66F; }
kbd {color:blue; }
</style>
</head>
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 25/29
3/20/25, 12:36 PM Document 1591073.1
<body>
<h1>Adapt Your Desktop JRE to Our Private CA </h1>
<p>
If you are a user of our Oracle e-Business Suite system and use Oracle Forms, read on, if not, you can skip
these instructions!.
<p>
We have changed to use a Private Certificate Authority to sign the EBS client JARs, so now your desktop JRE
must trust our Private CA.<br/>
This is done by importing the Private CA's root certificate into your desktop JRE's truststore.
The adjss utility does not create any keystore files. If a keystore file is required, it is created using Java's standard
keytool command. The adjss utility can register the name of a keystore file and additional parameters required to sign
using jarsigner and the keystore file.
Only KEYSTORE mode require additional parameters. CUSTOM mode require you to create a custom JAR signing script
with a fixed name placed at a fixed location. NONE requires nothing, as it simply turns off AD signing and leaves signing to
the user.
$ adjss -help
adjss -migrate
Use existing, working adkeystore.dat + adsign.txt to create new style KEYSTORE mode in adsignmode.txt
and adsignparameters.txt
adjss -list
adjss -verify
For KEYSTORE mode parameters are verified (keystore file, alias in keystore, passwords).
Sign the passed JAR file using the configured mode and show successfully signed JAR, using:
For KEYSTORE mode the JAR is signed using jarsigner and the configured keystore parameters
jarsigner -keystore <keystore> -sigfile <sigfile> /full/path/to/test.jar <alias> + passwords
For CUSTOM mode the JAR file is added to a jarlist.txt file and the signing is attempted as
customjarsign.sh $PATH_TO/jarlist.txt
KEYSTORE mode
The KEYSTORE mode is very similar to the older mode that used a fixed name keystore file adkeystore.dat and a small
parameter file adsign.txt. In fact they are so similar that an existing and working setup can be migrated to the new
format using just one command: adjss -migrate. When you apply AD Patch 36492441, your existing setup will be
automatically migrated to KEYSTORE mode.
The old code had adjkey create adkeystore.dat, and a small parameter file, adsign.txt. adsign.txt held the following
parameters:
adsign.txt
The AD JAR signing code knew where to find adkeystore.dat and adsign.txt, then used that information to call the
jarsigner utility.
The adjss utility stores the same information in two new files, adsignmode.txt and adsignparameters.txt. The
contents for KEYSTORE mode is as follows:
adsignmode.txt
KEYSTORE
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 27/29
3/20/25, 12:36 PM Document 1591073.1
adsignparameters.txt
In both old and new scenarios, the passwords for the keystore file are stored in the database to enable the hands-off,
automated signing.
CUSTOM mode
As the user, you are responsible for developing customjarsign.sh and copying it to <AD_JRI_LOC>/.
NONE mode
AD will not sign any JARs. It will, however, generate a jarlist.txt file that contains the full path of each JAR file it would
have signed.
As the user, you are responsible for signing the necessary JAR files, either using the AD generated jarlist.txt or a site-
specific, shorter list of client JARs that are actually in use at your site.
AD relies on flags (<NOSIGN> <NOLIST>) in the DEP files (a type of makefile) to determine if a JAR regenerated on site
needs to be signed.
This will include any JARs identified by Oracle as client JARs. As a customer running a subset of EBS, you will not need all
these JARs, but can instead generate a shorter list of JARs that are actually used on your site.
This shorter list can be used in CUSTOM mode or NONE mode to avoid signing JARs that do not need signing: to do this,
ignore the AD generated jarlist.txt file and use your own shorter list.
The usedjarlist.txt can be generated on site from the OHS access_log files. To reduce the chance of missing
infrequently used applets, we recommend examining one year (or 400 days) of logs as an optimal solution. If end users
report issues that indicate you have missed any, you can easily add the missing JARs to your list.
The following awk script looks for requests starting with "/OA_JAVA/" followed by ".jar", plus a success response code of
< 400 (typically, 200 OK and 304 Not Modified).
$ cat 400-days-of-access_log | awk ' $7 ~ /^\/OA_JAVA\/.*.jar/ && $(NF-1) < 400 {print $7}' |
sort -u | tee -a ~/usedjarlist.web
/OA_JAVA/oracle/apps/fnd/jar/fndaol.jar
/OA_JAVA/oracle/apps/fnd/jar/fndaolj.jar
/OA_JAVA/oracle/apps/fnd/jar/fndbalishare.jar
/OA_JAVA/oracle/apps/fnd/jar/fndctx.jar
/OA_JAVA/oracle/apps/fnd/jar/fndewt.jar
/OA_JAVA/oracle/apps/fnd/jar/fndformsi18n.jar
/OA_JAVA/oracle/apps/fnd/jar/fndforms.jar
/OA_JAVA/oracle/apps/fnd/jar/fndlist.jar
/OA_JAVA/oracle/apps/fnd/jar/fndswing.jar
/OA_JAVA/oracle/apps/fnd/jar/fndutil.jar
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 28/29
3/20/25, 12:36 PM Document 1591073.1
/u01/install/APPS/fs1/EBSapps/comn/java/classes/oracle/apps/fnd/jar/fndswing.jar
/u01/install/APPS/fs1/EBSapps/comn/java/classes/oracle/apps/fnd/jar/fndutil.jar
You now have your own site-specific list of JARs that need signing, listed in the file ~/usedjarlist.txt.
This list can be used either in NONE mode, or in CUSTOM mode if your customjarsign.sh script ignores the filename
passed by AD tools and just uses your own list.
Note: For guidance about how to locate the OHS access_log files and identify the files that make up 400 days of logs,
see references to webusage.out in the Allowed Resources section of Oracle E-Business Security Guide.
Change Log
Date Description
2024-
12-17 Updated Sections 5.1.2 and 5.2.1 to reflect cloning action changes associated with new JAR signing
model.
2024-
08-06 Made minor tweaks to formatting.
2024-
08-05 Initial publication (under same Doc ID) of this completely rewritten document, which now describes the
new (as of August 2024) configurable options for JAR signing. For the previous content, refer to
Document 3015098.1.
https://support.oracle.com/epmos/faces/DocumentDisplay?_adf.ctrl-state=bc3lk9kaa_158&id=1591073.1 29/29