8.1.1 Types of Keystores

8.1.1.1 JKS Keystore and Truststore

A JKS keystore is the default JDK implementation of Java keystores provided by Sun Microsystems. In 11g Release 1 (11.1.1), all Java components and Java EE applications use the JKS-based keystore and truststore.

You use a JKS-based keystore for the following:

Oracle WebLogic Server

Oracle Virtual Directory

Applications deployed on Oracle WebLogic Server, including:

Oracle SOA Suite

Oracle WebCenter Portal

In Oracle Fusion Middleware, you can use graphical user interface or command-line tools to create, import, export, and delete a Java keystore and the certificates contained in the keystore. See Section 8.1.2, "Keystore Management Tools" for details.

While creating a keystore, you can pre-populate it with a keypair wrapped in a self-signed certificate; such a keystore is typically used in development and testing phases.

The other choice is to generate a certificate signing request for a keypair, so that you can request a signed certificate back from a Certificate Authority (CA). Once the CA sends the certificate back, it is imported into the keystore; the keystore now contains a trusted certificate, since it comes from a trusted third-party. Such a keystore is typically used in production environments.

Keystores are always password-protected.

8.1.1.2 Oracle Wallet

An Oracle wallet is a container that stores your credentials, such as certificates, trusted certificates, certificate requests, and private keys. You can store Oracle wallets on the file system or in LDAP directories such as Oracle Internet Directory. Oracle wallets can be auto-login or password-protected wallets.

You use an Oracle Wallet for the following components:

Oracle HTTP Server

Oracle Web Cache

Oracle Internet Directory

Note:

Wallets configured for Oracle Internet Directory must have auto-login enabled.

In Oracle Fusion Middleware, you can use graphical user interface or command-line tools to create, import, export and delete a wallet and the certificates contained in the wallet. See Section 8.1.2, "Keystore Management Tools" for details.

When creating a wallet, you can pre-populate it with a self-signed certificate; such a wallet is called a test wallet and is typically used in development and testing phases.

The other choice is to create a certificate request, so that you can request a signed certificate back from a Certificate Authority (CA). Once the CA sends the certificate back, it is imported into the wallet; such a wallet is called a third-party wallet.

Either the test wallet or the third-party wallet may be password-protected, or may be configured to not require a password, in which case it is called an auto-login wallet.

Oracle Wallet Manager, a stand-alone graphical user interface for wallets, recommended for managing PKCS#11 wallets. Also see the discussion titled Using Oracle Wallet Manager in a Stand-alone Environment at the end of this section.

This table shows the type of keystore used by each component, and the tool(s) available to manage the keystore:

Oracle Wallet Manager and orapki for PKCS#11, PKCS#12, and Hardware Security Modules (HSM)-based wallets. Also for environments where Fusion Middleware Control and WLST are not available (such as a stand-alone upgrade of these components without a domain).

You cannot use Fusion Middleware Control or the WLST command-line tool to import DER-encoded certificates or trusted certificates into an Oracle wallet or a JKS keystore. Use these tools instead:

To import DER-encoded certificates or trusted certificates into an Oracle wallet, use:

Oracle Wallet Manager or

orapki command-line tool

To import DER-encoded certificates or trusted certificates into a JKS keystore, use the keytool utility.

Using a Keystore Not Created with WLST or Fusion Middleware Control

If an Oracle wallet or JKS keystore was created with tools such as orapki or keytool, it must be imported prior to use. Specifically:

For Oracle HTTP Server, Oracle Web Cache, and Oracle Internet Directory, if a wallet was created using orapki or Oracle Wallet Manager, in order to view or manage it in Fusion Middleware Control you must first import it with either Fusion Middleware Control or the WLST importWallet command. For details, see Section 8.4.4.9 and Section 8.4.4.10.

For Oracle Virtual Directory, if a keystore was created using keytool, in order to view or manage it in Fusion Middleware Control you must first import it with either Fusion Middleware Control or the WLST importKeyStore command.

Copying Keystores to File System Not Supported

Creating, renaming, or copying keystores directly to any directory on the file system is not supported. Any existing pre-11g keystore or wallet that you wish to use must be imported using either Fusion Middleware Control or the WLST utility.

Using Oracle Wallet Manager in a Stand-alone Environment

