Как определить местоположение по умолчанию для OpenSSL.cnf?
фон
Я пишу сценарий bash, который будет использовать openssl для создания запроса подписи сертификата с расширения X509v3 уступчивый альтернативные имена субъекта.
поскольку для этого нет опции командной строки,решение чтобы использовать в сочетании с -reqexts
опция путем добавления значений SAN, встроенных в конфигурацию по умолчанию файл.
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
вопрос
моя проблема-переносимость. В то время как аналогичный вопрос уверяет меня, что это работает в моей среде Ubuntu, потому что файл конфигурации по умолчанию /etc/ssl/openssl.cnf
, к сожалению, это не будет работать везде, с окнами очевидный пример.
как программно определите полный путь к openssl по умолчанию настройки файл?
что я пробовал
есть яркий намек в документация
-config с именем
это позволяет указать альтернативный файл конфигурации, это переопределяет имя файла времени компиляции или любой, указанный в переменной среды OPENSSL_CONF.
я прочитала документация по конфигурации и искали исходный код, но я не могу обнаружить механизм, с помощью которого он выбирает, откуда загружать конфигурационный файл "время компиляции" по умолчанию. Если бы я мог найти это, я бы предпочел загрузить его как переменную в скрипт вместо жестко закодированного пути.
более того, мой $OPENSSL_CONF
переменная пуста.
Плохая Альтернатива
в настоящее время мой скрипт проверяет эти условия и использует первое, которое оценивается как true:
-
$OPENSSL_CONF
переменная заполняется, и файл существует
если ни одно из них не истинно, то оно включает в себя копию стандартной конфигурации. Это нежелательно, поскольку фактически переопределяет пользовательские параметры, установленные клиентом. Я хочу полностью использовать условия окружающей среды и просто добавить раздел SAN в качестве добавления.
я мог бы еще больше расширить эту цепочку путями обычных подозреваемых или даже системным поиском. Но в том случае, существует несколько, тогда у меня нет уверенности в том, что openssl фактически используется по умолчанию.
1 ответов
как программно определить полный путь к файлу конфигурации openssl по умолчанию?
программно, его так же просто, как с помощью OPENSSLDIR
макрос opensslconf.h
:
$ cat /usr/local/ssl/darwin/include/openssl/opensslconf.h | grep OPENSSLDIR
#if defined(HEADER_CRYPTLIB_H) && !defined(OPENSSLDIR)
#define OPENSSLDIR "/usr/local/ssl/darwin"
как определить местоположение по умолчанию для OpenSSL.cnf?
вот дополнительная информация, которая поможет заполнить пробелы в другом вопросе переполнения стека. Это зависит от установки OpenSSL, которую вы с помощью.
вот краткий ответ... Библиотека и программы ищут openssl.cnf
на OPENSSLDIR
. OPENSSLDIR
является параметром configure, и его набор с --openssldir
.
я на MacBook с 3 различными OpenSSL (Apple, MacPort и тот, который я строю):
# Apple
$ /usr/bin/openssl version -a | grep OPENSSLDIR
OPENSSLDIR: "/System/Library/OpenSSL"
# MacPorts
$ /opt/local/bin/openssl version -a | grep OPENSSLDIR
OPENSSLDIR: "/opt/local/etc/openssl"
# My build of OpenSSL
$ openssl version -a | grep OPENSSLDIR
OPENSSLDIR: "/usr/local/ssl/darwin"
вот более подробный ответ... Это своего рода похоронен в исходном коде OpenSSL для apps.c
, load_config
и что происходит, когда cnf
is NULL
(т. е. или OPENSSL_CONF
envar). Когда cnf
is NULL
и никаких переопределений, тогда - это.
int load_config(BIO *err, CONF *cnf)
{
static int load_config_called = 0;
if (load_config_called)
return 1;
load_config_called = 1;
if (!cnf)
cnf = config;
if (!cnf)
return 1;
OPENSSL_load_builtin_modules();
if (CONF_modules_load(cnf, NULL, 0) <= 0) {
BIO_printf(err, "Error configuring OpenSSL\n");
ERR_print_errors(err);
return 0;
}
return 1;
}
... это работает в моей среде Ubuntu, потому что файл конфигурации по умолчанию
/etc/ssl/openssl.cnf
, к сожалению, это не будет работать везде, с окнами очевидный пример.
это все еще может быть проблемой для вас в Windows. Вы должны быть в порядке, если вы сами создаете OpenSSL из источников; по модулю их длинной обработки файлов в Windows (Также см. проблема #4490:" nmake install "fails" назначение должно быть каталогом. \util\copy.pl строка 39 " on).
люди, как сверкающий свет и Win32 OpenSSL обеспечьте установщиков, и OpenSSL не может быть установленным в каталоге, предусмотренном упаковщиком. Я даже видел каталоги Unix, такие как /usr/local
отображаются на компьютерах Windows.
для Windows, ваша самая безопасная ставка, вероятно, установить OPENSSL_CONF
переменной окружающей среды переопределить сломанные пути и пути обработки ошибок.
кроме того, я не знаю CONF_*
или NCONF_*
вызов API, который дает вам эффективный каталог во время выполнения. Здесь эффективным каталогом будет каталог конфигурации плюс такие вещи, как OPENSSL_CONF
переопределяет. Теперь откройте в списке пользователей OpenSSL:получить эффективный путь OPENSSLDIR во время выполнения?