Создание самоподписного SSL-сертификата и настройка хоста Apache 2 для работы по https

Внимание! Для новых версий Ubuntu (начиная с 10.04+ и вплоть до актуальной Ubuntu 12.04 LTS) существует и уже представлен у нас на сайте более простой способ создания самоподписного SSL-сертификата для Apache2. Но и эту статью мы оставляем на сайте в виду ряда полезных комментариев.

Великий веб-сервер Apache 2 умеет работать по защищенному протоколу https в рамках которого всё передаваемая информация шифруется сервером и клиентом по криптографическому протоколу SSL. Это значит, что даже перехвативший запросы клиента и страницы возвращаемые сервером — не сможет посмотреть содержание этих запросов и этих страниц. Как минимум, все эти данные постоянно оседают у провайдера и если, например, его гнусный сотрудник захочет, то легко узнает те пароли, которые вы отправляете на многие сайты в POST- или GET-запросах.

Для собственного сервера вам, как минимум, следует беречь пароли от баз данных, вбвиаемые в веб-морду phpMyAdmin.

Для того, чтобы организовать шифрованную передачу по протоколу SSL требуется специальный сертификат на сервере. Его подтверждают (обычно за деньги) всякие серьёзные центры по сертификации. Но можно сгененрировать сертификат и самостоятельно — такой сертификат называется самоподписным, потому что никакой центр аттестации его не подтверждает, а подтверждаете лично вы.

