Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> WWW —> Apache + SSL

Apache 2.2.0 + SSL

Автор: fr33man.


Для чего это нужно?
После установки СУБД pgsql и почтового сервера на базе postfix, я не пренебрег установкой web-интерфейсов для более удобного
управления сервером. Понятное дело, что оставлять открытым интерфейс управления сервером я нехотел, поэтому в директориях были созданы htaccess
и htpasswd файлы. Теперь получить доступ могли лишь избранные. Но ситуация не хотела изменяться: в логах я видел попытки подобрать пароль.
Что-бы хоть как-то защититься было решено разрешить доступ не по http протоколу, а по https. То есть по шифрованному соединению. Чем я и занялся.

Установка и первоначальная настройка.
Я как обычно ставить буду из портов. Советую перед установкой обновить их.
# cd /usr/ports/www/apache22/
	# make install clean

Все конфигурационные файлы располагаются теперь в /usr/local/etc/apache22/. Давайте отредактируем httpd.conf, а именно добавим/исправим:

# Слушаем 80 порт
	Listen 80

# Имя сервера
	ServerName      fr33man.ru

# Каталог, где храняться html файлы
	DocumentRoot "/usr/local/www/html/"

# Папка для скриптов
	ScriptAlias /cgi-bin/ "/usr/local/www/cgi-bin/"

# Пользовательские странички хранятся в ~/www каталоге
	UserDir www

# Описываем каталоги пользователей
	< Directory "/home/*/www">
	    AllowOverride       None
	    Options             Indexes
	    Order       Deny,Allow
	    Allow       from    All
	< /Directory>

# Описываем папку со скриптами и с Html страничками
	< Directory "/usr/local/www/cgi-bin/">
	    AllowOverride None
	    Options ExecCGI
	    Order Allow,Deny
	    Allow from All
	< /Directory>


	< Directory "/usr/local/www/html/">
	    Options Indexes FollowSymLinks
	    AllowOverride None
	    Order allow,deny
	    Allow from all
	< /Directory>

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

Настройка SSL.
Перед настройкой сервера создадим сертефикаты:
# cat gen.sh

	#!/bin/sh
	
	openssl genrsa -des3 -rand /dev/random -out server.key 1024
	openssl rsa -in server.key -out server.pem
	openssl req -new -key server.key -out server.csr
	openssl x509 -req -days 365 -in server.csr -signkey \
        server.key -out server.crt

# ./gen.sh

	2048 semi-random bytes loaded
	Generating RSA private key, 1024 bit long modulus
	...............++++++
	.....++++++
	e is 65537 (0x10001)
	Enter pass phrase for server.key:
	Verifying - Enter pass phrase for server.key:
	Enter pass phrase for server.key:
	writing RSA key
	Enter pass phrase for server.key:
	You are about to be asked to enter information that will be 
        incorporated
	into your certificate request.
	What you are about to enter is what is called a Distinguished 
        Name or a DN.
	There are quite a few fields but you can leave some blank
	For some fields there will be a default value,
	If you enter '.', the field will be left blank.
	-----
	Country Name (2 letter code) [AU]:RU
	State or Province Name (full name) [Some-State]:Russia
	Locality Name (eg, city) []:Moscow
	Organization Name (eg, company) [Internet Widgits Pty Ltd]:Fr33man inc
	Organizational Unit Name (eg, section) []:
	Common Name (eg, YOUR name) []:ssl.fr33man.ru
	Email Address []:fr33man@fr33man.ru

	Please enter the following 'extra' attributes
	to be sent with your certificate request
	A challenge password []:
	An optional company name []:
	Signature ok
	subject=/C=RU/ST=Russia/L=Moscow/O=Fr33man inc/CN=ssl.fr33man.ru/
	emailAddress=fr33man@fr33man.ru
	Getting Private key
	Enter pass phrase for server.key:

# ls

	gen.sh          server.crt      server.csr      server.key      server.pem

Все прошло без проблем, осталось перенести их в надежное место:

# cp server.* /usr/local/etc/apache22/

После этого добавляем в httpd.conf строку:
Include etc/apache22/extra/httpd-ssl.conf

