Создание SSL ключа

s@nch0

Хочу всё знать
Создание SSL ключа

Доброй ночи.

Имеется сертифика(server.crt) Необходимо создать SSL ключ.
Вот что у меня получилось:
<?php

$privkey = openssl_pkey_new();
openssl_pkey_export_to_file($privkey, "d:/user.key", "password");

?>

Но как мне кажется, данный ключ никак не связан с имеющимся сертификатом.
Нашёл ещё такую функцию: openssl_x509_read()
Но я не понял, что ей нужно передавать в качестве парамерта. Если указать путь к файлу сертифика("d:/server.crt"), то в результате она вернёт FALSE.

Всё тестируется под Win2k+SP4. Версия libeay32.dll - 0.9.8.1
PHP 4.4.1

Спасибо.
 

s@nch0

Хочу всё знать
Alexandre
1)Затем, зачем в php есть функции OpenSSL
2)Как причём? Хочу на php написать такой скрипт. Что не понятного то ?
3)Смотрел. Там есть примеры, как это сделать через ком. тулзу openssl.

Примеров на php я там не заметил.
Вот, например, такой пример:
openssl genrsa -des3 -out privkey.pem 2048
With this variant, you will be prompted for a protecting password.

А как сразу указать пароль в ком. строке ?

Потому как если не получиться средствами php, то придётся юзать system. А делать это - самый последний вариант.

Спасибо.

-~{}~ 22.09.06 14:33:

Неужели никто не может помочь моей проблеме ?
 

Alexandre

PHPПенсионер
Примеров на php я там не заметил.
и не заметишь, это системная тулза.

часть openssl я использовал в пхп, но все что касается создания ключей лучше сделать через 'system'

что касается, как ввести пароль через сустем, так надо использовать popen www.php.net/popen
 

valyala

Новичок
Но как мне кажется, данный ключ никак не связан с имеющимся сертификатом.
s@nch0, сертификат - это открытый ключ с дополнительными атрибутами, подписанный чьим-то закрытым ключом. Если хочешь извлечь открытый ключ из сертификата, то используй [m]openssl_x509_parse[/m].
 

s@nch0

Хочу всё знать
valyala
Может быть я чего-то недопонимаю, но мне нужно сделать след.
На сервере установлен сертификат. Мне нужно по паролю генерировать SSL ключи. Я это делаю так:
<?php

$privkey = openssl_pkey_new();
openssl_pkey_export_to_file($privkey, "d:/user.key", "password");

?>

Но мне так кажется, что это не правильно. Т.к. данный ключ никаким образом не завязан с сертификатом. Или я не прав ?
Помогите, пожалуйста. Очень надо.

-~{}~ 22.09.06 22:35:

Или моя задача вообще не имеет решения, потому как неверно поставлена ???
 

valyala

Новичок
s@nch0, перед тем, как использовать двухключевую криптографию на практике, необходимо разобраться в теории.

Если на сервер установлен сертификат, то значит на этом же сервере где-то находится закрытый ключ - пара к открытому ключу, находящемуся в сертификате. С помощью этого закрытого ключа можно создавать цифровые подписи под любыми документами, в т.ч. и под генерируемыми ключами, тем самым "связывать" эти ключи с сертификатом.

Цифровая подпись под документом гарантирует, что:
1) документ принадлежит тому, у кого находится закрытый ключ - пара к открытому ключу, находящемуся в сертификате;
2) документ не был модифицирован после создания цифровой подписи.

Корректность цифровой подписи проверяется с помощью открытого ключа, находящегося в сертификате. Центр сертификации, выдавший сертификат, гарантирует, что владелец сертификата и создатель цифровой подписи под документом - одно лицо.

Как найти закрытый ключ - пару к открытому ключу, находящемуся в сертификате? Если на сервере установлен apache, и в нем включена поддержка SSL, то в апачевских конфигах поищи строчки
SSLCertificateFile /path/to/crtifiate
SSLCertificateKeyFile /path/to/private/key
где
/path/to/certificate - путь к файлу с сертификатом
/path/to/private/key - путь к файлу с закрытым ключом


