Настройка SSL с самоподписанным сертификатом в Apache под FreeBSD

Дано: FreeBSD 8.2, с настроенным apache 2.2 и некими установленными сайтами. Модуль SSL в apache уже установлен.
Хотим: Выдавать некоторые части сайта с использованием шифрования с помощью SSL, используя самоподписанный сертификат, используя аутентификацию. Другие же сайты при попытке зайти через https перенаправлять на http.

Предположим что наш сайт называется example.com и его адрес 111.111.111.111.
Мы хотим что бы example.com/egroupware был доступен через SSL с аутентификацией, а при заходе на https://example.com/ пользователей перенаправляло на http://example.com/
Создание самоподписанного сертификата

Заходим под аккаунтом root.
Генерируем самоподписанный ssl сертификат.
cd
mkdir ssl
cd ssl
cat /dev/urandom > random.dat

Ctrl-C через 10-30 секунд. А то диск закончится ;)
openssl genrsa -rand random.dat 1024 > server.key
openssl req -days 3650 -new -key server.key > server.csr
openssl req -days 3650 -x509 -key server.key -in server.csr > server.crt
rm random.dat

В качестве Common Name - указываем ip адрес сервера. Те у кого есть доменное имя тут указывают доменное имя.
Теперь устанавливаем сертификат.
mkdir /etc/ssl/{certs,private}
cp server.crt /etc/ssl/certs/
cp server.key /etc/ssl/private/
Настройка SSL в apache

Сохраняем файл образец /usr/local/etc/apache22/extra/httpd-ssl.conf:
mv /usr/local/etc/apache22/extra/httpd-ssl.conf /usr/local/etc/apache22/extra/httpd-ssl.conf.example

Пишем на его основе наш собственный /usr/local/etc/apache22/extra/httpd-ssl.conf, у меня получился примерно такой:
SSLRandomSeed startup file:/dev/urandom 512
SSLRandomSeed connect file:/dev/urandom 512

Listen 443

##
## SSL Global Context
##
## All SSL configuration in this context applies both to
## the main server and all SSL-enabled virtual hosts.
##

#
# Some MIME-types for downloading Certificates and CRLs
#
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl

# Pass Phrase Dialog:
# Configure the pass phrase gathering process.
# The filtering dialog program (`builtin' is a internal
# terminal dialog) has to provide the pass phrase on stdout.
SSLPassPhraseDialog builtin

# Inter-Process Session Cache:
# Configure the SSL Session Cache: First the mechanism
# to use and second the expiring timeout (in seconds).
#SSLSessionCache "dbm:/var/run/ssl_scache"
SSLSessionCache "shmcb:/var/run/ssl_scache(512000)"
SSLSessionCacheTimeout 300

# Semaphore:
# Configure the path to the mutual exclusion semaphore the
# SSL engine uses internally for inter-process synchronization.
SSLMutex "file:/var/run/ssl_mutex"

##
## SSL Virtual Host Context
##

NameVirtualHost 111.111.111.111:443

<VirtualHost 111.111.111.111:443>
ServerName example.com:443
DocumentRoot /usr/local/www/example.com
Options FollowSymLinks
CustomLog "/var/log/httpd-ssl_request.log"
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x "%r" %b"

# Turn on SSL for private information.
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/etc/ssl/certs/server.crt"
SSLCertificateKeyFile "/etc/ssl/private/server.key"

<Directory "/usr/local/www/example.com/egroupware">
AllowOverride FileInfo Options
php_admin_value mbstring.func_overload 7
<Files rpc.php>
php_admin_value mbstring.func_overload 0
Order allow,deny
Allow from all
</Files>
Order allow,deny
Allow from all
</Directory>
</VirtualHost>


111.111.111.111 - IP адрес нашего сервера.

example.com - Имя нашего сервера, которое мы указали при генерации сертификата в поле Common Name.

Раскомментируем в файле /usr/local/etc/apache22/httpd.conf строчку:
Include etc/apache22/extra/httpd-ssl.conf
Настройка аунтификации

Уже писал об этом подробно в статье настройка_basic_и_digest_аутентификации_в_apache, поэтому за подробностями создания пользователей и установки паролей для digest аутентификации отправляйтесь туда. Что касается настройки apache - Добавляем в раздел <VirtualHost>:
<VirtualHost 111.111.111.111:443>
...
# Turn on Auth for private information.
AuthType Digest
AuthName "egroupware"
AuthDigestDomain /egroupware/ http://example.com/egroupware/
AuthDigestProvider file
AuthUserFile /usr/local/www/etc/.htdigest
Require valid-user
...
</VirtualHost>

Настройка перенаправления

Добавляем в раздел <VirtualHost>:
<VirtualHost 111.111.111.111:443>
...
# Redirect all other pages except of https://example.com/egroupware to http://example.com/
RewriteEngine on
RewriteCond %{SERVER_PORT} ^443$ [OR]
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/egroupware.*$ [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]
...
</VirtualHost>

Запускаем

Проверяем на ошибки в конфигурационном файле:
apachectl configtest

Перезагружаем apache:
apachectl graceful

http://jakshi.org.ua/dokuwiki/настройка_ssl_с_самоподписанным_сертификатом_в_apache

Обновлено: 12.03.2015