Последний шаг — редактирование httpd-ssl.conf:

# Слушаем 443 порт
	Listen 443

# Добавляем типы, для сертефикатов
	AddType application/x-x509-ca-cert .crt
	AddType application/x-pkcs7-crl    .crl

# На запрос пароля выполняем скрипт
	SSLPassPhraseDialog |/usr/local/etc/apache22/echo

# Параметры SSL кэша
	SSLSessionCache        shmcb:/var/run/ssl_scache(512000)
	SSLSessionCacheTimeout  300
	SSLMutex  file:/var/run/ssl_mutex
	
# Описываем виртуальный хост
	< VirtualHost 213.251.193.69:443>
	
	DocumentRoot "/usr/local/www/html/"
	ServerName ssl.fr33man.ru:443
	ServerAdmin postmaster@fr33man.ru
	ErrorLog /var/log/httpd-error.log
	TransferLog /var/log/httpd-access.log
	
	    Alias /admin/ "/usr/local/www/secretarea/"
	
	    < Directory "/usr/local/www/secretarea">
	        Options All
	        AllowOverride All
	       Order Deny,Allow
	        Allow from all
	    < /Directory>
	
	    < Directory "/usr/local/www/html/">
	        Options Indexes FollowSymLinks
	        AllowOverride None
	        Order allow,deny
	        Allow from all
	    < /Directory>
	
# Включаем режим SSL и указываем пути к сертефикатам
	SSLEngine on
	SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+
        LOW:+SSLv2:+EXP:+eNULL
	SSLCertificateFile /usr/local/etc/apache22/server.crt
	SSLCertificateKeyFile /usr/local/etc/apache22/server.key
	
	< FilesMatch "\.(cgi|shtml|phtml|php)$">
	    SSLOptions +StdEnvVars
	< /FilesMatch>
	< Directory "/usr/local/www/apache22/cgi-bin">
	    SSLOptions +StdEnvVars
	< /Directory>
	
	BrowserMatch ".*MSIE.*" \
	         nokeepalive ssl-unclean-shutdown \
	         downgrade-1.0 force-response-1.0

	CustomLog /var/log/httpd-ssl_request.log \
	          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

	< /VirtualHost>

Так как директория admin не описана в httpd.conf, то по протоколу http она доступна не будет, но будет доступна через https.
В httpd-ssl.conf промелькнул файл /usr/local/etc/apache22/echo. Это простой sh-скрипт, который выводит на экран пароль от секретного ключа:

# cat /usr/local/etc/apache22/echo

	#!/bin/sh

	/bin/echo passphrase
	
# ls -la /usr/local/etc/apache22/echo
	-rwx------  1 root  wheel  27 Feb 12 09:54 /usr/local/etc/apache22/echo

А нужен он для того, чтобы при перезагрузке apache не спрашивал парольную фразу.
Осталось запустить apache и проверить это все в работе:

/usr/local/etc/rc.d/apache22.sh start

Теперь, если Вы зайдете по адресу https://ssl.fr33man.ru, то Вас спросят: принять или не принять данный сертификат.
Прошу заметить, что при обращении http://fr33man.ru/admin/ выдается страничка Not Found, а при обращении по https://ssl.fr33man.ru/admin/ просят ввести пароль, из-за
того, что я поставил там htaccess - файл.

Заключение.
Про ssl я читал здесь: mod_ssl и в гугле.



размещено: 2006-11-08,
последнее обновление: 2006-11-08,
автор: fr33man


ALex_hha, 2006-11-11 в 16:43:11

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

>Все прошло без проблем, осталось перенести их в надежное место:
а права на файлы с ключами кто будет устанавливать?

>А нужен он для того, чтобы при перезагрузке apache не спрашивал парольную фразу.
ее вообще можно убрать

fr33man, 2006-11-11 в 19:57:45

> а права на файлы с ключами кто будет устанавливать?

У меня права по умолчанию 0400.

>ее вообще можно убрать
Можно, но зачем?

pushkin, 2006-11-22 в 12:20:43

Привет,

Может кто подскажет можна ли для второго апача написать модуль который будет каждые 5 минут перечитывать данные с файла и кешировать в server_rec.

