Документация по ОС FreeBSD Суббота, 27.04.2024, 16:28
Приветствую Вас Гость | RSS
Меню сайта

Категории каталога
Apache [58]
DNS [25]
FTP [27]
Mail [74]
Samba [24]
Squid [46]
SSH [23]
VPN [35]
РРР [20]
Net [173]

Главная » Статьи » Сеть » Apache

Поддержка шифрования SSL в Apache (HTTPs) [2008]

Многие прикладные протоколы, такие как 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. В системе он уже должен присутствовать. Проверьте:

# whereis openssl
openssl: /usr/bin/openssl /usr/share/openssl/man/man1/openssl.1.gz

Отлично. 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 (использовать существующий сертификат)
  • CRT=/путь/к_вашему/сертификату.crt [KEY=/путь/к_вашему/ключу.key]

Используйте следущие опции:

  • 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]. Согласимся.

Все. Программа на этом завершает свою работу. По окончании операции мы получим сгенерированные файлы

conf/ssl.key/ca.key
conf/ssl.crt/ca.crt
conf/ssl.key/server.key
conf/ssl.crt/server.crt
conf/ssl.csr/server.csr

которые будут установлены в каталог /usr/local/etc/apache/. Можно проинсталить пакет и запустить Apache.

# make install clean
# apachectl start
[Sat Feb 23 00:09:23 2008] [warn] Loaded DSO libexec/apache/libphp5.so uses
 plain Apache 1.3 API, this module might crash under EAPI! (please recompile
 it with -DEAPI)
[Sat Feb 23 00:09:23 2008] [warn] Loaded DSO libexec/apache/libperl.so uses
 plain Apache 1.3 API, this module might crash under EAPI! (please recompile
 it with -DEAPI)
/usr/local/sbin/apachectl start: httpd started

Упс… Ругается. Прийдется теперь и PHP с Perl перекомпилировать, поскольку до этого он был собран с plain Apache 1.3 API.

# pkg_info | grep php5-5 ; pkg_info | grep mod_perl
php5-5.2.5_1 PHP Scripting Language
mod_perl-1.30 Embeds a Perl interpreter in the Apache server
# portupgrade –force php5-5.2.5_1 mod_perl-1.30

Пересобралось. Проверяем.

root# apachectl stop
 /usr/local/sbin/apachectl stop: httpd stopped
root# apachectl start
 /usr/local/sbin/apachectl start: httpd started

Вот теперь полный порядок! Можно перейти к конфигурирования нашего защищенного веб сервера.

Открываем /usr/local/etc/apache/httpd.conf и проверяем (а при отсутствии добавляем) следущие строки:

- в секции LoadModule после всех модулей:

 <IfDefine SSL>
   LoadModule ssl_module libexec/apache/libssl.so
 </IfDefine>

- в секции AddModule после всех модулей:

 <IfDefine SSL>
   AddModule mod_ssl.c
 </IfDefine>

- далее, после Port 80:

 <IfDefine SSL>
   Listen 80
   Listen 443
 </IfDefine>

- и напоследок

##### SSL #####
 <IfDefine SSL>
  AddType application/x-x509-ca-cert .crt
  AddType application/x-pkcs7-crl .crl
 </IfDefine>
 <IfModule mod_ssl.c>
  SSLPassPhraseDialog builtin
  SSLSessionCache dbm:/var/run/ssl_scache
  SSLSessionCacheTimeout 300
  SSLMutex file:/var/run/ssl_mutex
  SSLRandomSeed startup builtin
  SSLRandomSeed connect builtin
  SSLLog /var/log/apache/ssl_engine.log
  SSLLogLevel info
 </IfModule>

Теперь нам осталось всего лишь добавить виртуальный хост с поддержкой SSL. Делаем это так:

 <IfDefine SSL>
  <VirtualHost seсure.com:443>
   ServerName seсure.com
   ServerAdmin root@seсure.com
   DocumentRoot /usr/local/www/seсure.com/htdocs-s
   ErrorLog /usr/local/www/seсure.com/logs/error.log
   TransferLog /usr/local/www/seсure.com/logs/transfer.log
   CustomLog /usr/local/www/seсure.com/logs/ssl_request.log \
    ”%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \”%r\” %b”

   SSLEngine On
   SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:\
    +MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
   SSLCertificateFile /usr/local/etc/apache/ssl.crt/server.crt
   SSLCertificateKeyFile /usr/local/etc/apache/ssl.key/server.key

 <Files ~ "\.(cgi|shtml|phtml|php?)$”>
   SSLOptions +StdEnvVars
 </Files>

 <Directory "/usr/local/www/seсure.com/cgi-bin”>
   SSLOptions +StdEnvVars
 </Directory>

 SetEnvIf User-Agent ".*MSIE.*” \
   nokeepalive ssl-unclean-shutdown \
   downgrade-1.0 force-response-1.0

 <Directory "/usr/local/www/seсure.com/htdocs-s”>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  Allow from all
 </Directory>
</VirtualHost>
</IfDefine>

Как сделать так, чтобы прежний виртуальный сервер, который у нас уже был в конфиге, работал теперь по 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

Проверим, точно ли запустился?

# sockstat | grep httpd
www httpd 31273 21 tcp4 *:443 *:*
www httpd 31273 22 tcp4 *:80 *:*
www httpd 31272 21 tcp4 *:443 *:*
www httpd 31272 22 tcp4 *:80 *:*
root httpd 31270 21 tcp4 *:443 *:*
root httpd 31270 22 tcp4 *:80 *:*
root# ps -ax | grep httpd
31270 ?? Ss 0:00,60 /usr/local/sbin/httpd -DSSL
31272 ?? I 0:00,00 /usr/local/sbin/httpd -DSSL
31273 ?? I 0:00,02 /usr/local/sbin/httpd -DSSL
31347 ?? I 0:00,07 /usr/local/sbin/httpd -DSSL
31349 ?? I 0:00,00 /usr/local/sbin/httpd -DSSL

Все работает. Теперь попробуем проверить работает ли перенаправление 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 расходы трафика будут больше, потому что передается больше данных. В основном, это для пользователя не нужные данные и содержат они в себе ключи шифрования и сами данные в шифрованном виде. Но по большому счету, это все мелочи.



Источник: http://live.daemony.org/freebsd/https-apache_ssl-setup.html
Категория: Apache | Добавил: oleg (08.01.2010) | Автор: Daemony’s Live Blog
Просмотров: 1972 | Рейтинг: 0.0/0 |
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Форма входа

Beastie

Друзья сайта

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
links

Copyright MyCorp © 2024