In a stand-alone environment, such as a stand-alone Web Tier installation, you can use Oracle Wallet Manager to create and manage wallets.

For details about Oracle Wallet Manager, including its use for PKCS#12 wallets, and wallet and certificate lifecycle, see the chapter "Using Oracle Wallet Manager", in the Oracle Advanced Security Administrator's Guide:

8.2 Command-Line Interface for Keystores and Wallets

Oracle Fusion Middleware provides a set of wlst scripts to create and manage JKS keystores and Oracle wallets, and to manipulate their stored objects.

How to Launch the WLST Command-Line Interface

When running SSL WLST commands, you must invoke the WLST script from the Oracle Common home. See Section 3.5.1.1 for more information.

Note:

All SSL-related WLST commands require you to launch the script from the above-mentioned location only.

This brings up the WLST shell. Connect to a running Oracle WebLogic Server instance by specifying the user name, password, and connect URL. After connecting, you are now ready to run SSL-related WLST commands as explained in the subsequent sections.

8.3 JKS Keystore Management

This section describes the typical life cycle of keystores and certificates, and how to use Oracle Fusion Middleware tools to create and maintain keystores and certificates. It includes these topics:

8.3.4 Managing the Certificate Life Cycle

Typical life cycle events for a certificate residing in a keystore are as follows:

A self-signed certificate is automatically created for the keypair.

A certificate signing request (CSR) is generated, and can then be exported to a file.

Certificates are imported into the keystore. A certificate can either be pasted into a text box or imported from the file system. You can import both user certificates and trusted certificates (also known as CA certificates) in this way.

Certificates or trusted certificates are exported from the keystore out to a file.

8.3.5.4 Generating a Certificate Signing Request Using WLST

where password is the password for this keystore, /tmp is the path under which the certificate request is generated in BASE64 format in the file base64.txt, and alias is the alias of the key pair that is used to generate the certificate request.

where password is the password for this keystore, /tmp/cert.txt is the file that contains BASE64 encoded certificate, and alias is the alias by which this certificate is imported. Note that this alias must be same as that of the key pair that was used to generate this certificate request.

8.3.5.7 Exporting a Certificate or Trusted Certificate from the Keystore Using Fusion Middleware Control

Take these steps to export a certificate or trusted certificate from the keystore:

From the navigation pane, locate your component instance.

Navigate to component_name, then Security, then Keystores.

Select the desired keystore from the list of stores.

A dialog box appears in which you must enter the keystore password to continue.

The Manage Certificates page appears. Click Export.

A dialog box appears which shows the Base64 encoded certificate or trusted certificate. You can either copy the contents from the text box and paste it to a file, or select the Export button to save it directly to a file.

8.3.5.8 Exporting a Certificate or Trusted Certificate from the Keystore Using WLST

where password is the password for this keystore, /tmp is the path under which the certificate is generated in BASE64 format in the file base64.txt, and alias is the alias of the certificate being exported.

8.3.5.11 Converting a Self-Signed Certificate to a Third-Party Certificate Using Fusion Middleware Control

Take these steps to convert a self-signed certificate, residing in a keystore, into a third-party certificate:

From the navigation pane, locate your component instance.

Navigate to component_name, then Security, then Keystores.

Select the keystore that contains the self-signed certificate from the list of stores.

A dialog box appears in which you must enter the keystore password; click OK to continue.

The Manage Certificates page appears.

A new certificate request must be generated for the self-signed certificate that is to be converted. Select the certificate and click Generate CSR. In this example, the request is made for the self-signed certificate with alias demo.

where password is the password for this keystore, /tmp/cert.txt is the file that the CA returned and contains the BASE64 encoded PKCS#7, and alias is the alias by which this certificate is imported. Note that this alias must match that of the key pair that was used to generate the certificate request.

If you receive two files from the CA, import the CA certificate first as a trusted certificate, followed by the newly generated certificate:

where password is the password for this keystore, /tmp/cert.txt is the file that the CA returned and contains BASE64 encoded certificate, /tmp/cacert.txt is the file containing the BASE64 encoded CA certificate, and alias is the alias by which this certificate is imported. Note that this alias must match that of the key pair that was used to generate the certificate request.

8.3.6.2 Replacing Expiring Certificates

