openssl_pkey_new выбрасывает ошибки файла конфигурации подпрограммы: NCONF_get_string: нет значения - PullRequest
0 голосов
/ 29 августа 2018

Я нашел пару сообщений с этой проблемой, но я не решил свою проблему, используя их решение.

Это мой тестовый скрипт:

<code><?php
echo "\n*** Errors before calling openssl_pkey_new\n";
// no errors
while (($e = openssl_error_string()) !== false) {
    var_dump($e);
}

$config = [
    'config' => '/etc/ssl/openssl.cnf',
    "digest_alg" => "sha1",
    "private_key_bits" => 4096,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
];
var_dump(openssl_pkey_new($config));

echo "\n*** Errors after calling openssl_pkey_new\n";
while (($e = openssl_error_string()) !== false) {
    echo "<pre>";print_r($e);echo "
"; }

Пробовал также sha256 и sha512.

Файл cnf:

ls /etc/ssl/openssl.cnf
-rw-r--r-- 1 root root 10835 Jun 20  2014 /etc/ssl/openssl.cnf

Ошибки:

<code>error:0E06D06C:configuration file routines:NCONF_get_string:no value
error:0E06D06C:configuration file routines:NCONF_get_string:no value
error:0E06D06C:configuration file routines:NCONF_get_string:no value
</code>

Я также пытался установить OPENSSL_CONF в верхней части скрипта, но безуспешно:

putenv('OPENSSL_CONF=/etc/ssl/openssl.cnf');

Я также пытался использовать пользовательский openssl.cnf, но безуспешно:

cat /var/www/openssl.cnf 
distinguished_name  = req_distinguished_name
[req_distinguished_name]
[v3_req]
[v3_ca]

В чем может быть проблема?

Безопасно ли игнорировать эти ошибки и удалять их после использования openssl_pkey_new или есть решение?

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Я столкнулся с этой проблемой в моей системе после обновления Mojave на Mac.

Решение

Я раскомментировал приведенное ниже значение в моем файле openssl.cnf , который исправил проблему

default_bits        = 2048
0 голосов
/ 30 августа 2018

Анализ проблемы

Глядя на документацию openssl_pkey_new () , в ней упоминается:

См. openssl_csr_new() для получения дополнительной информации о configargs.

Оказывается, что реализации openssl_pkey_new() и openssl_csr_new() совместно используют код для чтения конфигурации. Вы можете увидеть его вызов в исходном коде PHP здесь через символ PHP_SSL_REQ_PARSE, который расширяется до php_openssl_parse_config. Его первый параметр типа x509_request. (CSR означает запрос на подпись сертификата, для получения дополнительной информации см. Документацию приложения OpenSSL req )

Отсекая реализацию php_openssl_parse_config, оказывается много попыток прочитать параметры конфигурации, которые имеют отношение к CSR, но не только для генерации ключа. Многие из них терпят неудачу и генерируют ту же самую ошибку, которую вы указали.

Чтобы упростить жизнь, я дал команду OpenSSL crypto lib напрямую распечатать информацию о любом неудачном поиске строки конфигурации. Запуск вашего сценария с этой настройкой привел к следующему (в Ubuntu 18.04 с использованием конфигурации, найденной в /etc/ssl/openssl.cnf):

<code>$ php conftest.php 
_CONF_get_string failed for section "(null)", name "openssl_conf"

*** Errors before calling openssl_pkey_new
_CONF_get_string failed for section "(null)", name "oid_file"
_CONF_get_string failed for section "req", name "default_md"
_CONF_get_string failed for section "req", name "req_extensions"
_CONF_get_string failed for section "req", name "encrypt_rsa_key"
_CONF_get_string failed for section "req", name "encrypt_key"
_CONF_get_string failed for section "req", name "default_md"
resource(4) of type (OpenSSL key)

*** Errors after calling openssl_pkey_new
<pre>error:0E06D06C:configuration file routines:NCONF_get_string:no value
error:0E06D06C:configuration file routines:NCONF_get_string:no value
error:0E06D06C:configuration file routines:NCONF_get_string:no value
error:0E06D06C:configuration file routines:NCONF_get_string:no value
error:0E06D06C:configuration file routines:NCONF_get_string:no value
error:0E06D06C:configuration file routines:NCONF_get_string:no value

Решение

Анализ показывает, что добавление значений для параметров oid_file в главном разделе и default_md, req_extensions и encrypt_rsa_key в [req] разделе openssl.cnf должно устранить ошибки. Действительно, после этого результат выглядит следующим образом.

$ php conftest.php 

*** Errors before calling openssl_pkey_new
resource(4) of type (OpenSSL key)

*** Errors after calling openssl_pkey_new

* * Заключение тысячи сорок-девять

Я думаю, что вы можете спокойно игнорировать ошибочный вызов PHP несоответствующих параметров конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...