johndau, 2007-01-25 в 11:32:01

Вместо
> # На запрос пароля выполняем скрипт
> SSLPassPhraseDialog |/usr/local/etc/apache22/echo
Следует
# На запрос пароля выполняем скрипт
 SSLPassPhraseDialog exec:/usr/local/etc/apache22/echo

maslivets, 2007-05-05 в 7:34:26

После установик возникла проблемка.. При запуски выдавало:
"[warn] (2)No such file or directory: Failed to enable the 'httpready' Accept Filter"
Гуугля спасла ситуацию... ))
Необходимо добавить строку в /boot/loader.conf
'accf_http_load="YES"'

Сергей, 2007-07-05 в 12:47:47

cd /usr/ports/www/apache22/
make WITH_STATIC_MODULE="ssl"

сделал все как было написано

./apache22 start

умирает... в логах пусто
в httpd.conf
убираю Include etc/apache22/extra/httpd-ssl.conf
работает нормально


плизз хелп.

freeman, 2007-08-08 в 14:31:58

nf;t проблема что и у Сергея
у меня пишет сто server.crt не создан или пуст
и апачь не поднимается!

serg17, 2007-09-30 в 13:57:19

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

etc/rc.conf

apache2_enable="YES"
apache2ssl_enable="YES"

apachectl startssl

Сергей, 2007-10-07 в 1:27:52

Спасибо аффтору за статью. Получилось настроить под windows xp. По поводу сертификатов - нашёл где дают халявные сертификаты на 90 дней:

[url=http://www.instantssl.com/ssl-certificate-products/free-ssl-certificate.html]

Генерите csr-файл как описано в этой статье и получаете сертификат на 90 дней. Проверял на iexplore 6 и 7, firefox 2.0.0.7 - опознают сертификаты как trusted.

Al, 2007-10-23 в 13:03:28

Если нужно пускать только тех пользователей, которые имеют сертификаты,в папке с сертификатами создаем:

#!/bin/sh
#в дону строку
openssl req -new -newkey rsa:1024 -nodes -keyout client01.key -subj /C=RU/ST=Tver/L=Tver/O=Inc/OU=Firm/CN=Alex/emailAddress=you@mail -out client01.csr

openssl rsa -noout -text -in client01.key
openssl req -noout -text -in client01.csr

openssl ca -config ca.config -in client01.csr -out client01.crt -batch

openssl x509 -noout -text -in client01.crt

openssl pkcs12 -export -in client01.crt -inkey client01.key -certfile ca.crt -out client01.p12

В данном примере сертификаты сервера используются с приставкой `ca`. В статье с приставкой `server`.Полученные сертификаты необходимо установить в клиентский браузер,с которого разрешим смотреть страницу.
Далее в httpd-ssl.conf дописываем,к каким страницам доступ только по сертификатам

<Location /phpmyadmin>
SSLVerifyClient require
SSLVerifyDepth 1
SSLCACertificateFile /usr/local/etc/apache21/sert/ca.crt
</Location>

я закрыл phpmyadmin, шоб не лазили всякие.....

Al, 2007-10-23 в 13:07:51

Там же должен быть ca.config:
[ ca ]
       default_ca             = CA_CLIENT      
       [ CA_CLIENT ]
       dir                    = ./db            
       certs                  = $dir/certs      
       new_certs_dir          = $dir/newcerts  
       database               = $dir/index.txt  
       serial                 = $dir/serial    
       certificate            = ./ca.crt      
       private_key            = ./ca.key        
       default_days           = 365            
       default_crl_days       = 7              
       default_md             = md5            
       policy                 = policy_anything

       [ policy_anything ]
       countryName            = optional        
       stateOrProvinceName    = optional        
       localityName           = optional        
       organizationName       = optional        
       organizationalUnitName = optional        
       commonName             = supplied        
       emailAddress           = optional        

И не забываем создавать папки

mkdir db
mkdir db/certs
mkdir db/newcerts
touch db/index.txt
echo "01" > db/serial

kaiman, 2007-11-27 в 8:28:00

Apache не запускался в автомате.
в /etc/rc.conf были добавлены строчки:
apache22_enable="YES"
apache22_http_accept_enable="YES"

однако Апач так и не запускался!
скрипт /usr/local/etc/rc.d/apache22 start
вел себя как то странно, молчал и Apache не запускал.
Однако командой apachectl start все запускалось и работало!
Проблему решил внимательным изучением скрипта
/usr/local/etc/rc.d/apache22
в /etc/rc.conf
добавил еще одну строчку:
apache22_flags="-k start"

Zer0, 2008-01-15 в 17:04:02

>>Только не забываем, что сделать несколько сертификатов на разные виртуальные хосты не получится.

работает на 2 хоста на ура с разными сертификатами

sens, 2008-04-02 в 23:26:09

это надо для первого Апача
SSLPassPhraseDialog exec:/usr/local/etc/apache22/echo

для второго работает и так
SSLPassPhraseDialog |/usr/local/etc/apache22/echo

П.С. в статье же 2 апач обсуждали :)