Мне нужно по паролю генерировать SSL ключи.
Если генерировать ssl ключи по паролю, то их криптостойкость сильно пострадает. В двухключевой криптографии ключи обычно формируются на основе последовательности случайных чисел без всяких там паролей. Заметь, что в функцию [m]openssl_pkey_new[/m] не передаются пароли, в то время, как именно она генерирует пару ключей.
Пароль нужен лишь для того, чтобы зашифровать сгенерированные ключи при записи их в файл. Именно для этого и предназначена функция [m]openssl_pkey_export_to_file[/m].

А теперь расскажи, зачем тебе понадобилось "генерировать SSL ключи", связанные с сертификатом? Я уверен на 99%, что лучше обойтись без них.
 

s@nch0

Хочу всё знать
valyala
Alexandre
Знакомый попросил сделать след. вещь.
На сервере установлен сертификат. Нужно генерировать ССЛ ключи для каждого пользователя (по паролю пользователя). Потом по https он будет передавать эти данные. Вот в двух словах.
Скажу сразу, предметной частью владею плохо. Я только учусь. Надеюсь на Вашу помощь.

Спасибо.
 

valyala

Новичок
Насколько я понял, твой знакомый хочет генерировать персональные сертификаты для пользователей (это и есть ключи пользователя, связанные с сертификатом сервера). Для этого нужно, чтобы сертификат, установленный на сервере, имел атрибут CA, равный true, т.е. чтобы с помощью этого сертификата можно было создавать другие сертификаты. Обычно корневые центры сертификации типа thawte и verisign выдают сертификаты, годные лишь для подтверждения подлинности сервера, но не создания других сертификатов (т.е. у них атрибут CA равен false). Поэтому, если сертификат, установленный на сервер, был подписан одним из корневых центров, то, скорее всего, он не годен для создания пользовательских сертификатов.

Эту проблему можно обойти, создав собственный корневой сертификат с установленным атрибутом CA = true. Но в этом случае возникнет новая проблема - пользовательские браузеры будут предупреждать, что не доверяют такому корневому сертификату. Чтобы убрать это предупреждение, пользователи должны будут поместить сгенерированный сертификат в список доверенных центров сертификации.

Для того, чтобы создать пользовательский сертификат, нужно выполнить следующую последовательность действий:
1) сгенерировать пару ключей. Делается с помощью [m]openssl_pkey_new[/m];
2) создать запрос на подпись сертификата с помощью [m]openssl_csr_new[/m] для пользовательских ключей, сгенерированных на шаге 1;
3) подписать сертификат с помощью [m]openssl_csr_sign[/m]. Именно эта функция "связывает" ключи пользователя с сертификатом, установленным на сервере.
4) экспортировать пользовательский сертификат с помощью [m]openssl_x509_export[/m]

После того, как пользовательский сертификат создан, нужно зашифровать закрытый ключ пользовательским паролем. Для этого закрытый ключ достается из сгенерированной пары ключей с помощью [m]openssl_pkey_get_private[/m], после чего зашифровывается и экспортируется с помощью [m]openssl_pkey_export[/m].

После этого можно спокойно отдавать пользователю экспортированный сертификат вместе с зашифрованным закрытым ключом.

ps. Вооще-то, шаг 1 (и частично 2) обычно делается на стороне пользователя, т.к. закрытый ключ, генерируемый на первом шаге, на то и закрытый, что должен быть известен лишь его владельцу и никому больше, в т.ч. и стороне, выдающей сертификат на открытую часть ключа.
На странице https://www.wmcert.com/Rus/Asp/Registration.asp можно посмотреть, как генерировать ключ и создавать запрос на подпись сертификата на стороне клиента.
 

Alexandre

PHPПенсионер
все сказанно, мне добавить нечего,
хотя мои 5 копеек...
1) создать СА сертификат используя утилиту openssl даже будет корректней www.openssl.org
 
Сверху