An expiring certificate should be replaced before it actually expires to avoid or reduce application downtime.

The steps for replacing an expiring certificate are as follows:

Generate a certificate request from the keystore (use the same key-pair for which the current expiring certificate was issued).

Provide this certificate request to the third-party Certificate Authority (CA) for certificate issuance. The validity date of the new certificate should be earlier than the expiration date of the current certificate. This overlap is recommended to reduce downtime.

Note:

Steps 1 and 2 are not required when the third-party CA already maintains the certificate request in a repository. In that case, simply ask the CA to issue a new certificate for that certificate request.

Import the newly issued certificate into the keystore using the same alias as that of the key-pair.

If the new certificate was issued by a CA other than the one that issued the original certificate, you may also need to import the new CA's trusted certificate before importing the newly issued certificate.

8.3.6.3 Effect of Host Name Change on Keystores

Typically, the certificate DN is based on the host name of the server where the keystore is used.

For example, if a keystore is being created for the Oracle Virtual Directory server on host my.example.com, then the DN of the certificate in this Oracle Virtual Directory keystore will be something like:

"CN=my.example.com,O=organization name"

This synchronization is required because most clients do host name verification during the SSL handshake.

Clients that perform host name verification include Web browsers and Oracle HTTP Client, among others. If the host name of the server does not match that of the certificate DN:

A clear warning is displayed (in the case of browser clients).

There may be SSL handshake failure (in the case of other clients).

Thus, whenever you have a keystore on a server that is accepting requests from clients, you must ensure that whenever the host name of this server changes, you also update the certificate in the keystore.

This can be done by requesting a new certificate with a new DN (based on the new host name).

For a Production Keystore

The steps are:

Generate a new request with the new DN (based on a new host name). See Section 8.3.5.3 for details.

Send this request to a certificate authority (CA).

Get back a new certificate from the CA.

Import the new certificate with the same alias as the key-pair for which certificate request was generated. See Section 8.3.5.5 for details.

Create a new keystore with a key-pair using the new DN (based on the new host name). See Section 8.3.3.1 for details.

For Both Keystore Types

For both production and self-signed keystores, once the new certificate is available in the keystore, ensure that it is imported into all the component keystores where it needs to be trusted. For example, if the HTTP listener on Oracle Virtual Directory was SSL-enabled and its certificate changed due to a host name change, then you need to import its new certificate into the client keystore or browser repository so that it can trust its new peer.

8.4.1 About Wallets and Certificates

8.4.1.1 Password-Protected and Autologin Wallets

You can create two types of wallets:

Auto-login wallet

This is an obfuscated form of a PKCS#12 wallet that provides PKI-based access to services and applications without requiring a password at runtime. You can also add to, modify, or delete the wallet without needing a password. File system permissions provide the necessary security for auto-login wallets.

Note:

In previous releases, you could create a wallet with a password and then enable auto-login to create an obfuscated wallet. With 11g Release 1 (11.1.1), auto-login wallets are created without a password. When using such a wallet, you do not need to specify a password.

If using an auto-login wallet without a password, specify a null password ("") in the ldapbind command.

Older type of wallets (such as Release 10g wallets) will continue to work as they did earlier.

Password-protected wallet

As the name suggests, this type of wallet is protected by a password. Any addition, modification, or deletion to the wallet content requires a password.

Every time a password-protected wallet is created, an auto-login wallet is automatically generated. However, this auto-login wallet is different from the user-created auto-login wallet described in the previous bullet. While the user-created wallet can even be updated at configuration time without a password, an automatically generated auto-login wallet is a read-only wallet that does not allow direct updates. Modifications to the wallet must occur through the password protected file (by providing a password), at which time the auto-login wallet is regenerated.

The purpose of this system-generated auto-login wallet is to provide PKI-based access to services and applications without requiring a password at runtime, while still requiring a password at configuration time.

Note:

Wallets configured for Oracle Internet Directory must have auto-login enabled.

8.4.1.2 Self-Signed and Third-Party Wallets

Self-signed wallets contain certificates for which the issuer is the same as the subject. These wallets are typically created for use within an intranet environment where trust is not a high priority. Each self-signed wallet has its own unique issuer; hence, in an environment with multiple components and wallets, the trust management tasks increase n-fold.