xxxa, 2008-04-05 в 20:40:09

Сергей, 2007-07-05 в 12:47:47

cd /usr/ports/www/apache22/
make WITH_STATIC_MODULE="ssl"
freeman, 2007-08-08 в 14:31:58

nf;t проблема что и у Сергея
у меня пишет сто server.crt не создан или пуст
и апачь не поднимается!

      http://ssl.technic.lt

maslivets, 2008-04-15 в 13:34:02

Народ лично у меня когдато была такая же трабла с не запуском апача..
но немного покапался и просто заменил
SSLPassPhraseDialog |/usr/local/etc/apache22/echo
на
SSLPassPhraseDialog exec:/usr/local/etc/apache22/echo
и все отлично забегало..

если проблема не в этом то замените хотя бы на
SSLPassPhraseDialog  builtin
после чего стартовать апач вручную (#apachectl start)..  тогда увидете все ваши траблы...

akril, 2008-05-15 в 0:47:35

Подскажите, плз! может я слишком был пьян, когда делал все, что здесь написано но: во-первых отстутствует файл server.crt и server.csm. B во вторых, при запуске gen.sh в конце выдает несколько ошибок. В частности:
server/csr: No such file or directory
47634:error:0E06D06C:configuration file routines:NCONF_get_string:no value:/usr/src/secure/lib/libcrypto/../../..
/crypto/openssl/crypto/conf/conf_lib.c:329:group=req_attributes name=unstructuredName_min
47634:error:0E06D06C:configuration file routines:NCONF_get_string:no value:/usr/src/secure/lib/libcrypto/../../..
/crypto/openssl/crypto/conf/conf_lib.c:329:group=req_attributes name=unstructuredName_max
47634:error:02001002:system library:fopen:No such file or directory:/usr/src/secure/lib/libcrypto/../../..
/crypto/openssl/crypto/bio/bss_file.c:352:fopen('server/csr','w')
47634:error:20074002:BIO routines:FILE_CTRL:system lib:/usr/src/secure/lib/libcrypto/../../../crypto/openssl/crypto/bio/bss_file.c:354:
server/csr: No such file or directory

Я не установил какой-то модуль?

Zer0, 2008-05-15 в 16:03:51

server/csr: No such file or directory

v_german, 2008-07-17 в 16:50:59

плохая стаття . для начинающих не годиться.
откуда взялся файл gen.sh  в директории с сертификатами?

что за команжы :
# cat gen.sh
#!/bin/sh
# ./gen.sh
????

Fastman, 2008-07-17 в 16:54:57

то v_german.
а ты открой глаза пошире, и прежде чем говорить что статья плохая, подумай для кого вот это написанно:

# cat gen.sh

   #!/bin/sh
   
   openssl genrsa -des3 -rand /dev/random -out server.key 1024
   openssl rsa -in server.key -out server.pem
   openssl req -new -key server.key -out server.csr
   openssl x509 -req -days 365 -in server.csr -signkey \
       server.key -out server.crt

Тебе дали вывод содержимого файла который ты должен сделать. Чего еще непонятно ?

v_german, 2008-07-20 в 21:37:18

Fastman, стятья отличная, я первый в уникс, прошу меня простить.

apache22, 2008-07-23 в 20:32:23

простите за вопрос такой скромный...для apache22 нада оттельно ставить ssl ?

AndreyK, 2008-08-21 в 14:34:16

1) Создаем секретный ключ для сервера, без пароля:
>openssl genrsa -out my.host.dom.key 1024

