Действительно ли 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,
);
3 answers
В 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.
В некотором смысле это можно рассматривать как нечто вроде переделки идентификатора сеанса
Мой вопрос: Существует ли причина, по которой я должен явно указать путь к openssl.conf, потому что, похоже, он отлично работает без него:
Создание самозаверяющего сертификата здесь не выполняется, его повторное создание. поэтому, когда вы не указываете путь, это нормально, потому что у него уже был путь от Apache.
Создание самозаверяющего сертификата на PHP без OpenSSL (требуется phpseclib, чистая реализация 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";