Многие прикладные протоколы, такие как HTTP, SMTP, POP3, IMAP, TELNET
были придуманы в те далекие времена, когда в Сети не было "браконьерства”, все
люди были братья и доверяли друг другу. Но с тех пор, как Интернет вошел во все
сферы современного человека, он сильно изменился. Так же, как когда-то назрела
необходимость ставить противоугонные сигнализации на автомобили, появилась
необходимость и в защите передачи данных. Было придумано криптование. Появилась
даже целая наука, под названием криптография. А прежние прикладные
протоколы были переписаны и с учетом требований безопасности они теперь
поддерживали шифрование передаваемых данных. Нешифрованные протоколы,
естественно, не ушли в небытие и по-прежнему широко используются в Сети. Но если
Вам необходима безопасность и уверенность в том, что при авторизации где-либо
никто не перехватит Ваш пароль, Вы можете использовать в работе протоколы
https, smtps,
pop3s, imaps,
ssh и т.д., которые будут хранить Вашу
конфиденциальную информацию с применением SSL шифрования.
Протокол SSL (Secure Socket Layer) использует асимметричную
криптографию, обычно известную как криптография с открытым ключом. В
криптографии с открытым ключом создаются два ключа, одни публичный, другой
секретный. Все зашифрованное с помощью одного ключа может быть расшифровано
только с помощью другого. То есть данные, которые были зашифрованы секретным
ключом сервера могут быть дешифрованы только с помощью публичного ключа этого же
сервера, давая уверенность в том, что данные пришли оттуда от него.
Более подробно об SSL можно почитать в Wiki. Мы же займемся
настройкой поддержки SSL шифрования для нашего веб сервера Apache.
В статье ранее был опубликован материал по установке и настройке Apache
1.3 на машину под управлением операционной системы FreeBSD. В
этой же статье было рассказано о том, как подключить для работы Apache
интерпретатор PHP и модуль Perl. Теперь поговорим о том, как же обезопасить
соединения с нашим веб сервером.
Для работы нам впервую очередь понадобится openssl.
В системе он уже должен присутствовать. Проверьте:
Отлично. OpenSSL имеется. Если у Вас ситуация иная, загляните в порт /usr/ports/security/openssl и
установите openssl из него.
Теперь следует поставить Apache с поддержкой SSL. У меня раньше стоял без
поддержки, потому его следует деинсталлировать.
# pkg_info | grep apache
apache-1.3.41 The extremely popular Apache http server.
# pkg_delete apache-1.3.41
Далее идем в порты, достаем оттуда www/apache13-modssl и собираем
его.
# cd /usr/ports/www/apache13-modssl
# make
Старый конфиг httpd.conf
(надеюсь, Вы его забекапили перед тем, как снесли старую версию?) выбрасывать не
стоит. Он нам пригодится в дальнейшем и нам ничего не прийдется настраивать
заново - только довнести определенные параметры настройки SSL.
После сборки пакета на экран вывалится инфо:
<=== src/support
+---------------------------------------------------------------+
| Before you install the package you now should prepare the SSL |
| certificate system by running the 'make certificate' command. |
| For different situations the following variants are provided: |
| |
| % make certificate TYPE=dummy (dummy self-signed Snake cert) |
| % make certificate TYPE=test (test cert signed by Snake CA) |
| % make certificate TYPE=custom (custom cert signed by own CA) |
| % make certificate TYPE=existing (existing cert) |
| CRT=/path/to/your.crt [KEY=/path/to/your.key] |
| |
|Use: |
| TYPE=dummy when you're a vendor package maintainer, |
| TYPE=test when you're an admin but want to do tests only, |
| TYPE=custom when you're an admin willing to run a real server |
| TYPE=existing when you're an admin who upgrades a server. |
| (The default is TYPE=test) |
| |
| Additionally add ALGO=RSA (default) or ALGO=DSA to select |
| the signature algorithm used for the generated certificate. |
| |
| Use 'make certificate VIEW=1' to display the generated data. |
| |
| Thanks for using Apache - mod_ssl. Ralf S. Engelschall |
| rse@engelschall.com |
| www.engelschall.com |
+---------------------------------------------------------------+
<=== src
===> Creating Dummy Certificate for Server (SnakeOil)
use 'make certificate' to create a real one]
Нам советуют сразу же создать сертификаты SSL.
Прежде чем инсталлировать пакет, Вы должны приготовить SSL сертификат путем
запуска команды ‘make certificate’. Для различных ситуаций предлагаются следущие
варианты:
% make certificate TYPE=dummy (”тупой” самоподписанный сертификат
Snake)
% make certificate TYPE=test (тестовый сертификат Snake подписанный Snake
CA)
% make certificate TYPE=custom (выборочные параметры сертификата, который
будет подписан собственным CA)
% make certificate TYPE=existing (использовать существующий сертификат)
TYPE=dummy если Вы попросту собираете пакет из исходников
TYPE=test если Вы администратор, но желаете попросту провести тесты
TYPE=custom если Вы администратор и желаете запустить рабочий сервер
TYPE=existing если Вы администратор и обновляете свой сервер.
(По умолчанию применяется TYPE=test)
Отдельно Вы можете указать: ALGO=RSA (по-умолчанию) или ALGO=DSA для выбора
алгоритма подписи, который будет использован при генерировании сертификата.
Используйте ‘make certificate VIEW=1′ для отображения сгенерированных
данных.
Спасибо, что юзаете Апача с модом ССЛ.
Что-ж, не будем пренебрегать этим советом. Сгенерируем custom сертификат.
make certificate TYPE=custom
Начнем отвечать на вопросы.
STEP 0: Signature Algorithm ((R)SA or (D)SA) [R]: - Выбираем тип
алгоритма шифрования подписи - R
STEP 1: Генерируется персональный (секретный) RSA ключ для
поставщика сертификата.
STEP 2: - Следует ответить на вопросы о поставщике сертификата.
Если мы генерируем сертификат самостоятельно, то и информацию будем вводить о
себе. Будущий сертификат будет "выдан самим собой”. Хотя, если Вам действительно
необходим сертификат от действительно сертифицированного поставщика, можете
обратиться, например, в Verisign.
1. Country Name - двухбуквенный код страны - UA (Украина) или RU (Россия)
2. State or Province Name - название провинции (штата, области) - DP
3. Locality Name - город - Dnepropetrovsk
4. Organization Name - название организации - Daemony’s Personal
5. Organizational Unit Name - подразделение - Certificator
6. Common Name - основное имя подписывающего сертификатора - Daemony CA
7. Email Address - ну тут понятно, думаю.
8. Certificate Validity - срок действия сертификата, дней - 1095
STEP 3: Генерируется X.509 сертификат поставщика, который был
выдан самим собой [ca.crt].
STEP 4: Генерируется персональный (секретный) RSA ключ для
нашего сервера.
STEP 5: - Следует ответить на вопросы о нашем сервере и его
владельце. Вобщем, информация которую мы ниже введем будет доступна при
просмотре нашего будущего сертификата сервера. Важно! Пункт 6 - Common Name -
следует указать в точности такой как и доменное имя Вашего сервера.
1. Country Name - двухбуквенный код страны - UA (Украина) или RU (Россия)
2. State or Province Name - название провинции (штата, области) - DP
3. Locality Name - город - Dnepropetrovsk
4. Organization Name - название организации - Daemony’s Secured Server
5. Organizational Unit Name - подразделение - Some else
6. Common Name - основное имя сервера (!!!) - seсure.com
7. Email Address - электронный адрес администратора сервера.
8. Certificate Validity - срок действия сертификата, дней - 1095
STEP 6: Генерируется X.509 сертификат для сервера seсure.com
[server.crt]
STEP 7: RSA шифрование персонального ключа поставщика
сертификата (CA) с помощью пароля [ca.key].
Вам расскажут о том, что файл ca.key содержит очень важную информацию, а
спросят "следует ли засекретить ca.key установив на него пароль”?
Encrypt the private key now? [Y/n]:
Ну попробуем согласиться, и нажать Y.
writing RSA key
Нас попросят ввести пароль, а потом его повторить:
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
Если Вы неверно введете подтверждение пароля скрипт завершит свою работу с
ошибкой. Если все хорошо, то Вы увидите:
Fine, you’re using an encrypted private key.
STEP 8: Аналогично, как и в предыдущем случае, нам предложат
поставить пароль на персональный ключ сервера [server.key]. Согласимся.
Все. Программа на этом завершает свою работу. По окончании операции мы
получим сгенерированные файлы
Как сделать так, чтобы прежний виртуальный сервер, который у нас уже был в
конфиге, работал теперь по https, а всех пришедших на него по http перенаправлял
туда же? Очень просто. Допустим у нас в файле httpd.conf уже существовал сервер:
<VirtualHost seсure.com:80>
ServerName seсure.com
ServerAdmin root@seсure.com
DocumentRoot /usr/local/www/seсure.com/htdocs
CustomLog /usr/local/www/seсure.com/logs/access.log combined
ErrorLog /usr/local/www/seсure.com/logs/error.log
<Directory "/usr/local/www/seсure.com/htdocs”>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
Переместим все файлы этого сервера из папки /usr/local/www/seсure.com/htdocs/
в /usr/local/www/seсure.com/htdocs-s/, а в /usr/local/www/seсure.com/htdocs/
оставим всего один файл - .htaccess с таким содержанием:
Redirect permanent / https://secure.com/
Сохраняем httpd.conf. Проверяем
все пути к файлам и папкам, а также права на них. И пробуем запускать наш
сервер.
Для того, чтобы запустить Apache с поддержкой SSL следует выполнить
команду:
# apachectl startssl
В этот момент наш Apache попытается прочесть собственный персональный ключ
server.key. Однако, ранее мы на server.key установили пароль, а потому apache у
нас его запросит:
root# apachectl startssl
Apache/1.3.41 mod_ssl/2.8.31 (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide us with the pass phrases.
Server secure.com:443 (RSA)
Enter pass phrase:
Не введете правильно пароль, сервер не запустится. Собственно, данным
примером я показал для чего мы все таки поставили пароль на персональный ключ -
для его защиты. Но для запуска сервера при старте системы постоянно вводить
пароль, естественно, мы не сможем. Сейчас мы это ограничение уберем и снимем
защиту по паролю к персонального ключа.
root# cd /usr/local/etc/apache/ssl.key
root# cp server.key server.key.backup
root# openssl rsa -in server.key.backup -out server.key
Enter pass phrase for server.key.backup: вводим наш пароль
writing RSA key
Все. Пароль больше Apache не спросит. Но учтите, что Вы должны теперь
позаботиться о максимальной сохранности файла server.key. Сделать это можно
только лишь установив верно права на файлы и каталоги.
Проверяем наличие строки apache_enable=”YES” в файле
/etc/rc.conf и пробуем вновь запустить наш Apache:
root# apachectl startssl
/usr/local/sbin/apachectl startssl: httpd started
Все работает. Теперь попробуем проверить работает ли перенаправление http://secure.com/ ->
https://secure.com/ . Если получаете какую-либо ошибку,
проверьте первым делом, что у Вас в httpd.conf подключен модуль mod_rewrite.
Хотя если Вы ничего не изменяли, по-умолчанию он присутствует.
При первом входе на Ваш сервер https://secure.com/ браузер даст
Вам знать о том, что прислан SSL сертификат. Также Вы узнаете, что этот
сертификат не подписан ни одним из доверенных издателей. Вобщем Ваше право
принимать такой сертификат ;).
Кроме запуска, останова и перезапуска Apache посредством apachectl можно
использовать стандартный rc скрипт, который поставляется вместе с дистрибутивом
и после инсталяции помещается в папку /usr/local/etc/rc.d/. Если посмотреть в
скрипт, то можно увидеть такую строчку:
apache_flags=”-DSSL”
Эта опция заставляет запускаться Apache с поддержкой SSL.
Учтите, что с использованием SSL расходы трафика будут больше, потому что
передается больше данных. В основном, это для пользователя не нужные данные и
содержат они в себе ключи шифрования и сами данные в шифрованном виде. Но по
большому счету, это все мелочи.