2) Создаем строку запроса на получение SSL сертификата (certificate signing request, CSR), например, этот ключ подпишет COMODO(http://www.positivessl.com/) или кому заплатим ( www.ssl.ru ). Заполнять аккуратно. Важно - надо ввести на вопрос" Common Name (eg, YOUR name) []:" полное доменное имя сайта, который будет использовать сертификат.
>openssl req -new -key my.host.dom.key -out my.host.dom.csr

3)Высылаем файл my.host.dom.csr в компанию которая его подписывает. Получаем, как получиться, файл my.host.dom.crt. Этот файл в месте с секретным файлом my.host.dom.key используем для сайта.

4)Если хотим использовать временный сертификат на 365 дней, то можно запрос, my.host.dom.csr, подписать самим. Например так:
>openssl x509 -req -days 365 \
-in my.host.dom.csr -out my.host.dom.crt \
-signkey my.host.dom.key

German, 2008-08-21 в 21:13:33

openssl rsa -in server.key -out server.key - отключить парольную фразу при старте apache .

German, 2008-08-21 в 23:12:19

В apache22 можно использовать файлы .htaccess для защиты директорий ?

alex_tesla, 2008-10-14 в 10:10:17

В статье заметил:
При генерации ключей, командой
openssl rsa -in server.key -out server.pem
снимается парольная фраза с ключа. Ну и это приводит к бессмысленности существования и использования зашифрованного аналога. Поэтому в httpd-ssl.conf можно поменять в строке
SSLCertificateKeyFile /usr/local/etc/apache22/server.key
расширение .key на .pam ну и
SSLPassPhraseDialog builtinи не замарачиваться с echo

И еще... у меня по-умолчанию в httpd.conf не добавилась строка
LoadModule ssl_module     libexec/apache22/mod_ssl.so
добавил вручную... без нее апач будет ругаться на неизвестные атрибуты.

Migelius, 2009-01-20 в 11:24:44

Люди помогите! Я чайник в этом деле, пока.
После проделывание всего вышеописанного у меня выдаёт при попытке запуска Апача такое:
WARNING: run_rc_command: cannot run /usr/local/sbin/httpd
Я залез в эту директорию /usr/local/sbin/ и там действительно нету исполняемого файла httpd.
Он там должен быть? И как его вернуть?
Версия FreeBSD 7.0

Olmx, 2009-06-09 в 19:54:29

Сделал все как написано в статье. Apache стартует нормально, но при обращении серверу в логах вываливается
invalid method in request \x16 \x03 x01
Где и куда копать?

Olmx, 2009-06-10 в 9:48:15

Вопрос снят!!!
Разобрался. Спасибо за внимание!!!

RomkA, 2009-07-08 в 9:55:15

apache-2.2.11_7 при старте не запускался.
по посту maslivets изменил SSLPassPhraseDialog |/usr/local/etc/apache22/echo на SSLPassPhraseDialog exec:/usr/local/etc/apache22/echo.
Теперь все стартует:)
Спасибо за статью!

Fenix, 2009-11-30 в 20:37:16

разные сертификаты для виртуальных хостов сделать очень даже получится.

Курить гугл на предмет mod_gnutls

hh, 2010-01-28 в 16:57:53

Получится в апач версии 2.2.14

rogue, 2011-08-08 в 8:32:18

Есчо вариант с проверкой пароля:
SSLPassPhraseDialog exec:/usr/local/etc/apache22/startssl.pl

ee /usr/local/etc/apache22/startssl.pl
#!/usr/bin/perl
print "ваш_пасс\n";



 

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

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0499 секунд
Из них PHP: 37%; SQL: 63%; Число SQL-запросов: 77 шт.
Исходный размер: 52594; Сжатая: 12848