Итак, предполагается что уже существует директория /usr/cert/sslcert (рекомендуется на шифрованом диске), где собственно все и будет происходить. Переходим в эту директори и поехали. mkdir certs private echo '01' > serial touch certindex.txt Создаем конфигурационный файл openssl.cnf такого содержания (при необходимеости исправив нужные поля): # # OpenSSL configuration file. # # Establish working directory. dir = . [ ca ] default_ca = CA_default [ CA_default ] serial = $dir/serial database = $dir/certindex.txt new_certs_dir = $dir/certs certificate = $dir/cacert.pem private_key = $dir/private/cakey.pem default_days = 365 default_md = md5 preserve = no email_in_dn = no nameopt = default_ca certopt = default_ca policy = policy_match [ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional [ req ] default_bits = 1024 # Size of keys default_keyfile = key.pem # name of generated keys default_md = md5 # message digest algorithm string_mask = nombstr # permitted characters distinguished_name = req_distinguished_name req_extensions = v3_req [ req_distinguished_name ] # Variable name Prompt string #------------------------- ---------------------------------- 0.organizationName = Organization Name (company) organizationalUnitName = Organizational Unit Name (department, division) emailAddress = Email Address emailAddress_max = 40 localityName = Locality Name (city, district) stateOrProvinceName = State or Province Name (full name) countryName = Country Name (2 letter code) countryName_min = 2 countryName_max = 2 commonName = Common Name (hostname, IP, or your name) commonName_max = 64 # Default values for the above, for consistency and less typing. # Variable name Value #------------------------ ------------------------------ 0.organizationName_default = My Company localityName_default = My Town stateOrProvinceName_default = State or Providence countryName_default = US [ v3_ca ] basicConstraints = CA:TRUE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer:always [ v3_req ] basicConstraints = CA:FALSE subjectKeyIdentifier = hash Дальше создаем корневой сертификат: openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out cacert.pem -days 365 -config ./openssl.cnf Рекомендуется увеличить параметр -days (указывается в днях) до нескольки лет (но не больше чем 10 лет): дата окончания действия сертификатов, подписаных корневым сертификатом, не может быть больше даты окончания действия самого корневого сертификата. Будет запрошен пароль, которым будет зашифрован приватный ключ. Очень не рекомендуется забывать этот пароль ;) Будет задано пару вопросов по тому, какую информацию вписать в какие поля: Organization Name (company) - имя организации, генерирующей сертификат Organizational Unit Name - название отдела, генерирующего сертификат Email Address - контакнтый адрес электронной почты Locality Name (city, district) - имя местоположения (город) State or Province Name (full name) - область Country Name - страна (двубуквенный код) Common Name (hostname, IP, or your name) - сюда для корневого сертификата рекомендуется вписывать Certificate Authority После заполнения всех полей будет сгенерирован приватный ключ и сертификат. Никаких сообщений/поздравлений в случае удачного завершения выводиться не будет, просто будут созданы файлы cacert.pem - сертификат и private/cakey.pem - приватный ключ. Да, на всякий случай лучше сразу убрать любые пермишены для с приватного ключа: chmod -R og-rwx private Посмотреть что же у нас получилось можно вот так: openssl x509 -in cacert.pem -noout -text Корневой сертификат готов, теперь его можно использовать. Например для генерации сертификата дла Apache делаем так: Генерируем приватный и публичный ключ для нужного нам вебсайта. Это действие совсем не обязательно делать на машине, на которой находится приватный ключ корневого сертификата. Более того, лучше это делать непосредственно на сервере, где будет использоваться этот сретификат, дабы избежать излишних транспортировок приватного ключа по серверам. openssl req -new -nodes -out name-req.pem -keyout private/name-key.pem -config ./openssl.cnf Опять заданы будут вопросы. При заполнении полей особое внимание следует обратить на поле Common Name: оно должно точно совпадать hostname части вебсайта. Передаем файл на name-req.pem на сервер, где мы держим приватный ключ корневого сертификата и подписываем его там: openssl ca -out name-cert.pem -config ./openssl.cnf -infiles name-req.pem Будем запрошен пароль, которым зашифрован корневой приватный ключ, потом выведена информация, содержащаяся в запросе на подпись. Отвечаем два раза y и получаем подписаный сертификат name-cert.pem и его копию в certs (имя файла будет совпадать с серийным номером этого сертификата). Полученый name-cert.pem копируем на сервер, где он будет использоваться, и прописываем его в конфиге apache. При подготовке использованы материалы: http://www.eclectica.ca/howto/ssl-cert-howto.php http://www.flatmtn.com/computer/Linux-SSLCertificates.html