The missing manual - mod-nss

Posted on Fri 13 January 2017 in mod-nss

mod_nss

Introduction

The mod_ssl package was created in April 1998 by Ralf S. Engelschall and was originally derived from the Apache-SSL package developed by Ben Laurie. It is licensed under the Apache 2.0 license.

mod_nss is based directly on the mod_ssl package from Apache 2.0.54. It is a conversion from using OpenSSL calls to using NSS calls instead.

Building

Refer to the README file included with the distribution.

To build you'll need NSPR 4.4.1 or above and NSS 3.9.2 or above. It may work with earlier versions but these are recommended (or tested). These can be retrieved from Mozilla. The --with-nspr and --with-nss options require that the package be installed in the same parent directory (e.g. /opt/nspr, /usr/local/nspr, etc). It will look in this parent for include/ and lib/, etc.

To build with ECC support you need NSPR 4.6.2 or higher and NSS 3.11.2 or higher.

You will also need the NSS and NSPR directories in your library search path (either /etc/ld.so.conf or LD_LIBRARY_PATH) to link and run the module.

Run the configure script. The following mod_nss-specific options are available:

Option Description
--with-nss=[PATH] The file system path to the NSS installation. The assumption is that this has the layout of: PATH/lib, PATH/include, etc.
--with-nss-inc=PATH The file system path to the NSS include directory (e.g. /usr/local/include/nss3)
--with-nss-lib=PATH The file system path to the NSS lib directory (e.g. /usr/local/lib)
--with-nspr=[PATH] The file system path of the NSPR installation. The assumption is that this has the layout of: PATH/lib, PATH/include, etc.
--with-nspr-inc=PATH The file system path to the NSPR include directory (e.g. /usr/local/include/nspr4)
--with-nspr-lib=PATH The file system path to the NSPR lib directory (e.g. /usr/local/lib)
--with-apxs=[PATH] The location of the apxs binary of the Apache you want to install the module into.
--with-apr-config=[PATH] The location of apr-config which tells us where the APR include files and libraries are located
--enable-ecc Enable Elliptical Curve Cryptography. Disabled by default.

If --with-nss or --with-nspr are not passed configure will look for the [nss|nspr]-devel packages and use the libraries with that if found.

It is strongly recommended that the mozilla.org version be used.

Build and install those packages somewhere then configure the module with something like:

  % ./configure --with-apxs=/path/to/apxs/ --with-nspr=/path/to/nspr/ --with-nss=/path/to/nss/
  % gmake

This will create a sample configuration file nss.conf. By default this is installed during the installation process.

Installation

The make install target uses apxs to install the module into Apache.

This automatically copies the mod_nss shared library to the appropriate location and updates Apache's httpd.conf so that the module will be loaded during the next restart.

It also tries to rename ssl.conf to ssl.conf.old.

The assumption is that mod_nss is replacing mod_ssl. They can co-exist as long as they are listening on separate ports.

The mod_nss configuration file, nss.conf, is copied into the Apache configuration directory (as reported by apxs). You may need to make a manual change to httpd.conf to load this file. If you have a Red Hat-style Apache installation with a conf.d just move nss.conf there. It will be automatically loaded. Otherwise you will need to add the following line to httpd.conf (location relative to httpd.conf):

Include conf/nss.conf

This has Apache load the mod_nss configuration file, nss.conf. It is here that you will setup your VirtualServer entries to and configure your SSL servers. If you have a certificate with Subject Alternative Names then you can configure separate VirtualServer entries for eacon one. Certificate Generation

A ksh script, gencert, is included to automatically generate a self-signed CA plus one server certificate. This is fine for testing purposes but it is strongly recommended that a real server certificate be obtained from a real CA before moving a mod_nss server into production. Users should be expected to cancel any request to a secure server signed by an unknown issuer.

gencert takes one argument, the path to the location of the certificate database. A fair amount of output is generated so you can follow what is going on. For the most part most don't need to bother with the details.

The certificate database password is httptest.

A sample run is:

  # mkdir /etc/httpd/nss
  # ./gencert /etc/httpd/nss

  #####################################################################
  Generating new server certificate and key database. The password
  is httptest
  #####################################################################

  #####################################################################
  Generating self-signed client CA certificate
  #####################################################################

  Generating key.  This may take a few moments...

  [ Lots of output removed ]

