gpt4 book ai didi

bash - 如何确定 openssl.cnf 的默认位置?

转载 作者:行者123 更新时间:2023-11-29 08:47:43 27 4
gpt4 key购买 nike

背景

我正在编写一个 bash 脚本,它将使用 openssl 生成证书签名请求,该请求具有X509v3 扩展兼容主题备用名称。

因为没有命令行选项,a solution通过将 SAN 值内嵌附加到默认配置文件,一直将 -config 选项与 -reqexts 选项结合使用。

openssl req -new -sha256 -key domain.key -subj "/C=US/ST=CA/O=Acme, Inc./CN=example.com" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:example.com,DNS:www.example.com")) -out domain.csr

问题

我的问题是便携性。同时a similar question向我保证这在我的 Ubuntu 环境中有效,因为默认配置文件是 /etc/ssl/openssl.cnf,不幸的是这不会在任何地方都有效,Windows 就是一个明显的例子。

如何以编程方式确定 openssl 默认 配置文件的完整路径?

我尝试过的

documentation 中有明显的暗示

-config filename
this allows an alternative configuration file to be specified, this overrides the compile time filename or any specified in the OPENSSL_CONF environment variable.

我读过 config documentation并搜索了 source code ,但我无法发现它选择从何处加载“编译时”默认配置文件的机制。如果我能找到它,那么我宁愿将它作为变量而不是硬编码路径加载到脚本中。

此外,我的 $OPENSSL_CONF 变量是空的。

一个糟糕的选择

目前我的脚本检查这些条件,并使用第一个计算结果为真的条件:

  1. $OPENSSL_CONF 变量被填充,文件存在
  2. /etc/ssl/openssl.cnf存在

如果两者都不成立,则它包含标准配置的副本。这是不可取的,因为它实际上会覆盖客户端建立的自定义设置。我想完全使用环境的条件,只是将SAN部分添加为附录。

我可以通过通常的嫌疑人路径甚至系统搜索进一步扩展这条链。但如果存在多个,那么我无法保证 openssl 实际上默认使用哪个。

最佳答案

如评论之一所述,简单的答案应该是使用以下命令找到路径:

openssl version -d

如果这不起作用,您可以假定 OpenSSL 没有正确配置,或者至少没有您需要的配置。下面是 Node.js 中的一个示例,说明如何获取 openssl.cnf 的位置:

const util = require('util');
const path = require('path');
const exec = util.promisify(require('child_process').exec);

(async () => {
const opensslCnfPath = path.normalize(`${(await exec('openssl version -d')).stdout.match(/"(.*)"/).pop()}/openssl.cnf`);
console.log(opensslCnfPath);
})();

关于bash - 如何确定 openssl.cnf 的默认位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37035300/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com