Не создаётся сертификат

jenia

Новичок
Не создаётся сертификат

Такая проблема возникла:
Хочу создать новый сертификат SSL. Беру код из мануала:
PHP:
$dn = array(
"countryName" => "UK",
"stateOrProvinceName" => "Somerset",
"localityName" => "Glastonbury",
"organizationName" => "The Brain Room Limited",
"organizationalUnitName" => "PHP Documentation Team",
"commonName" => "Wez Furlong",
"emailAddress" => "[email protected]"
);
$privkey = openssl_pkey_new();
$csr = openssl_csr_new($dn, $privkey);
$sscert = openssl_csr_sign($csr, null, $privkey, 365);
Выдаётся ошибка: Warning: openssl_csr_sign(): cannot get CSR from parameter 1 in...
На php.net ответа не нашёл, на других англоязычных сайтах тоже.
У меня наверное с настройками SSL что-то не так (openssl.cnf), но ошибку найти не могу.

-~{}~ 05.06.06 21:27:

Создал c:\usr\local\ssl\openssl.cnf
Теперь работает. Но как указать, что openssl.cnf лежит в другом месте?

-~{}~ 05.06.06 22:19:

Как я понимаю сертификаты X.509 средствами php генерировать невозможно? Тогда чем мне их генерировать? Наверное с помощью apache13-modssl? Или есть какие-то библиотеки для php?
 

neko

tеam neko
сам openssl генерирует их прекрасно.
чего там в пхп наверченно по этому поводу я незнаю.
 

jenia

Новичок
В php я нашёл функции только для чтения сертификатов X.509, а для генерации нет.
А чем мне их генерировать, если не php?
 

jenia

Новичок
Мне надо чем-то прям на веб-сервере сервере их генерировать. В автоматическом режиме. То есть, пользователь заполняет форму и ему генерируется сертификат X.509. Возможно это?
 

Wicked

Новичок
Ну использование консольной тулзы ничему из этого не противоречит.
PHP:
system("openssl ...");
 

avenger_msoft

Новичок
Теперь работает. Но как указать, что openssl.cnf лежит в другом месте?
А вот так:
PHP:
$config = array('config'=>dirname(__file__) . '\openssl.cnf');
$pkey = openssl_pkey_new($config);
$dn = array(
   "countryName" => "UK",
   "stateOrProvinceName" => "Somerset",
   "localityName" => "Glastonbury",
   "organizationName" => "The Brain Room Limited",
   "organizationalUnitName" => "PHP Documentation Team",
   "commonName" => "Wez Furlong",
   "emailAddress" => "[email protected]"
);
$csr = openssl_csr_new($dn, $privkey, $config);
$sscert = openssl_csr_sign($csr, null, $privkey, 365, $config);
 

Alexandre

PHPПенсионер
Но как указать, что openssl.cnf лежит в другом месте?
Description
resource openssl_pkey_new ( [array configargs])


openssl_pkey_new() generates a new private and public key pair. The public component of the key can be obtained using openssl_pkey_get_public(). You can finetune the key generation (such as specifying the number of bits) using configargs. See openssl_csr_new() for more information about configargs.

Description
bool openssl_csr_new ( array dn, resource privkey [, array configargs [, array extraattribs]])

openssl_csr_new() generates a new CSR (Certificate Signing Request) based on the information provided by dn, which represents the Distinguished Name to be used in the certificate.
 

jenia

Новичок
Да, действительно openssl_x509_export() создаёт сертификат х509. С этим уже разобрался. Ещё сертификат х509, как я понимаю, можно создавать так:
PHP:
$conf = array("x509_extensions" => "x509_extensions");
$csr = openssl_csr_new($dn, $privkey, $conf);
По идее, алгоритм создания сертификата для пользователя в сети следующий:
1. Пользователь генерирует у себя на компе ключевую пару (открытый и закрытый ключи).
2. Передаёт серверу сертификации открытый ключ и данные (имя, мэил...).
3. Сервер генерирует на основании открытого ключа и данных сертификат и передаёт его пользователю.
Возникает вопрос: как в функцию openssl_csr_new($dn, $privkey, $conf); должен передаватся открытый ключ? Если в массиве $dn, то в какое поле должен загружатся?
 