When created through Fusion Middleware Control, a self-signed wallet is valid for five years.

Third-party wallets contain certificates that are issued by well known CA's. The functionality and security remain the same as for self-signed wallets, but the use of third-party certificates provides added trust because the issuers are well known, so they are already trusted by most clients.

Difference Between Self-Signed and Third-Party Wallets

From a functional and security perspective, a self-signed certificate is comparable to one issued by a third party. The only difference is that a self-signed certificate is not trusted.

8.4.1.3 Sharing Wallets Across Instances

Oracle recommends that you do not share wallets between component instances or Oracle instances, since each wallet represents a unique identity.

The exception to this is an environment with a cluster of component instances, in which case wallet sharing would be an acceptable practice.

Note that no management tools or interfaces are available to facilitate wallet sharing. However, you can export a wallet from one instance and import it into another instance. See Section 8.4.4 for details of wallet export and import.

Due to the way data is handled in an LDAP directory such as Oracle Internet Directory, wallet names are not case-sensitive.

Thus, it is recommended that you use case-insensitive wallet names (preferably, using all lower case letters). For example, if you have created a wallet named UPPER, do not create another wallet named upper; doing so could cause confusion during wallet management operations.

8.4.2 Accessing the Wallet Management Page in Fusion Middleware Control

An Oracle wallet is associated with the component where it is utilized. To locate a component instance:

Log into Fusion Middleware Control using administrator credentials.

Select the domain of interest.

Note:

You can use Setup to discover a specific Oracle WebLogic Server domain to work with.

From the navigation pane, locate the instance (for example, an OHS instance) that will use the wallet. Click on the instance.

The component type now appears on the upper left of the page adjacent to the Farm drop-down.

The common name entered here should match the hostname of the Oracle HTTP Server to which clients will connect; this helps to prevent problems of the type mentioned in Section 8.4.8.2.

Click Finish.

There are two options for the CR:

Copy and paste the Base64-encoded certificate request from the text box to a file

Export it directly to a file with the Export Certificate Request button.

A message appears confirming the wallet creation.

8.4.4.2 Creating a Wallet Using WLST

Note:

The WLST commands described in this chapter use Oracle Internet Directory as the example component. The same commands can be executed for Oracle HTTP Server or Oracle Web Cache by changing the third parameter from oid to ohs or webcache respectively.

Assuming the instance name is inst1, use this command to create a wallet:

createWallet('inst1', 'oid1', 'oid', 'oid2', 'password')

where oid2 is the wallet name and password is the password for this wallet. If an auto-login wallet needs to be created, the password should be specified as '' (that is, no text between the quotes).

where oid2 is the wallet name, subject_dn is the distinguished name of the self-signed certificate, key_size is the key size in bits and password is the password for this wallet. If an auto-login wallet needs to be created, the password should be specified as '' (that is, with no text between the quotes).

8.4.4.8 Exporting a Wallet Using WLST

where password is the password for this wallet (specify '' as password for auto-login wallet).

If it is an auto-login wallet, this command will export the wallet into a file named cwallet.sso under the directory /tmp. If it is a password-protected wallet, there will be two files created under /tmp, namely ewallet.p12 and cwallet.sso.

8.4.4.10 Importing a Wallet Using WLST

where password is the password of the wallet being imported and /tmp/ewallet.p12 contains the wallet file (if there are two files ewallet.p12 and cwallet.sso, point to ewallet.p12). Point to cwallet.sso only if it is an auto-login wallet - in this case, the password should be specified as ''.

8.4.7.4 Exporting a Certificate, Certificate Request, or a Trusted Certificate Using WLST

where password is the password for this wallet, /tmp is the path under which the certificate request is exported in BASE64 format in the file base64.txt, and subject_dn is the distinguished name of the certificate request that is exported.

To export a certificate or trusted certificate, replace CertificateRequest in the above command with Certificate or TrustedCertificate.

The common name entered here should match the hostname of the server to which clients will connect; this helps to prevent problems of the type mentioned in Section 8.4.8.2.

Enter the certificate request (CR) details and click OK.

The CR is generated. You can either:

Copy and paste the Base64-encoded certificate request to a file.

Export it directly to a file with the Export Certificate Request button.

Submit the certificate request file to a certificate authority to generate a certificate. This is an offline procedure that you can execute in accordance with your local policy for obtaining certificates.

