OpenSSL действительно нужен путь к openssl.conf? - PullRequest
15 голосов
/ 05 марта 2012

Я хочу создать самоподписанный сертификат в 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 ]

11 голосов
/ 15 марта 2012

В 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.

6 голосов
/ 20 марта 2012

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

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

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

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

2 голосов
/ 23 апреля 2012

Создание самоподписанного сертификата в 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";
...