Skip to content

Commit b81db27

Browse files
committed
Feedback, FIPS-3 SSL tests
1 parent 888c3ab commit b81db27

File tree

1 file changed

+69
-33
lines changed

1 file changed

+69
-33
lines changed

content/nginx/fips-compliance-nginx-plus.md

Lines changed: 69 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@ Many federal programs and regulations mandate FIPS 140 validation, which serves
3737
| CMMC | 140-2 or 140-3 | FIPS required for Levels 2 and 3 compliance. |
3838
| DoDIN APL | 140-2 or 140-3 | Approved IT products must include FIPS validation. |
3939
| Common Criteria | 140-2 or 140-3 | Evaluations reference both FIPS versions for cryptographic security. |
40-
| NSA CSfC | FIPS 140-2 or 140-3, transitioning to 140-3 | NSA accepts 140-2 but prefers newer certifications under 140-3. |
40+
| NSA CSfC | 140-2 transitioning to 140-3 | NSA accepts 140-2 but prefers newer certifications under 140-3. |
4141
| CJIS | 140-2 or 140-3 | FIPS required for systems protecting criminal justice data. |
4242
| State and Local Gov Programs | 140-2 or 140-3 | FIPS required for federal grant-funded security systems. |
4343
| Intelligence Community | 140-2 transitioning to FIPS 140-3 | Current systems mostly use 140-2; newer systems adopt 140-3. |
4444
| Military & Tactical Systems | 140-2 transitioning to FIPS 140-3 | 140-2 used widely; transitioning to 140-3 certifications for future tools. |
4545
| Critical Infrastructure | 140-2 or 140-3 | Utilities and systems accept both versions depending on deployments. |
46-
| FAA | FIPS 140-2 transitioning to FIPS 140-3** | 140-2 modules common in existing systems; new systems use 140-3. |
46+
| FAA | 140-2 transitioning to FIPS 140-3 | 140-2 modules common in existing systems; new systems use 140-3. |
4747
| Department of Veterans Affairs | 140-2 or 140-3 | Both versions used for securing sensitive health and personal data. |
4848
| FERPA | 140-2 or 140-3 | Federal-funded educational systems align with 140-2 or 140-3. |
4949
| Nuclear Regulatory Commission | 140-2 or 140-3 | Cryptography for nuclear systems relies on both versions. |
@@ -54,28 +54,40 @@ Although FIPS 140 is primarily a North American government certification, it is
5454
### Countries That Base Their Requirements on FIPS
5555

5656
{{<bootstrap-table "table table-striped table-bordered table-sm">}}
57-
| Country/Region | FIPS Use |
58-
|----------------------|-----------------------------------------------------------------------------|
59-
| United States | Mandatory for federal systems and contractors; core to DoD and government. |
60-
| Canada | Required under CMVP for federal cryptography and sensitive systems. |
61-
| Germany | Defense, critical infrastructure, and NATO-related cryptography. |
62-
| France | Defense and critical systems integrate FIPS for secure interoperability. |
63-
| Netherlands | Financial, healthcare, and NATO-critical encryption systems reference FIPS. |
64-
| Sweden | Applied in defense and NATO-aligned secure communications systems. |
65-
| Denmark | Used in finance, healthcare, and NATO-related cryptographic activities. |
66-
| Finland | Defense and critical infrastructure support FIPS for NATO collaboration. |
67-
| Italy | Defense and finance systems integrate FIPS-certified cryptographic tools. |
68-
| Spain | Used in NATO-linked systems and national critical infrastructure. |
69-
| Poland | Government and NATO-secure communication systems rely on FIPS modules. |
70-
| Estonia | E-governance and critical systems adopt FIPS for secure collaboration. |
71-
| United Kingdom | NCSC references FIPS for defense, health, and procurement standards. |
72-
| Australia | Applied in government, defense, and ASD-certified cryptographic modules. |
73-
| New Zealand | Referenced in government and national-level cryptographic operations. |
74-
| Israel | Trusted in defense, government, and financial cryptographic systems. |
75-
| Japan | Recognized in secure government and financial cryptography applications. |
76-
| UAE | Adopted for finance, energy, and interoperability with U.S. cryptography. |
57+
| Country/Region | FIPS Use |
58+
|----------------------|-----------------------------------------------|
59+
| Australia | Referenced for government, defense, and cryptography systems. |
60+
| Canada | Mandatory for federal and sensitive systems. |
61+
| Denmark | Referenced in finance, healthcare, and NATO-related systems. |
62+
| Estonia | Adopted for e-governance and critical systems. |
63+
| Finland | Relied on for defense and NATO collaboration. |
64+
| France | Relied on for defense and secure systems. |
65+
| Germany | Relied on for defense, critical infrastructure, and NATO interoperability. |
66+
| Israel | Trusted in defense, government, and financial systems. |
67+
| Italy | Relied on for defense and financial cryptography. |
68+
| Japan | Referenced in government and financial cryptographic practices. |
69+
| Netherlands | Referenced in finance, healthcare, and NATO cryptography systems. |
70+
| New Zealand | Referenced for government and national cryptography. |
71+
| Poland | Relied on for secure government and NATO-linked communications. |
72+
| Spain | Referenced in NATO interoperability and critical systems. |
73+
| Sweden | Relied on for defense and secure NATO communications. |
74+
| UAE | Trusted in finance, energy, and interoperability with the U.S. cryptography. |
75+
| United Kingdom | Referenced for defense, health, and procurement standards. |
76+
| United States | Mandatory for federal government systems and contractors. |
7777
{{< /bootstrap-table >}}
7878