The CA signs the certificate request and generates a certificate. The CA will return you one of the following:

A single file containing both the newly generated certificate and its own CA certificate in pkcs7 format

Two files, one containing the newly generated certificate and a second containing its own CA certificate (or certificates, if there is a chain)

Use Import to import these files into your wallet:

If you received a single file from the CA, import it as a trusted certificate, using an alias that matches the alias of the self-signed certificate you are replacing (from Step 3).

If you received two files:

Import the file containing the CA certificate as a trusted certificate (use an alias that is unique in the wallet).

Import the certificate file as a certificate (using an alias that matches the alias of the self-signed certificate you are replacing).

Note:

The order is important: you must import the trusted certificate first, followed by the certificate.

The CA returned a single file, which is imported as a trusted certificate:

Submit the certificate request /tmp/base64.txt to a certificate authority. The CA will return a newly generated certificate and its own certificate, either as one file in PKCS#7 format or as two separate files.

where password is the password for this wallet, /tmp/cert.txt is the file that the CA returned and contains BASE64 encoded certificate and /tmp/cacert.txt is the file containing the BASE64 encoded CA certificate.

8.4.8.2 Effect of Host Name Change on a Wallet

Typically, the wallet DN is based on the host name of the server where the wallet is used.

For example, if a wallet is being created for the Oracle HTTP Server my.example.com, then the DN of the certificate in this Oracle HTTP Server wallet will be something like "CN=my.example.com,O=organization name".

This synchronization is required because most clients do host name verification during the SSL handshake.

Clients that perform host name verification include Web browsers and Oracle HTTPClient, among others. If the host name of the server does not match that of the certificate DN, then:

A clear warning will be displayed (in the case of browser clients).

There may be SSL handshake failure (in the case of other clients).

Thus, when you have a wallet on a server that is accepting requests from clients, you must ensure that whenever the host name of this server changes, you also update the certificate in the wallet.

You can do this by requesting a new certificate with a new DN (based on the new host name).

For both production and self-signed wallets, once the new certificate is available in the wallet, you need to ensure that it is imported into all the component wallets where it needs to be trusted. For example, if Oracle WebLogic Server is SSL-enabled and the certificate for Oracle WebLogic Server changed due to a host name change, then you need to import its new certificate into the Oracle HTTP Server wallet so that it can trust its new peer.

8.4.8.3 Changing a Self-Signed Wallet to a Third-Party Wallet

You can convert a self-signed wallet into a third-party wallet, one that contains certificates signed by a trusted Certificate Authority (CA).

Assuming a self-signed wallet named MYWallet, containing a certificate with DN as "CN=my.example.com,O=example", take these steps to convert it into a third-party wallet:

Remove the user certificate "CN=my.example.com,O=example" from the wallet.

Remove the trusted certificate "CN=my.example.com,O=example" from the wallet (this has the same DN as the user certificate, but is a separate entity nonetheless).

Export the certificate request "CN=my.example.com,O=example" from the wallet and save it to a file.

Give this certificate request file to a third-party certificate authority (CA) such as Verisign.

The CA will return one of the following:

A user certificate file and its own certificate file

A single file with a certificate chain consisting of a user certificate and its own certificate

8.4.8.4 Replacing an Expiring Certificate in a Wallet

An expiring certificate should be replaced before it actually expires to avoid or reduce application downtime.

The steps for replacing an expiring certificate are as follows:

Export the certificate request from the wallet (this is the same request for which the current expiring certificate was issued).

Provide this certificate request to the third-party Certificate Authority (CA) for certificate issuance. The validity date of the new certificate should be earlier than the expiration date of the current certificate. This overlap is recommended to reduce downtime.

Note:

Steps 1 and 2 are not required when the third-party CA already maintains the certificate request in a repository. In that case, simply request the CA to issue a new certificate for that certificate request.

Remove the existing certificate (the one that is about to expire) from the wallet.

Import the newly issued certificate into the wallet.

To reduce downtime, remove the previous certificate and import the new certificate in the overlap period when the new certificate has become valid and the older one has not yet expired.

If the new certificate was issued by a CA other than the one that issued the original certificate, you may also need to import the new CA's trusted certificate before importing the newly issued certificate.