Понятно, что для сайтов из мира электронной коммерции (особенно для тех, где имеется некий личный кабинет с каким-то счётом, который может быть злоумышленником опустошён) применять требуется полноценные сертификаты, подтверждённые авторитетным центром, а для сайтов не хранящих какие-то важные пользовательские данные — шифрование вообще ни к чему (ещё и нагрузку на сервер создаёт же), но для собственных нужд (вроде упомянутого phpMyAdmin`а) — сойдём и самоподписной.

Всего-то придётся успокоить браузер, при попытке первого соединения с хостом, зашифрованным самоподписным сертификатом, разок взглянув на примерно такое окошко:

Что, конечно, критично для неосведомлённых посетителей (тем более, если ваш сайт ориентирован далеко не на гиков), но годно — для вас лично или для команды разработчиков, коллег и пр. Так вот о том, как на своём сервере за несколько минут для нужного хоста настроить SSL с самоподписным сертификатом — далее и пойдёт речь.

Активируем соответствующий модуль Apache2, сделать это в любимом дистрибутиве можно так:
sudo a2enmod ssl

Создаём свой ключ для шифрования:
sudo openssl genrsa -des3 -out server.key 1024

В конце потребуется пару раз ввести (задать и подтвердить) пароль для вашего ключа. Тут всё стандартно: не забывайте свой пароль, но и не записывайте его на стикере в углу монитора. Минимально допустимая длина пароля тут — 4 символа, но рекомендуется задать пароль в 8+ символов, да такой, чтоб он содержал буквы разных регистров и цифры.

Можно создать не шифрованную копию ключа вот так:
sudo openssl rsa -in server.key -out server.key.insecure

И для удобства это лучше сделать: иначе при каждой (ре-)активации хоста с SSL потребуется вводить пароль.

Плюс вот в чём: не придётся вводить пароль при запуске сервера.

Создав не шифрованную копию, давайте далее использовать именно её, поэтому совершим пару переименований (в результате которых, ключ с паролем окажется в файле server.key.secure и далее нами использоваться не будет):
sudo mv server.key server.key.secure
sudo mv server.key.insecure server.key

Теперь будем создавать CSR, это тоже просто:
sudo openssl req -new -key server.key -out server.csr

Вас попросят сообщить информацию о себе, в принципе (поскольку сертификат мы создаём самоподписной) можно ничего не сообщать, тупо вводя пустые ответы. Но если вы захотите получить «настоящий» сертификат CA, то все данные, конечно, надо заполнить, притом указывая достоверные значения.

Но перейдём к процессу самоподписания:
sudo openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Сертификат на этом, кстати, готов. Теперь надо скопировать файлы куда положено (чтоб их увидел Apache2) и настроить на обработку ssl сам веб-сервер.

Копируем ключи:
sudo cp server.crt /etc/ssl/certs
sudo cp server.key /etc/ssl/private

Теперь настроим на использование SSL виртуальный хост, я сделаю это с хостом по умолчанию, который обязательно доступен сразу после установки Apache.

Теперь нам потребуется создать виртуальный хост, который будет поддерживать SSL. Итак, для начала создадим конфигурационный файл:
sudo nano /etc/apache2/sites-available/example

И разместим туда примерно такую конфигурацию хоста:
<VirtualHost *:80>
ServerAdmin root@domain.tld
ServerName domain.tld
ServerAlias www.domain.tld
DocumentRoot /var/www/example/public_html
<Directory /var/www/example/public_html>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog /var/www/example/error.log
CustomLog /var/www/example/access.log combined
</VirtualHost>
<VirtualHost *:443>
ServerAdmin root@domain.tld
ServerName domain.tld
ServerAlias www.domain.tld
DocumentRoot /var/www/example/public_html
SSLEngine on
SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key
<Directory /var/www/example/public_html>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog /var/www/example/error.log
CustomLog /var/www/example/access.log combined
</VirtualHost>

Корнем сайта при этом будет директория /var/www/example/public_html, логи будут храниться в директории /var/www/example, а обслуживаться хостом будет домен domain.tld.

Вы уже, наверное, отметили для себя, чтоб для обычного http-соединения по 80 порту и для защищённого https-соединения по 443 порту создано два отдельных виртуальных хоста, во второй из хостов, соответственно, добавлены директивы для активации ssl, а остальные настройки совпадают. Но, в общем случае, настройки могли и различаться, т.е., грубо говоря, на одном домене но по разным протоколам (http или https) могут размещаться совершенно разные сайты.

И ещё есть такой нюанс: если вы собираетесь для нескольких виртуальных хостов на своём сервере использовать ssl, то описывать все хосты надо в отдельных файлах, т.е. для данного примера следовало бы создать /etc/apache2/sites-available/example и отдельно /etc/apache2/sites-available/example-ssl, описав по одному виртуальному хосту в каждом, а в файл /etc/apache2/apache2.conf надо добавить такую строку (например, в самый конец):

NameVirtualHost *:443

Иначе можете встретить такую примерно ругань от Apache: [warn] _default_ VirtualHost overlap on port 443, the first has precedence

Итак, сохраняем файл.

Активируем наш новый хост:
sudo a2ensite example

Теперь научим Apache ждать соединение на стандартном для SSL порту 443, для этого отправимся редактировать файл:
sudo nano /etc/apache2/ports.conf

Теперь надо осмотреться, если там уже есть блок подобный этому:
<IfModule mod_ssl.c>
    Listen 443
</IfModule>

Тогда никаких правок вносить не надо (при включение модуля ssl веб-сервер сам начнёт слушать нужный нам порт).

А вот если похожего блока нет, то добавляйте его в конец файла.

Сохраняем (если вносили изменения) или закрываем файл (в nano это можно сделать кнопкой F2).

Перезапускам веб-сервер:
apache2ctl restart

Всё, можно пробовать заглянуть на свой хост по https.

Re: Создание самоподписного SSL-сертификата и настройка ...

Здравствуйте, сделал всё по статье, при заходе по протоколу https получаю такое сообщение

Forbidden

You don't have permission to access / on this server.

а в лог error.log такую запись:

[Sun Dec 12 20:15:32 2010] [warn] RSA server certificate CommonName (CN) `Oleg' does NOT match server name!?
[Sun Dec 12 20:15:32 2010] [warn] RSA server certificate CommonName (CN) `Oleg' does NOT match server name!?
[Sun Dec 12 20:15:49 2010] [error] [client 91.103.77.57] client denied by server configuration: /var/www/
[Sun Dec 12 20:15:50 2010] [error] [client 91.103.77.57] client denied by server configuration: /var/www/favicon.ico

Re: Создание самоподписного SSL-сертификата и настройка ...

А по 80 порту (http) у вас нормально при этом заходит?

И чего показывает вывод вот этого:
openssl x509 -noout -text -in server.crt

Re: Создание самоподписного SSL-сертификата и настройка ...

Интересная статья по настройке Webdav на Apache с ssl. Поможет организовать безопасный обмен данными. http://plutonit.ru/view_post.php?id=168

Re: Создание самоподписного SSL-сертификата и настройка ...

Сделал все как написано в статье и сервер кажись лег надежно при рестарте апача выдает
alex@extensa:~$ sudo /etc/init.d/apache2 restart
[sudo] password for alex:
* Restarting web server apache2 apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs
[fail]

Теперь совсем не понятно как такое лечится.

Re: Создание самоподписного SSL-сертификата и настройка ...

все разобрался у меня все заработало на предыдущее сообщение отвечать не надо. Спасибо огромное за статью. Автору +1000

Re: Создание самоподписного SSL-сертификата и настройка ...

Расскажите что в итоге Вы сделали? У меня сейчас точно такая же ошибка возникла.

Re: Создание самоподписного SSL-сертификата и настройка ...

Такая ошибка может возникать, когда файл ключей был запаролен при создании CSR.
Вот решение:
1. Смотрим номер процесса apache2 на 80 порту.
root@star:/home/akajedi# sudo netstat -ltnp | grep ':80'
tcp6 0 0 :::80 :::* LISTEN 847/apache2
2. Убиваем его.
root@star:/home/akajedi# sudo kill -9 847
3. Рестартим апач.
root@star:/home/akajedi# service apache2 restart
* Restarting web server apache2 Apache needs to decrypt your SSL Keys for 123456.com:443 (RSA)
4. Вводим пароль на файл ключей.
Please enter passphrase: [ OK ]

Re: Создание самоподписного SSL-сертификата и настройка ...

Афтару респект! заработало с первого раза, отличная статейка !

Re: Создание самоподписного SSL-сертификата и настройка ...

Автор супер)
Все действительно заработало с первого раза =)

Re: Создание самоподписного SSL-сертификата и настройка ...

делал все по инструкции. Но при перезапуска апача вылезла ошибка:
root@serv:/home/alex# service apache2 restart
Syntax error on line 13 of /etc/apache2/sites-enabled/pma.pma-ssl:
order takes one argument, 'allow,deny', 'deny,allow', or 'mutual-failure'
Action 'configtest' failed.
The Apache error log may have more information.
...fail!

файл pma.pma-ssl:

<VirtualHost *:443>
ServerAdmin admin@localhost
ServerName pma.pma
ServerALias www.pma.pma
DocumentRoot /var/vhosts/pma.pma/www
SSLEngine on
SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key
<Directory /var/vhosts/pma.pma/www>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow, deny
allow from all
</Directory>
ErrorLog /var/vhosts/pma.pma/logs/error.log
CustomLog /var/vhosts/pma.pma/logs/access.log combined
</VirtualHost>

в чем дело?

Re: Создание самоподписного SSL-сертификата и настройка ...

дело в пробеле в "allow, deny" :)

Re: Создание самоподписного SSL-сертификата и настройка ...

просто убрал строку Order allow, deny
открыл в браузере pma.pma:443
вот что выдает браузер :
Ошибка 102 (net::ERR_CONNECTION_REFUSED): Сервер отказал в подключении.

лог ошибок:

[Tue Jun 12 00:03:30 2012] [error] Init: Pass phrase incorrect
[Tue Jun 12 00:03:30 2012] [error] SSL Library Error: 218529960 error:0D0680A8:a
sn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Tue Jun 12 00:03:30 2012] [error] SSL Library Error: 218640442 error:0D08303A:a
sn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error
[Tue Jun 12 00:03:30 2012] [error] SSL Library Error: 218529960 error:0D0680A8:a
sn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Tue Jun 12 00:03:30 2012] [error] SSL Library Error: 218595386 error:0D07803A:a
sn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error
[Tue Jun 12 00:03:30 2012] [error] SSL Library Error: 67710980 error:04093004:rs
a routines:OLD_RSA_PRIV_DECODE:RSA lib
[Tue Jun 12 00:03:30 2012] [error] SSL Library Error: 218529960 error:0D0680A8:a
sn1 encoding routines:ASN1_CHECK_TLEN:wrong tag
[Tue Jun 12 00:03:30 2012] [error] SSL Library Error: 218595386 error:0D07803A:a
sn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error

заново переделал сертификаты, копировал в папку ssl
- все равно ошибка 102.

Re: Создание самоподписного SSL-сертификата и настройка ...

Спасибо, из всего найденного в инете, ваша статья была наиболее полезна.. Хотя я и настраивал на WinXP. Были нюансы.. Пришлось создать папку c:/usr/local/ssl/openssl.cnf Файл требовался оттуда.. И почему-то апач отказался слушать порт 443. Возможно занят.. Посадил на 444.

Re: Создание самоподписного SSL-сертификата и настройка ...

Разобрался с портом 443. Skype занимал его без спроса.. :-) Запретил в скайпе - заработало в апаче..

Re: Создание самоподписного SSL-сертификата и настройка ...

Вот что получилось, не знаю в чем проблема
Тык

Re: Создание самоподписного SSL-сертификата и настройка ...

Все понял :D

Отправить комментарий

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.

Подробнее о форматировании

RSS-материал