79+
where:
80+
81+
- Mandatory: used for countries that officially require FIPS compliance (United States, Canada).
82+
83+
- Relied on: used for countries where FIPS plays a critical role in defense, finance, and secure communication. While not officially mandated, these countries depend on FIPS due to interoperability with NATO systems.
84+
85+
- Referenced: used when industries or governments incorporate FIPS-certified cryptography as part of their standards but do not enforce it as mandatory.
86+
87+
- Adopted: used when governments or systems actively use FIPS frameworks for secure collaboration.
88+
89+
- Trusted: Used in contexts where FIPS is recognized as a reliable standard for industries such as finance and energy.
90+
7991

8092
## FIPS Compliant or FIPS Validated
8193

@@ -113,11 +125,17 @@ You also can verify whether your operating system or cryptographic module is FIP
113125

114126
## Verification of Correct Operation of NGINX Plus
115127

116-
The following process describes how to deploy NGINX Plus in a FIPS‑compliant fashion and then verify that the FIPS operations are correctly performed.
128+
The following process describes how to deploy NGINX Plus in a FIPS‑compliant fashion and then verify that the FIPS operations are correctly performed:
129+
130+
- [Verify](#os-fips-check) if the operating system is running in FIPS mode. If not, [configure](#os-fips-setup) it to enable FIPS mode.
131+
132+
- [Ensure](#openssl-fips-check) that the OpenSSL library is operating in FIPS mode.
133+
134+
- Run simple checks for [OpenSSL](#openssl-fips-check) and [NGINX Plus](#nginx-plus-fips-check) to ensure FIPS mode.
117135

118136
The process uses Red Hat Enterprise Linux (RHEL) release 9.6 as an example, and can be adapted for other Linux operating systems that can be configured in FIPS mode.
119137

120-
### Step 1: Configure the Operating System to Use FIPS Mode
138+
### Step 1: Configure the Operating System to Use FIPS Mode {#os-fips-setup}
121139

122140
For the purposes of the following demonstration, we installed and configured a RHEL 9.6 server. The [Red Hat FIPS documentation](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/chap-federal_standards_and_regulations#sec-Enabling-FIPS-Mode) explains how to switch the operating system between FIPS mode and non‑FIPS mode by editing the boot options and restarting the system.
123141

@@ -131,14 +149,14 @@ For instructions for enabling FIPS mode on other FIPS‑compliant Linux operatin
131149

132150
- Oracle Linux 9: [Configuring FIPS mode](https://docs.oracle.com/en/operating-systems/oracle-linux/9/security/configuring_fips_mode.html#configuring-fips-mode)
133151

134-
- Amazon Linux 2023: [Enabling FIPS mode](https://docs.aws.amazon.com/linux/al2023/ug/fips-mode.html)
152+
- Amazon Linux 2023: [Enabling FIPS mode](https://docs.aws.amazon.com/linux/al2023/ug/fips-mode.html)
135153

136154
- Amazon Linux 2: [Enabling FIPS mode](https://docs.aws.amazon.com/linux/al2/ug/fips-mode.html)
137155

138156
- AlmaLinux: [FIPS Validation for AlmaLinux](https://almalinux.org/blog/2023-09-19-fips-validation-for-almalinux/)
139157

140158

141-
### Step 2: Verify the Operating System is in FIPS Mode
159+
### Step 2: Verify the Operating System is in FIPS Mode {#os-fips-check}
142160

143161
You can verify that the operating system is in FIPS mode and that the version of OpenSSL provided by the operating system vendor is FIPS‑compliant by using the following tests.
144162

@@ -181,7 +199,7 @@ The output of the command shows that FIPS is running:
181199
FIPS mode is enabled.
182200
```
183201

184-
### Step 3: Verify the OpenSSL is in FIPS Mode
202+
### Step 3: Verify the OpenSSL is in FIPS Mode {#openssl-fips-check}
185203

186204
**Determine the OpenSSL FIPS Provider is active**: This test verifies the correct version of OpenSSL and that the OpenSSL FIPS Provider is active:
187205

@@ -231,7 +249,7 @@ The result of the command, showing the MD5 checksum of `/dev/null`:
231249
MD5(/dev/null)= d41d8cd98f00b204e9800998ecf8427e
232250
```
233251

234-
### Step 3: Install NGINX Plus on the Operating System
252+
### Step 3: Install NGINX Plus on the Operating System {#nginx-plus-instll}
235253

236254
Follow the [F5 NGINX Plus Installation guide](https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-plus/) to install NGINX Plus on the host operating system, either directly from the [NGINX Plus repository](https://account.f5.com/myf5), or by downloading the **nginx-plus** package (**rpm** or **deb** package) onto another system and manually installing it on the host operating system.
237255

@@ -280,9 +298,9 @@ Verify that you can access the website using HTTPS from a remote host. Connect t
280298

281299
Use `openssl s_client` for this test because it unambiguously confirms which SSL/TLS cipher was negotiated in the connection. After some debugging information (including the cipher selected), the body of the default “Welcome to nginx!” greeting page is displayed.
282300

283-
### Step 4: Verify Compliance with FIPS
301+
### Step 4: Verify Compliance with FIPS 140-2 {#fips-2-check}
284302

285-
FIPS 140-2 disallows the use of some cryptographic algorithms, including the Camellia block cipher. We can test compliance with FIPS 140-2 by issuing SSL/TLS requests with known ciphers on another (non-FIPS-mode) server:
303+
FIPS 140-2 disallows the use of some cryptographic algorithms, including the Camellia block cipher. You can test compliance with FIPS 140-2 by issuing SSL/TLS requests with known ciphers on another (non-FIPS-mode) server:
286304

287305
#### RC4-MD5
288306

@@ -302,15 +320,33 @@ This cipher is considered secure but is not permitted by the FIPS standard. The
302320

303321
Note that if you attempt to issue the client request on a host running in FIPS mode, it fails because the OpenSSL client cannot use this cipher.
304322

323+
324+
### Step 5: Verify Compliance with FIPS 140-3 {#fips-3-check}
325+
326+
In addition, FIPS 140-3 disallows the use of several ciphers and algorithms that were once allowed or still allowed under FIPS 140-2:
327+
305328
#### AES256-SHA
306329

330+
Althoguh this cipher is permitted by FIPS 140-2, it is not permitted by FIPS 140-3. The SSL handshake fails in case of FIPS 140-3 and succeeds in case of FIPS 140-2.
331+
307332
```shell
308333
(echo "GET /" ; sleep 1) | openssl s_client -connect <NGINX-Plus-address>:443 -cipher AES256-SHA
309334
```
310335

311-
This cipher is considered secure by NGINX Plus and is permitted by FIPS 140-2. The SSL handshake succeeds.
336+
#### 3DES
337+
338+
The `3DES` or Triple DES cipher was once supported but is no longer permitted by NIST as of January 1, 2024. The SSL handshake always fails.
339+
340+
```shell
341+
(echo "GET /" ; sleep 1) | openssl s_client -connect <NGINX-Plus-address>:443 -cipher 3DES
342+
```
312343

344+
#### RC4
345+
The `RC4` bulk encryption cipher suite is not allowed in FIPS 140-3. The SSL handshake always fails.
313346

347+
```shell
348+
(echo "GET /" ; sleep 1) | openssl s_client -connect <NGINX-Plus-address>:443 -cipher RC4
349+
```
314350

315351
## Which Ciphers Are Disabled in FIPS Mode?
316352

@@ -357,15 +393,15 @@ This statement uses the following terms:
357393

358394
- **Cryptographic module**: The OpenSSL software, comprised of libraries of FIPS‑validated algorithms that can be used by other applications.
359395

360-
- **Cryptographic boundary**: The operational functions that use FIPS‑validated algorithms. For NGINX Plus, the cryptographic boundary includes all functionality that is implemented by the [`http_ssl`](https://nginx.org/en/docs/http/ngx_http_ssl_module.html), [`http_v2`](https://nginx.org/en/docs/http/ngx_http_v2_module.html), [`http_v3`](https://nginx.org/en/docs/http/ngx_http_v3_module.html), [`stream_ssl`](https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html), [`mail_ssl`](https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html), and [`http_auth_jwt`](https://nginx.org/en/docs/http/ngx_http_auth_jwt_module.html) modules. These modules implement SSL and TLS operations for inbound and outbound connections which use HTTP, HTTP/2, HTTP/3, TCP, and mail protocols.
396+
- **Cryptographic boundary**: The operational functions that use FIPS‑validated algorithms. For NGINX Plus, the cryptographic boundary includes all functionality that is implemented by the [`http_auth_jwt`](https://nginx.org/en/docs/http/ngx_http_auth_jwt_module.html), [`http_ssl`](https://nginx.org/en/docs/http/ngx_http_ssl_module.html), [`http_v2`](https://nginx.org/en/docs/http/ngx_http_v2_module.html), [`http_v3`](https://nginx.org/en/docs/http/ngx_http_v3_module.html), [`mail_ssl`](https://nginx.org/en/docs/mail/ngx_mail_ssl_module.html), and [`stream_ssl`](https://nginx.org/en/docs/stream/ngx_stream_ssl_module.html) modules. These modules implement SSL and TLS operations for inbound and outbound connections which use HTTP, HTTP/2, HTTP/3, TCP, and mail protocols.
361397

362398
- **NGINX Plus**: The NGINX Plus software application developed by NGINX, Inc. and delivered in binary format from NGINX servers.
363399

364400
- **FIPS mode**: When the operating system is configured to run in FIPS mode, the OpenSSL cryptographic module operates in a mode that has been validated to be in compliance with FIPS 140-2 Level 2. Most operating systems do not run in FIPS mode by default, so explicit configuration is necessary to enable FIPS mode.
365401

366402
- **FIPS validated**: A component of the OpenSSL cryptographic module (the OpenSSL FIPS Object Module) is formally validated by an authorized certification laboratory. The validation holds if the module is built from source with no modifications to the source or build process. The implementation of FIPS mode that is present in operating system vendors’ distributions of OpenSSL contains this validated module.
367403

368-
- **FIPS compliant**: NGINX Plus is compliant with FIPS 140-2 Level 1 within the cryptographic boundary when used with a FIPS‑validated OpenSSL cryptographic module on an operating system running in FIPS mode.
404+
- **FIPS compliant**: NGINX Plus is compliant with FIPS 140-2 Level 1 and FIPS 140-3 Level 1 within the cryptographic boundary when used with a FIPS‑validated OpenSSL cryptographic module on an operating system running in FIPS mode.
369405

370406

371407
## Conclusion

0 commit comments

Comments
 (0)