You should now have the following files:

  • /etc/httpd/nss/cert8.db
  • /etc/httpd/nss/key3.db
  • /etc/httpd/nss/secmod.db

These 3 files make up an NSS certificate database.

If you have a sql: prefix on the path, like sql:/etc/httpd/nss, then it will generate an SQLite NSS database consisting of the following files:

  • /etc/httpd/nss/cert9.db
  • /etc/httpd/nss/key4.db
  • /etc/httpd/nss/pkcs11.txt

Server Startup

Starting a mod_nss server is no different than starting a mod_ssl server. You will need to authenticate yourself to the security token (e.g. enter the key password). The sample nss.conf is not included in an so you do not need to use the startssl argument with apachectl.

A sample startup might look like:

 % apachectl start
  Please enter password for "internal" token:
  

If you have additional hardware tokens you will be prompted for each token password.

All other output will be written to the Apache log files.

To avoid being prompted for a startup password you can either:

  • Use a password file that contains your token passwords. See NSSPassPhraseDialog for details.

  • Exec a program which provides the token password (either by asking the user or other means. Change the internal token password to a blank with:

 % modutil -dbdir /path/to/database/directory -changepw "NSS Certificate DB" 

Enter the old password then press Enter twice for the new password to blank it out.

Migration

A perl script, migrate.pl, is included to help migrate an existing mod_ssl configuration to work with mod_nss. There is one optional argument, -c, that will try to convert your existing server and CA certificates plus any certificate revocation lists (CRLs) into an NSS certificate database.

The migration script assumes that you are migrating from ssl.conf to nss.conf. The original file is not changed. All comments, spacing and other directives are maintained so if there is no ssl.conf it is possible to migrate httpd.conf to use mod_nss. Simply copy httpd.conf to ssl.conf, run the update, then copy nss.conf to httpd.conf (after making a backup, of course). This multi-step process gives you a chance to verify that the migration was successful.

Configuration Directives

The following mod_ssl Directives are not applicable to mod_nss:

  • SSLSessionCache
  • SSLMutex
  • SSLCertificateChainFile
  • SSLCARevocationPath
  • SSLCARevocationFile
  • SSLVerifyDepth
  • SSLCryptoDevice

Details


  • NSSPassPhraseDialog

Authentication is required in order to use the private key in an NSS certificate database. The method of this authentication is specified with the NSSPassPhraseDialog directive. This directive takes one argument specifying the method of authentication: builtin The user will be prompted to enter the token password for each cryptographic device. This works seemlessly with any hardware tokens used. The default "device" is the internal token provided by the NSS Certificate database itself.

file:/path/to/file

The token password(s) may be stored in an ASCII text file which is read during startup so the server can start without user intervention. The format of this file is:

token:password

An example for the internal token is:

  internal:secret12
  exec:/path/to/executable

The listed program will be executed. The only argument is the NSS token name to be authenticated. The return value of the program is ignored. Only what is printed on stdout is passed along as the password.

A trivial example script is:

  #!/bin/sh
  echo "secret123"
  

To prompt using systemd (as root):

  #!/bin/sh
  exec /bin/systemd-ask-password "Enter SSL pass phrase for $1: "
  
  • Example
  NSSPassPhraseDialog builtin
  NSSPassPhraseDialog file:/etc/httpd/alias/password.conf
  NSSPassPhraseDialog exec:/usr/libexec/httpd/httpd-ssl-pass-dialog

  • NSSPassPhraseHelper

When Apache starts it loads and unloads any modules that aren't built-in twice. It loads them once so it can verify that the configuration is ok and then it unloads them and re-loads them again when the server is actually ready to receive connections. After the first module load Apache closes access to the terminal so there is no way to prompt for the NSS token passwords (it would also be annoying to have to authenticate twice). Because the module is loaded and unloaded the NSS certificate database needs to be loaded and unloaded as well, causing any pins entered during the first load to be lost and causing the server to be unstartable.

The solution is the PassPhraseHelper. This is a stand-alone program that also opens the NSS certificate database and stores a copy of the encrypted token password entered during the first load of the NSS module. When mod_nss needs to open the certificate database during subsequent reloads it queries the PassPhraseHelper for the token password.

Example

NSSPassPhraseHelper /path/to/nss_pcache

  • NSSCertificateDatabase

Specifies the location of the NSS certificate database to be used. An NSS certificate database consists of 3 files: cert8.db, key3.db and secmod.db. cert8.db stores certificates and Certificate Revocation Lists (CRLs), key3.db stores keys and secmod.db stores information about available PKCS#11 modules.

This directive specifies a path, not a filename. To use a sqlite NSS database include the prefix sql: in the path.

Example

NSSCertificateDatabase /etc/httpd/conf/nss
  NSSCertificateDatabase sql:/etc/httpd/conf/nss

  • NSSDBPrefix

Normally a certificate database consists of 3 files: cert8.db, key3.db and secmod.db. This directive allows you to add a named prefix to the filenames of cert8.db and key3.db so you can store multiple databases in one directory.

Example

 NSSDBPrefix my-prefix-

You would then need: my-prefix-cert8.db, my-prefix-key3.db and secmod.db

In order to work with files with a prefix using the NSS command-line tools use the -P flag.


  • NSSSessionCacheSize

Specifies the number of SSL sessions that can be cached.

There is no upper limit.

The default value is 10000.

Example

NSSSessionCacheSize 10000

  • NSSSessionCacheTimeout

Deprecated.


  • NSSSession3CacheTimeout

Specifies the number of seconds SSLv3 sessions are cached.

The valid range is 5 - 86400 seconds. A setting outside the valid range is silently constrained.

The default value is 86400 (24 hours).

Example

NSSSession3CacheTimeout 86400

  • NSSRandomSeed

Configures sources to seed the NSS Random Number Generator (RNG) at startup. Currently this only supports seeding the RNG at startup.

The following sources are available: builtin: Combines the current system time, the current process id and a randomly choosen 128-byte extract of the process stack. This is not a particularly strong source of entropy. file:/path/to/source: Reads from the specified file. If the number of bytes to read is specified it just reads that amount. Be aware that some operating systems block on /dev/random if not enough entropy is available. This means that the server will wait until that data is available to continue startup. These systems generally offer a non-blocking device as well, /dev/urandom. exec:/path/to/program: Executes the given program and takes the stdout of it as the entropy. If the bytes argument is included it reads that many bytes, otherwise it reads until the program exits.

Example

NSSRandomSeed startup builtin
  NSSRandomSeed startup /dev/urandom 512
  NSSRandomSeed startup /usr/bin/makerandom

  • NSSSkipPermissionCheck

The NSS database will be checked to ensure that the user configured to run Apache as has owner or group read access to the database configured in NSSCertificateDatabase. This check can be disabled by setting NSSSkipPermissionCheck to on. The default is off

Example

NSSSkipPermissionCheck on

  • NSSEngine

Enables or disables the SSL protocol. This is usually used within a VirtualHost tag to enable SSL for a particular virtual host.

SSL is disabled by default.

Example

NSSEngine on

  • NSSFIPS

Enables or disables FIPS 140 mode. This replaces the standard internal PKCS#11 module with a FIPS-enabled one. It also forces the enabled protocols to TLSv1.2, TLSv1.1 and TLSv1.0 and disables all ciphers but the FIPS ones. You may still select which ciphers you would like limited to those that are FIPS-certified. Any non-FIPS that are included in the NSSCipherSuite entry are automatically disabled. The allowable ciphers are (with ecc-enabled set):

  • rsa_3des_sha
  • rsa_aes_128_sha
  • rsa_aes_256_sha
  • aes_128_sha_256
  • aes_256_sha_256
  • rsa_aes_128_gcm_sha_256
  • fips_3des_sha
  • ecdh_ecdsa_3des_sha
  • ecdh_ecdsa_aes_128_sha
  • ecdh_ecdsa_aes_256_sha
  • ecdhe_ecdsa_3des_sha
  • ecdhe_ecdsa_aes_128_sha
  • ecdhe_ecdsa_aes_256_sha
  • ecdh_rsa_3des_sha
  • ecdh_rsa_aes_128_sha
  • ecdh_rsa_aes_256_sha
  • ecdhe_rsa_3des_sha
  • ecdhe_rsa_aes_128_sha
  • ecdhe_rsa_aes_256_sha
  • ecdhe_ecdsa_aes_128_sha_256
  • ecdhe_rsa_aes_128_sha_256
  • ecdhe_ecdsa_aes_128_gcm_sha_256
  • ecdhe_rsa_aes_128_gcm_sha_256

FIPS is disabled by default.

Example

NSSFIPS on

  • NSSOCSP

Enables or disables OCSP (Online Certificate Status Protocol). This allows the server to check the validity of a client certificate before accepting it.

OCSP is disabled by default.

Example

NSSOCSP on

  • NSSCipherSuite

There are two options for configuring the available ciphers. mod_nss provides its own cipher list, a space-separated list of the SSL ciphers used, with the prefix + to enable or - to disable, using the Cipher Name value in the tables below.

Alternatively the mod_nss-style cipher definitions may be used, sslciphersuite.

The support options are:

  • ALL
  • COMPLEMENTOFALL
  • DEFAULT
  • RSA
  • EDH
  • NULL
  • eNULL
  • AES
  • 3DES
  • DES
  • RC4,
  • MD5
  • SHA
  • SHA1
  • SHA256
  • SSLv3
  • TLSv1
  • TLSv12
  • HIGH
  • MEDIUM
  • LOW
  • EXPORT
  • EXPORT40
  • EXPORT56

If a cipher string value contains a colon it is considered a mod_ssl-style cipher string.

If a cipher string value contains a comma it is considered a mod_nss-style cipher string.

If it contains neither then mod_nss first tries to apply OpenSSL ciphers then NSS ciphers.

All ciphers are disabled by default.

Available RSA ciphers are:

Cipher Name NSS Cipher definition Protocol
rsa_3des_sha TLS_RSA_WITH_3DES_EDE_CBC_SHA SSLv3/TLSv1.0/TLSv1.1/TLSv1.2
rsa_des_sha TLS_RSA_WITH_DES_CBC_SHA SSLv3/TLSv1.0/TLSv1.1/TLSv1.2
rsa_null_md5 TLS_RSA_WITH_NULL_MD5 SSLv3/TLSv1.0/TLSv1.1/TLSv1.2
rsa_null_sha TLS_RSA_WITH_NULL_SHA SSLv3/TLSv1.0/TLSv1.1/TLSv1.2
rsa_rc2_40_md5 TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 SSLv3/TLSv1.0/TLSv1.1/TLSv1.2
rsa_rc4_128_md5 TLS_RSA_WITH_RC4_128_MD5 SSLv3/TLSv1.0/TLSv1.1/TLSv1.2
rsa_rc4_128_sha TLS_RSA_WITH_RC4_128_SHA SSLv3/TLSv1.0/TLSv1.1/TLSv1.2
rsa_rc4_40_md5 TLS_RSA_EXPORT_WITH_RC4_40_MD5 SSLv3/TLSv1.0/TLSv1.1/TLSv1.2
fips_des_sha SSL_RSA_FIPS_WITH_DES_CBC_SHA SSLv3/TLSv1.0/TLSv1.1/TLSv1.2
fips_3des_sha SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA SSLv3/TLSv1.0/TLSv1.1/TLSv1.2
rsa_des_56_sha TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA SSLv3/TLSv1.0/TLSv1.1/TLSv1.2
rsa_rc4_56_sha TLS_RSA_EXPORT1024_WITH_RC4_56_SHA SSLv3/TLSv1.0/TLSv1.1/TLSv1.2
rsa_aes_128_sha TLS_RSA_WITH_AES_128_CBC_SHA SSLv3/TLSv1.0/TLSv1.1/TLSv1.2
rsa_aes_256_sha TLS_RSA_WITH_AES_256_CBC_SHA SSLv3/TLSv1.0/TLSv1.1/TLSv1.2
camelia_128_sha TLS_RSA_WITH_CAMELLIA_128_CBC_SHA SSLv3/TLSv1.0/TLSv1.1/TLSv1.2
camelia_256_sha TLS_RSA_WITH_CAMELLIA_256_CBC_SHA SSLv3/TLSv1.0/TLSv1.1/TLSv1.2
null_sha_256 TLS_RSA_WITH_NULL_SHA256 TLSv1.2
aes_128_sha_256 TLS_RSA_WITH_AES_128_CBC_SHA256 TLSv1.2
aes_256_sha_256 TLS_RSA_WITH_AES_256_CBC_SHA256 TLSv1.2
rsa_aes_128_gcm_sha_256 TLS_RSA_WITH_AES_128_GCM_SHA256 TLSv1.2

The available server-side DHE ciphers are:

Cipher Name NSS Cipher definition Protocol
dhe_rsa_des_sha TLS_DHE_RSA_WITH_DES_CBC_SHA SSLv3/TLSv1.0/TLSv1.1/TLSv1.2
dhe_rsa_3des_sha TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
dhe_rsa_aes_128_sha TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
dhe_rsa_aes_256_sha TLS_DHE_RSA_WITH_AES_256_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
dhe_rsa_camellia_128_sha TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
dhe_rsa_camellia_256_sha TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
dhe_rsa_aes_128_sha256 TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 TLSv1.2
dhe_rsa_aes_256_sha256 TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 TLSv1.2
dhe_rsa_aes_128_gcm_sha_256 TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 TLSv1.2

Additionally there are a number of ECC ciphers:

Cipher Name NSS Cipher definition Protocol
ecdh_ecdsa_null_sha TLS_ECDH_ECDSA_WITH_NULL_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdh_ecdsa_rc4_128_sha TLS_ECDH_ECDSA_WITH_RC4_128_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdh_ecdsa_3des_sha TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdh_ecdsa_aes_128_sha TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdh_ecdsa_aes_256_sha TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdhe_ecdsa_null_sha TLS_ECDHE_ECDSA_WITH_NULL_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdhe_ecdsa_rc4_128_sha TLS_ECDHE_ECDSA_WITH_RC4_128_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdhe_ecdsa_3des_sha TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdhe_ecdsa_aes_128_sha TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdhe_ecdsa_aes_256_sha TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdh_rsa_null_sha TLS_ECDH_RSA_WITH_NULL_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdh_rsa_128_sha TLS_ECDH_RSA_WITH_RC4_128_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdh_rsa_3des_sha TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdh_rsa_aes_128_sha TLS_ECDH_RSA_WITH_AES_128_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdh_rsa_aes_256_sha TLS_ECDH_RSA_WITH_AES_256_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
echde_rsa_null TLS_ECDHE_RSA_WITH_NULL_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdhe_rsa_rc4_128_sha TLS_ECDHE_RSA_WITH_RC4_128_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdhe_rsa_3des_sha TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdhe_rsa_aes_128_sha TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdhe_rsa_aes_256_sha TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdh_anon_null_sha TLS_ECDH_anon_WITH_NULL_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdh_anon_rc4_128sha TLS_ECDH_anon_WITH_RC4_128_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdh_anon_3des_sha TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdh_anon_aes_128_sha TLS_ECDH_anon_WITH_AES_128_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdh_anon_aes_256_sha TLS_ECDH_anon_WITH_AES_256_CBC_SHA TLSv1.0/TLSv1.1/TLSv1.2
ecdhe_ecdsa_aes_128_sha_256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLSv1.2
ecdhe_rsa_aes_128_sha_256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLSv1.2
ecdhe_ecdsa_aes_128_gcm_sha_256 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLSv1.2
ecdhe_rsa_aes_128_gcm_sha_256 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLSv1.2

Example

NSSCipherSuite +rsa_3des_sha,-rsa_des_56_sha,+rsa_des_sha,-rsa_null_md5,-rsa_null_sha,-rsa_rc2_40_md5,+rsa_rc4_128_md5,-rsa_rc4_128_sha,-rsa_rc4_40_md5,-rsa_rc4_56_sha,-fips_des_sha, +fips_3des_sha,-rsa_aes_128_sha,-rsa_aes_256_sha
NSSCipherSuite ALL
NSSCipherSuite rsa_3des_sha
NSSCipherSuite RC4-SHA

  • NSSProtocol

A comma-separated string that lists the basic protocols that the server can use (and clients may connect with). It doesn't enable a cipher specifically but allows ciphers for that protocol to be used at all.

Options are:

  • SSLv3
  • TLSv1 (legacy only; replaced by TLSv1.0)
  • TLSv1.0
  • TLSv1.1
  • TLSv1.2
  • All

Note that this differs from mod_ssl in that you can't add or subtract protocols.

If no NSSProtocol is specified, mod_nss will default to allowing the use of the TLSv1.0, TLSv1.1 and TLSv1.2 protocols, where TLSv1.0 will be set to be the minimum protocol allowed, and TLSv1.2 will be set to be the maximum protocol allowed. If values for NSSProtocol are specified, mod_nss will set both the minimum and the maximum allowed protocols based upon these entries allowing for the inclusion of every protocol in-between. For example, if only SSLv3 and TLSv1.1 are specified, SSLv3, TLSv1.0, and TLSv1.1 will all be allowed, as NSS utilizes protocol ranges to accept all protocols inclusively (TLSv1.1 -> TLSv1.0 -> SSLv3.0), and does not allow exclusion of any protocols in the middle of a range (e. g. - TLSv1.0).

Finally, NSS will always automatically negotiate the use of the strongest possible protocol that has been specified which is acceptable to both sides of a given connection. SSLv2 is not supported by default at this time.

Example

NSSProtocol SSLv3,TLSv1.0,TLSv1.1

  • NSSNickname

Specify the nickname to be used for this the server certificate. Certificates stored in an NSS database are referred to using nicknames which makes accessing a specific certificate much easier. It is also possible to specify the certificate DN but it is easier to use a nickname. If the nickname includes spaces then the value needs to be enclosed in double quotes.

Example

NSSNickname Server-Cert
NSSNickname "This contains a space"

NOTE: There is nothing magical about the string "Server-Cert." A nickname can be anything. Historically this was Server-Cert in the Netscape server products that used NSS.


  • NSSECCNickname

Similar to NSSNickname but designed for use with ECC certificates. This allows you to have both an RSA certificate and an ECC certificate available on the same listening port. This allows newer clients that support ECC to connect with those ciphers but also allows older clients to connect with an RSA cipher.

Example

NSSNickname Server-Cert-ECC


  • NSSEnforceValidCerts

By default mod_nss will not start up if the server certificate is not valid. This means that if the certificate has expired or is signed by a CA that is not trusted in the NSS certificate database the server will not start. If you would like the server to start anyway you can add this directive to nss.conf and the server will start with just a warning. Not enforcing a valid server certificate is not recommended.

Example

NSSEnforceValidCerts on

  • NSSVerifyClient

Determines whether Client Certificate Authentication will be requested or required. This may be set in a per-server or per-directory context. At the server level the certificate is requested during the initial SSL handshake. In the per-directry context an SSL renogitation is required and a certificate requested from the client.

Available options are:

  • none: no client certificate is required or requested
  • optional: a client certificate is requested but if one is not available, the connection may continue.
  • require: a valid client certificate is required for the connection to continue.

The mod_ssl option option_no_ca is not supported.

There is no NSSVerifyDepth directive. NSS always verifies the entire certificate chain.

Example

NSSVerifyClient require

  • NSSSessionTickets

Enables or disables support for TLS Session tickets (RFC 5077). The default is off.

Example

NSSSessionTickets on

  • NSSUserName

Defines the field in the client certificate which will set the user field in the request. The option FakeBasicAuth (see NSSOptions) must also be set for this to work.

Example

NSSUserName SSL_CLIENT_S_DN_UID

  • NSSOptions

Control various options in a per-server or per-directory context.

  • FakeBasicAuth: When this option is enabled and NSSUserName is set then the certificate attribute defined in NSSUserName is used to populate the value of r->user in the Apache request object. This equates to the environmant variable REMOTE_USER.
  • StdEnvVars: A standard set of SSL environment variables is created. CompatEnvVars: A no-op. In previous versions of mod_ssl this would set additional environment variables for backwards compatibility with older Apache SSL implementations.
  • ExportCertData: Several additional environment variables are created, SSL_CLIENT_CERT, SSL_CLIENT_CERT_CHAIN[0..n] and SSL_SERVER_CERT. This provides additional certificate information on the client and server to the environment, plus every CA certificate in the client certificate.
  • StrictRequire: Absolutely forces the connection to be forbidden when NSSRequireSSL or NSSRequire aren't met.
  • OptRenegotiate: Allows the SSL connection to be renegotiated using a different configuration. This is designed for a per-directory and is relatively expensive to do. For example, it can be used to force very strong ciphers in particular directories.

All options are disabled by default.

Example:

NSSOptions +FakeBasicAuth
  < Files ~ "\.(cgi|shtml)$">
  NSSOptions +StdEnvVars
  < Files>

  • NSSRequireSSL

The request is forbidden unless the connection is using SSL. Only available in a per-directory context. This takes no arguments.

Example

NSSRequireSSL

  • NSSRequire

Provides a regular expression-based access-control mechanism. Access may be restricted (or allowed) based on any number of variables such as components of the client certificate, the remote IP address, etc.

Example

NSSRequire

  • NSSRenegBufferSize

Configure the amount of memory that will be used for buffering the request body if a per-location SSL renegotiation is required due to changed access control requirements. The value is in bytes. The default is 128K. If set to 0 then no buffering is done.

Example

NSSRenegBufferSize 262144

  • NSSSNI

Enables or disables Server Name Identification (SNI) extension check for TLS. This option is enabled by default. To disable SNI, set this to off in the default name-based VirtualHost.

Example

NSSSNI off

  • NSSStrictSNIVHostCheck

Configures whether a non-SNI client is allowed to access a name-based VirtualHost. If set to on in the default name-based VirtualHost then clients that are SNI unaware cannot access any virtual host. If set to on in any other VirtualHost then SNI unaware clients cannot access this particular virtual host.

Example

NSSStrictSNIVHostCheck off

  • NSSProxyEngine

Enables or disables mod_nss HTTPS support for mod_proxy.

Example

NSSProxyEngine on

  • NSSProxyProtocol

Specifies the SSL protocols that may be used in proxy connections. The syntax is identical to NSSProtocol.

Example

NSSProxyProtocol SSLv3

  • NSSProxyCipherSuite

Specifies the SSL ciphers available for proxy connections. The syntax is identical to NSSCipherSuite.

Example

NSSProxyCipherSuite +rsa_3des_sha,-rsa_null_md5,-rsa_null_sha,+rsa_rc4_128_md5

  • NSSProxyNickname

The nickname of the client certificate to send if the remote server requests client authentication.

Example

NSSProxyNickname beta

  • NSSProxyCheckPeerCN

Compare the CN value of the peer certificate with the hostname being requested. If this is set to on, the default, then the request will fail if they do not match. If this is set to off then this comparison is not done. Note that this test is your only protection against a man-in-the-middle attack so leaving this as on is strongly recommended.

Example

NSSProxyCheckPeerCN on

Environment Variables

Quite a few environment variables (for CGI and SSI) may be set depending on the NSSOptions configuration. It can be expensive to set these so it is recommended that they only be set when they will be used (e.g. don't set them on a per-server basis). Here is a list of the variables along with the option used to set them.

Always Set

Name Description
HTTPS Set to "on" if HTTPS is being used

+StdEnvVars

Name Description
SSL_VERSION_INTERFACE The version of mod_nss the server is running
SSL_VERSION_LIBRARY The version of NSS that mod_nss was compiled against.
SSL_PROTOCOL SSLv3, TLSv1.0, TLSv1.1 or TLSv1.2
SSL_CIPHER The cipher the connection is using
SSL_CIPHER_EXPORT true if the cipher is an export cipher, false otherwise
SSL_CIPHER_USEKEYSIZE Number if bits the cipher is using
SSL_CIPHER_ALGKEYSIZE Max number of bits possible in the cipher
SSL_CLIENT_VERIFY NONE if no client auth, SUCCESS or FAILED if SSLVerifyCert is set
SSL_CLIENT_V_START Client certificate validity start time
SSL_CLIENT_V_END Client certificate validity end time
SSL_CLIENT_V_REMAIN Number of days that the certificate is valid
SSL_CLIENT_M_VERSION X.509 version of the client certificate
SSL_CLIENT_M_SERIAL Serial number of the client certificate
SSL_CLIENT_A_KEY Algorithm used for client key
SSL_CLIENT_A_SIG Algorithm used for the signature of the client key
SSL_CLIENT_S_DN Distinguished Name (DN) of the client certificate
SSL_CLIENT_S_DN_[C,ST,L,O,OU,CN,T,I,G,S,D,UID,Email] Components of the client certificate. Only those that exist in the certificate are created.
SSL_CLIENT_SAN_[DNS, IPAddr, Email, OTHER_msUPN]_[0..n] A subset of Subject Alternate Names. Each entry is appended with a unique sequential number.
SSL_CLIENT_I_DN Distinguished Name (DN) of the client certificate issuer
SSL_CLIENT_I_DN_[C,ST,L,O,OU,CN,T,I,G,S,D,UID,Email] Components of the client issuer certificate. Only those that exist in the certificate are created
SSL_SERVER_DN Distinguished Name (DN) of the server certificate
SSL_SERVER_DN_[C,ST,L,O,OU,CN,T,I,G,S,D,UID,Email] Components of the server certificate. Only those that exist in the certificate are created
SSL_SERVER_I_DN_[C,ST,L,O,OU,CN,T,I,G,S,D,UID,Email] Components of the server issuer certificate. Only those that exist in the certificate are created
SSL_SERVER_M_VERSION X.509 version of the server certificate
SSL_SERVER_M_SERIAL Serial number of the server certificate
SSL_SERVER_V_START Server certificate validity start time
SSL_SERVER_V_END Server certificate validity end time
SSL_SERVER_A_KEY Algorithm used for server key
SSL_SERVER_A_SIG Algorithm used for the signature of the server key
SSL_SESSION_ID SSL Session ID
SSL_SERVER_SAN_[DNS, IPAddr, Email, OTHER_msUPN]_[0..n] A subset of Subject Alternate Names. Each entry is appended with a unique sequential number.

+ExportCertData

Name Description
SSL_SERVER_CERT The server certificate in PEM format.
SSL_CLIENT_CERT The client certificate in PEM format (if available)
SSL_CLIENT_CERT_CHAIN_[0..n] Each certificate in the client certificate chain in PEM format (including the client certificate itself).

Database Management

NSS stores it's certificates and keys in a set of files referred to as the "certificate database." The files by default (with NSS 3.x) are named cert8.db, key3.db and secmod.db. See the NSS documentation for more information on these specific files. By default the NSS databases use the Berkeley Database format (cert8 and key3). To use the sqlite format (cert9 and key4) either include sql: in all references to the database (-d sql:/path/to/database) or export NSS_DEFAULT_DB_TYPE="sql".

For more details here

The NSS database also stores any Certificate Revocation Lists (CRLs).

Several NSS tools are available for managing certificates, keys, PKCS#11 modules and CRLs. These come with the NSS distribution. Here is a brief overview:

Tool Description
certutil Generate Certificate Signing Requests, install certificates and manage certificate trust flags.
crlutil Manage certificate revocation lists (CRLs).
modutil Manage the database of PKCS11 modules (secmod.db). Add modules and modify the properties of existing modules (such as whether a module is the default provider of some crypto service).
pk12util Import and export keys and certificates in PKCS12 format.

Here are some quick, useful commands. This assumes that the NSPR and NSS libraries are in your LD_LIBRARY_PATH. Certificates may be referred to by either their DN or by a short nickname that is assigned when the certificate is added to the database. The nickname is the preferred method of referring to certificates. All of these commands use the -d option to specify the database location. The default is ~/.netscape and is probably not what you want.

Description command
Create a Database certutil -N -d [path]
List all Certificates certutil -L -d [path]
Extract a cert (Server-Cert) in ASCII certutil -L -n Server-Cert -d [path] -a
Extract a cert and key (Server-Cert) in PKCS#12 pk12util -o server.p12 -n Server-Cert -d [path]
Import a cert and key (Import-Me) from PKCS#12 pk12util -i server.p12 -n Import-Me -d [path]

Importing OpenSSL Certificates

If you have existing OpenSSL certificates you can import them into an NSS certificate database.

To import a server certificate (nickname Server-Cert):

% openssl pkcs12 -export -in /path/to/certificate -inkey /path/to/keyfile -out server.p12 -name "Server-Cert" -passout pass:foo
% pk12util -i server.p12 -d [path] -W foo 

To import a CA certificate:

% certutil -A -n "myca" -t "CT,," -d [path] -a -i /path/to/cacertificate

To import a CRL:

% openssl crl -in /path/to/crlfile -out /tmp/crl.tmp -inform PEM -outform DER
% crlutil -I -t 1 -d [path] -i /tmp/crl.tmp

To verify that your server certificate was imported properly, you can have NSS validate it:

% certutil -V -n Server-Cert -u V -d .
certutil: certificate is valid