Как определить местоположение по умолчанию для 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:

  1. $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 во время выполнения?