Skip to content

Commit b89ea8a

Browse files
committed
crypto: support OPENSSL_CONF again
A side-effect of https://github.com/nodejs/node-private/pull/82 was to remove support for OPENSSL_CONF, as well as removing the default read of a configuration file on startup. Partly revert this, allowing OPENSSL_CONF to be used to specify a configuration file to read on startup, but do not read a file by default. If the --openssl-config command line option is provided, its value is used, not the OPENSSL_CONF environment variable. Fix: nodejs#10938 PR-URL: nodejs#11006 Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com> Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
1 parent 0dc1d85 commit b89ea8a

File tree

6 files changed

+55
-9
lines changed

6 files changed

+55
-9
lines changed

doc/api/cli.md

+13
Original file line numberDiff line numberDiff line change
@@ -319,8 +319,21 @@ malformed, but any errors are otherwise ignored.
319319
Note that neither the well known nor extra certificates are used when the `ca`
320320
options property is explicitly specified for a TLS or HTTPS client or server.
321321

322+
### `OPENSSL_CONF=file`
323+
<!-- YAML
324+
added: REPLACEME
325+
-->
326+
327+
Load an OpenSSL configuration file on startup. Among other uses, this can be
328+
used to enable FIPS-compliant crypto if Node.js is built with `./configure
329+
\-\-openssl\-fips`.
330+
331+
If the [`--openssl-config`][] command line option is used, the environment
332+
variable is ignored.
333+
322334
[emit_warning]: process.html#process_process_emitwarning_warning_name_ctor
323335
[Buffer]: buffer.html#buffer_buffer
324336
[debugger]: debugger.html
325337
[REPL]: repl.html
326338
[SlowBuffer]: buffer.html#buffer_class_slowbuffer
339+
[`--openssl-config`]: #cli_openssl_config_file

doc/node.1

+10
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,16 @@ when outputting to a TTY on platforms which support async stdio.
207207
Setting this will void any guarantee that stdio will not be interleaved or
208208
dropped at program exit. \fBAvoid use.\fR
209209

210+
.TP
211+
.BR OPENSSL_CONF = \fIfile\fR
212+
Load an OpenSSL configuration file on startup. Among other uses, this can be
213+
used to enable FIPS-compliant crypto if Node.js is built with
214+
\fB./configure \-\-openssl\-fips\fR.
215+
216+
If the
217+
\fB\-\-openssl\-config\fR
218+
command line option is used, the environment variable is ignored.
219+
210220

211221
.SH BUGS
212222
Bugs are tracked in GitHub Issues:

src/node.cc

+7-3
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ bool no_deprecation = false;
177177
bool enable_fips_crypto = false;
178178
bool force_fips_crypto = false;
179179
# endif // NODE_FIPS_MODE
180-
const char* openssl_config = nullptr;
180+
std::string openssl_config; // NOLINT(runtime/string)
181181
#endif // HAVE_OPENSSL
182182

