Нужен ли OpenSSL путь к openssl.conf?

Я хочу создать самоподписанный сертификат в PHP 5.x. с моей собственной (альтернативной) конфигурацией openssl, которая должна быть определена моим PHP-кодом. PHP-скрипт будет работать в разных средах (веб-серверы с общим хостингом).

В официальном руководстве PHP говорится:

По умолчанию для инициализации запроса используется информация в вашей системе openssl.conf; вы можете указать раздел файла конфигурации, установив ключ config_section_section для configargs. Вы также можете указать альтернативный файл конфигурации openssl, установив значение ключа конфигурации в путь к файлу, который вы хотите использовать. Следующие ключи, если они присутствуют в configargs, ведут себя как их эквиваленты в openssl.conf, как указано в таблице ниже …..

Мой вопрос: есть ли причина, по которой я должен явно указать путь к openssl.conf, потому что он работает нормально без него:

$Configs = array( 'digest_alg' => 'sha1', 'x509_extensions' => 'v3_ca', 'req_extensions' => 'v3_req', 'private_key_bits' => 1024, 'private_key_type' => OPENSSL_KEYTYPE_RSA, 'encrypt_key' => true, 'encrypt_key_cipher' => OPENSSL_CIPHER_3DES ); $privkey = openssl_pkey_new(); $csr = openssl_csr_new($dn, $privkey, $Configs); $sscert = openssl_csr_sign($csr, null, $privkey, 365, $Configs); 

Редактировать:

В комментариях пользователя, внесенных в Руководство по PHP , почему они всегда указывают путь к openssl.cnf? Например:

 $configargs = array( 'config' => '/etc/ssl/openssl.cnf', 'digest_alg' => 'md5', 'x509_extensions' => 'v3_ca', 'req_extensions' => 'v3_req', 'private_key_bits' => 666, 'private_key_type' => OPENSSL_KEYTYPE_RSA, 'encrypt_key' => false, ); 

Solutions Collecting From Web of "Нужен ли OpenSSL путь к openssl.conf?"

В OpenSSL существует множество настроек конфигурации, которые не могут быть определены в PHP по $ configargs (параметры PHP, которые вы передаете в функции OpenSSL).

Если вы не укажете альтернативный файл конфигурации openssl, он автоматически примет значение по умолчанию openssl.cnf.

Рекомендация: поскольку ваш скрипт будет работать на разных серверах, вы всегда должны использовать свой собственный openssl.cnf.

Просто создайте простой текстовый файл и поместите в него следующие 4 строки. Затем передайте путь к нему функции OpenSSL, которую вы используете (посмотрите на свой второй пример выше).

 distinguished_name = req_distinguished_name [req_distinguished_name] [v3_req] [v3_ca] 

Кажется, что эти 4 строки – это минимум openssl.cnf.

Ответ на это относится к роли SSL. Это «оболочка» вокруг html / http-обмена между клиентом и сервером. Apache запускает его. На самом деле это не "на" площадке PHP. Когда вы выбираете воссоздать пару ключей, все, что вы действительно делаете, это пинать Apache в голенях, чтобы заставить клиент / сервер повторно начать разговор с новой парой пар ключей SSL.

В некоторых смыслах это можно рассматривать как нечто вроде переделания session_id

Мой вопрос: есть ли причина, по которой я должен явно указать путь к openssl.conf, потому что он работает нормально без него:

Создание самоподписанного сертификата здесь не выполняется, его повторное создание. поэтому, когда вы не предоставляете путь, с ним все в порядке, потому что у него уже есть путь от Apache.

Создание самозаверяющего сертификата на PHP без OpenSSL (требуется phpclibib, чистая реализация PHP X.509 ) …

 <?php include('File/X509.php'); include('Crypt/RSA.php'); // create private key / x.509 cert for stunnel / website $privKey = new Crypt_RSA(); extract($privKey->createKey()); $privKey->loadKey($privatekey); $pubKey = new Crypt_RSA(); $pubKey->loadKey($publickey); $pubKey->setPublicKey(); $subject = new File_X509(); $subject->setPublicKey($pubKey); $subject->setDNProp('id-at-organizationName', 'phpseclib demo cert'); $subject->setDomain('www.whatever.com'); $issuer = new File_X509(); $issuer->setPrivateKey($privKey); $issuer->setDN($subject->getDN()); $x509 = new File_X509(); $x509->setStartDate('-1 month'); $x509->setEndDate('+1 year'); $x509->setSerialNumber(chr(30)); $result = $x509->sign($issuer, $subject); echo "the stunnel.pem contents are as follows:\r\n\r\n"; echo $privKey->getPrivateKey(); echo "\r\n"; echo $x509->saveX509($result); echo "\r\n"; в <?php include('File/X509.php'); include('Crypt/RSA.php'); // create private key / x.509 cert for stunnel / website $privKey = new Crypt_RSA(); extract($privKey->createKey()); $privKey->loadKey($privatekey); $pubKey = new Crypt_RSA(); $pubKey->loadKey($publickey); $pubKey->setPublicKey(); $subject = new File_X509(); $subject->setPublicKey($pubKey); $subject->setDNProp('id-at-organizationName', 'phpseclib demo cert'); $subject->setDomain('www.whatever.com'); $issuer = new File_X509(); $issuer->setPrivateKey($privKey); $issuer->setDN($subject->getDN()); $x509 = new File_X509(); $x509->setStartDate('-1 month'); $x509->setEndDate('+1 year'); $x509->setSerialNumber(chr(30)); $result = $x509->sign($issuer, $subject); echo "the stunnel.pem contents are as follows:\r\n\r\n"; echo $privKey->getPrivateKey(); echo "\r\n"; echo $x509->saveX509($result); echo "\r\n"; в <?php include('File/X509.php'); include('Crypt/RSA.php'); // create private key / x.509 cert for stunnel / website $privKey = new Crypt_RSA(); extract($privKey->createKey()); $privKey->loadKey($privatekey); $pubKey = new Crypt_RSA(); $pubKey->loadKey($publickey); $pubKey->setPublicKey(); $subject = new File_X509(); $subject->setPublicKey($pubKey); $subject->setDNProp('id-at-organizationName', 'phpseclib demo cert'); $subject->setDomain('www.whatever.com'); $issuer = new File_X509(); $issuer->setPrivateKey($privKey); $issuer->setDN($subject->getDN()); $x509 = new File_X509(); $x509->setStartDate('-1 month'); $x509->setEndDate('+1 year'); $x509->setSerialNumber(chr(30)); $result = $x509->sign($issuer, $subject); echo "the stunnel.pem contents are as follows:\r\n\r\n"; echo $privKey->getPrivateKey(); echo "\r\n"; echo $x509->saveX509($result); echo "\r\n";