neko

tеam neko
jenia
> По идее, алгоритм создания сертификата для пользователя в сети следующий:

по идее, общепринятая практика такова:
пользователь создает собственный ключ и использует его для создания CSR (certificate signing request)
CSR это один файл где лежит и публичный ключ и DN (то что ты называешь "иия, мэил")

после чего этот запрос (CSR) оправляется CA и CA его подписывает и возвращает пользователю.

но в принципе, чисто теоретически, тебе ничто не мешает этот порядок изменить.
поскольку, судя по твоим вопросам, это все делается для собственного развлечения -- тебе ничто не мешает спросить у пользователя как его зовут и по этому составить DN для CSR, ключ и сразу все это подписать.
 

Alexandre

PHPПенсионер
после чего этот запрос (CSR) оправляется CA и CA его подписывает и возвращает пользователю
а можно сгенерить руут сертификат, который подписываешь сам, иначе он называется самоподписанный сертификат. В этом случае ты сам выступаешь в качестве СА.
 

jenia

Новичок
У меня курсовой проект. Задание - сервер сертификации (точнее жалкое его подобие).
Препод дал алгоритм:
1. Пользователь генерирует ключевую пару (открытый, закрытый ключи) и отдаёт открытый ключ серверу.
2. Сервер генерирует сертификат х509 и отдаёт его пользователю.
Формат сертификата х.509 предполагает наличие поля Subject Public Key Info (открытый ключ владельца).
Можете подсказать, где при генерации сертификата нужно использовать открытый ключ пользователя?
 

Alexandre

PHPПенсионер
Задание - сервер сертификации (точнее жалкое его подобие).
половина проектов... жалкое подобие чего-либо...

1. Пользователь генерирует ключевую пару (открытый, закрытый ключи) и отдаёт открытый ключ серверу.
2. Сервер генерирует сертификат х509 и отдаёт его пользователю.
- Пользователь генерит пару ключей
- Пользователь генерит - запрос на серификат CSR, запрос подписывается закрытым ключем (автоматически)
- Сервер на основании CSR, генерит сертификат и подписывает его и отдает пользователю.

Все есть в тех ссылках - которые я давал....
http://www.pseudonym.org/ssl/ssl_ca.html#creating

Subject Public Key Info - это информация об Ключе и алгоритмах цифровой подписи (они могут быть разные, например RSA или DSA)

Сертификат подписывается СА (сервером).
 

jenia

Новичок
Как я понял, по одному открытому ключю сервер не может сгенерировать сертификат х.509.
Тогда возникли вопросы:
1. Чем под виндой пользователь может сгенерировать CSR? Я имею ввиду есть ли бесплатные проги и т.д.?
2. Какой функцией (функциями) openssl под php генерирует сертификат х.509 на основании csr пользователя?
3. Подписывать сертификат функцией openssl_sign или нет?

Кстати на счёт поля Subject Public Key Info. Вот по этому адресу: http://bezpeka.com/ru/lib/sec/art408.html сказано, что Subject Public Key Info это открытый ключ пользователя, а не только информация о нём. Правда ещё в одной документации указано, что поле Subject Public Key Info содержит два раздела: algorithm - алгоритм цифровой подписи и subjectPublicKey - открытый ключ пользователя.
 

neko

tеam neko
я думаю CSR под виндой можно сгенерировать тем же openssl.
консольной тулзой.
 

Alexandre

PHPПенсионер
Чем под виндой пользователь может сгенерировать CSR? Я имею ввиду есть ли бесплатные проги и т.д.?
на барахолке я видел СиДи - "защита информации", там таких прог было навалом.
Тотже OpenSSL версия под Вин или установи CygWin вместе с OpenSSL.

также есть тулза Mozilla Nss http://www.mozilla.org/projects/security/pki/psm/
http://www.mozilla.org/projects/security/pki/nss/tools/
 
Сверху