183183
// true if process warnings should be suppressed
@@ -3686,7 +3686,7 @@ static void PrintHelp() {
36863686
" --force-fips force FIPS crypto (cannot be disabled)\n"
36873687
#endif /* NODE_FIPS_MODE */
36883688
" --openssl-config=path load OpenSSL configuration file from the\n"
3689-
" specified path\n"
3689+
" specified file (overrides OPENSSL_CONF)\n"
36903690
#endif /* HAVE_OPENSSL */
36913691
#if defined(NODE_HAVE_I18N_SUPPORT)
36923692
" --icu-data-dir=dir set ICU data load path to dir\n"
@@ -3721,6 +3721,7 @@ static void PrintHelp() {
37213721
#endif
37223722
" prefixed to the module search path\n"
37233723
"NODE_REPL_HISTORY path to the persistent REPL history file\n"
3724+
"OPENSSL_CONF load OpenSSL configuration from file\n"
37243725
"\n"
37253726
"Documentation can be found at https://nodejs.org/\n");
37263727
}
@@ -3855,7 +3856,7 @@ static void ParseArgs(int* argc,
38553856
force_fips_crypto = true;
38563857
#endif /* NODE_FIPS_MODE */
38573858
} else if (strncmp(arg, "--openssl-config=", 17) == 0) {
3858-
openssl_config = arg + 17;
3859+
openssl_config.assign(arg + 17);
38593860
#endif /* HAVE_OPENSSL */
38603861
#if defined(NODE_HAVE_I18N_SUPPORT)
38613862
} else if (strncmp(arg, "--icu-data-dir=", 15) == 0) {
@@ -4334,6 +4335,9 @@ void Init(int* argc,
43344335
V8::SetFlagsFromString(NODE_V8_OPTIONS, sizeof(NODE_V8_OPTIONS) - 1);
43354336
#endif
43364337

4338+
if (openssl_config.empty())
4339+
SafeGetenv("OPENSSL_CONF", &openssl_config);
4340+
43374341
// Parse a few arguments which are specific to Node.
43384342
int v8_argc;
43394343
const char** v8_argv;

src/node_crypto.cc

+2-2
Original file line numberDiff line numberDiff line change
@@ -5910,14 +5910,14 @@ void InitCryptoOnce() {
59105910
OPENSSL_no_config();
59115911

59125912
// --openssl-config=...
5913-
if (openssl_config != nullptr) {
5913+
if (!openssl_config.empty()) {
59145914
OPENSSL_load_builtin_modules();
59155915
#ifndef OPENSSL_NO_ENGINE
59165916
ENGINE_load_builtin_engines();
59175917
#endif
59185918
ERR_clear_error();
59195919
CONF_modules_load_file(
5920-
openssl_config,
5920+
openssl_config.c_str(),
59215921
nullptr,
59225922
CONF_MFLAGS_DEFAULT_SECTION);
59235923
int err = ERR_get_error();

src/node_internals.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ namespace node {
3636

3737
// Set in node.cc by ParseArgs with the value of --openssl-config.
3838
// Used in node_crypto.cc when initializing OpenSSL.
39-
extern const char* openssl_config;
39+
extern std::string openssl_config;
4040

4141
// Set in node.cc by ParseArgs when --preserve-symlinks is used.
4242
// Used in node_config.cc to set a constant on process.binding('config')

test/parallel/test-crypto-fips.js

+22-3
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,9 @@ function testHelper(stream, args, expectedOutput, cmd, env) {
3737
env: env
3838
});
3939

40-
console.error('Spawned child [pid:' + child.pid + '] with cmd ' +
41-
cmd + ' and args \'' + args + '\'');
40+
console.error('Spawned child [pid:' + child.pid + '] with cmd \'' +
41+
cmd + '\' expect %j with args \'' + args + '\'' +
42+
' OPENSSL_CONF=%j', expectedOutput, env.OPENSSL_CONF);
4243

4344
function childOk(child) {
4445
console.error('Child #' + ++num_children_ok +
@@ -92,10 +93,26 @@ testHelper(
9293
compiledWithFips() ? FIPS_ENABLED : FIPS_DISABLED,
9394
'require("crypto").fips',
9495
process.env);
95-
// OPENSSL_CONF should _not_ be able to turn on FIPS mode
96+
97+
// OPENSSL_CONF should be able to turn on FIPS mode
9698
testHelper(
9799
'stdout',
98100
[],
101+
compiledWithFips() ? FIPS_ENABLED : FIPS_DISABLED,
102+
'require("crypto").fips',
103+
addToEnv('OPENSSL_CONF', CNF_FIPS_ON));
104+
105+
// --openssl-config option should override OPENSSL_CONF
106+
testHelper(
107+
'stdout',
108+
[`--openssl-config=${CNF_FIPS_ON}`],
109+
compiledWithFips() ? FIPS_ENABLED : FIPS_DISABLED,
110+
'require("crypto").fips',
111+
addToEnv('OPENSSL_CONF', CNF_FIPS_OFF));
112+
113+
testHelper(
114+
'stdout',
115+
[`--openssl-config=${CNF_FIPS_OFF}`],
99116
FIPS_DISABLED,
100117
'require("crypto").fips',
101118
addToEnv('OPENSSL_CONF', CNF_FIPS_ON));
@@ -107,6 +124,7 @@ testHelper(
107124
compiledWithFips() ? FIPS_ENABLED : OPTION_ERROR_STRING,
108125
'require("crypto").fips',
109126
process.env);
127+
110128
// OPENSSL_CONF should _not_ make a difference to --enable-fips
111129
testHelper(
112130
compiledWithFips() ? 'stdout' : 'stderr',
@@ -122,6 +140,7 @@ testHelper(
122140
compiledWithFips() ? FIPS_ENABLED : OPTION_ERROR_STRING,
123141
'require("crypto").fips',
124142
process.env);
143+
125144
// Using OPENSSL_CONF should not make a difference to --force-fips
126145
testHelper(
127146
compiledWithFips() ? 'stdout' : 'stderr',

0 commit comments

Comments
 (0)