Configuring Apache for SSL Client Certificate Authentication – Stuff… And Things…

Configuring apache for ssl client certificate authentication – stuff… and things…

Once you have a CA configured,
you need to setup the Apache Web server to use it. The process of
requesting the certificate from the browser and verifying that it’s
properly signed is handled by Apache, which can then pass information
about the verification to your application.

SSL Client Certificate will only be verified over an SSL connection so,
before configuring client auth, make sure HTTPS is working.

Enabling client auth take one additional line in your configuration:

Where CA.pem is the certificate you previously generated.

Once this is in place, you can protect URLs with client certificates
in much the same way you would use HTTP Basic Auth.

The magic is the Apache SSLVerifyClient directive. The settings we
care about are:

  • optional – the client may present a valid certificate.
  • require – the client must to present a valid certificate.
  • none: turn validation off.

The difference between optional and require is important. Just as
with HTTP Basic Authentication, if client authentication fails, the
server throws an error and, unless you’ve overridden it with
ErrorDocument, it’s an ugly error. On top to that, it passes no
information to your app. Better to use optional and let your
application gracefully handle missing/invalid certificates than to use
require and have the web server handle it.

However, the Apache documentation does warn that not all browsers
support optional. I’ve yet to fine a modern one that doesn’t, please
comment if you do.

In addition, you want enable the SSLOptions setting
StdEnvVars. Enabling the StdEnvVars option causes Apache to pass
information about the client certificate being used in the
environment. Later, we’ll be using that information to match
certificates to users in our system. However, the Apache documentation
warns that:

This per default is disabled for performance reasons, because the
information extraction step is a rather expensive operation. So one
usually enables this option for CGI and SSI requests only.

So, use sparingly.

Put it together in a <Location> or <Directory> section and you have:

When a visitor hits /protected Apache will request that they
supply a client certificate and the browser will prompt with possible
certificates and send the selected on to the server. Any certificate
sent by the client will have it’s signature checked against the CA
cert. Apache will then set the environmental variable
SSL_CLIENT_VERIFY with one of three values:

  1. SUCCESS – The certificate was signed by us.
  2. GENEROUS – The browser sent a certificate, but not one of ours.
  3. NONE – No certificate was sent, the browser has none available
    or the visitor canceled the selection dialog.

Presuming SUCCESS, we’ll then be able to use other environmental
variables to discover exactly who is visiting us.

I’ll cover the details in a future post. And in the finally post of
this series, we’ll look at tuning the Apache configuration for best
results.

  1. Introduction
  2. CA Setup
  3. Apache Configuration (you’re reading it)
  4. Client Certificate Generation in Ruby
  5. Best practices

Netsago it research project — статьи — пошаговая настройка ssl для apache.

Перевод статьи «Step by Step: Configuring SSL Under Apache» автора Juliet Kemp.

Вступление

Если у вас безопасный веб-сервер, пользователи, волнующиеся за безопасность своих данных, могут быть уверены, что запросы зашифрованы, поэтому их данные в безопасности. Лучшим путем для этого является использование Apache 2, лидирующего веб-сервера под Linux и Secure Sockets Layer, протокол безопасной передачи данных. Transport Layer Security (TLS) является развитием SSL, но они работают практически одинаково. Я буду ссылаться только на SSL.

SSL — протокол для безопасной передачи зашифрованных данных между веб-браузером и веб-сервером. В большинстве случаев, аутентификацию проходит сервер, что позволяет клиенту быть уверенным в том, что сервер является требуемым ему, а не наоборот. Как бы то ни было, когда соединение устанавливается, обе стороны находятся в безопасности, так как только клиент и сервер имеют доступ к ключу. Это работает в течении многих запросов, сервер не интересует, кем является клиент так долго, сколько он остается тем же клиентом на протяжении запроса. Если вас волнует аутентификация клиента, есть возможность использовать клиентские SSL сертификаты (или htaccess, Kerberos или другие, близкие к ним методы), но это не будет рассматриваться в этой статье.

Будучи на стороне клиента, вас волнует, тому ли человеку (серверу) вы посылаете какие-либо личные данные, которые хотите зашифровать. Поэтому сервер, а не клиент, аутентифицируется. Вас также беспокоит участие третей стороны в доступе к вашим данным в том виде, каком вы их посылаете. SSL предоставляет оба этих вида безопасности.

Протокол SSL работает следующим образом:
1. Клиент подключается к веб-серверу и дает список доступных кодов.
2. Сервер берет наиболее устойчивый код, который поддерживает и он, и клиент, и посылает сертификат со своим именем и ключ кодирования, подписанный доверенным Удостоверяющим Центром (Certificate Authority, далее — CA), таким как Verisign.
3. Клиент проверяет сертификат с помощью CA. На практике, хранят набор CA локально, поэтому это может быть сделано без контакта в реальном времени с CA, и поэтому более быстро.
4. Клиент посылает назад случайное число, зашифрованное с помощью публичного ключа сервера. Только клиент знает это число, и только сервер может его расшифровать (используя личный ключ); вот где реализуется безопасность от участия третей стороны.
5. Сервер и клиент используют случайное число для генерирования содержимого ключа, который используется на протяжении передачи данных.

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

Настройка Apache для работы с SSL проста, но есть несколько необходимых шагов. Эта статья рассказывает, как получить сертификат, подписанный CA и как скомпилировать и настроить Apache для работы с SSL. Я использую Apache 2 с mod_ssl. ApacheSSL (реализация Apache с возможностями SSL) также доступен, но сейчас он уже устарел; mod_ssl намного лучше.

Создание сертификата.

Первый шаг — создание сертификата. Вы можете создать сертификат с паролем или без него. Главным неудобством использования пароля является тот факт, что он должен быть введен каждый раз при старте сервера. Поэтому он не может запускаться без присмотра или автоматически при загрузке, например, после выключения электричества. В зависимости от ваших установок, это может быть значимым фактом для вас, или нет.

Теоретически, преимуществом использования пароля являтся повышение защиты. Хотя, на практике пароли не дает такой большой защиты. Если кто-то сможет прочитать или скопировать приватный ключ, значит, у него уже есть доступ к системе и возможность получить пароль, например, используя такую программу, как кейлоггер. Пароль защитит от скрипт-кидди, но не от серьезного взломщика. Возможно, для большинства людей нет смысла его использовать.

Для тестовых целей, или для небольшой локальной сети, вы можете создать сертификат, подписанный вами. Вы можете сделать это, выполнив команду:

openssl req -new -x509 -days 365 -sha1 -newkey rsa:1024 
-nodes -keyout server.key -out server.crt 
-subj '/O=Company/OU=Department/CN=www.example.com'

Давайте рассмотрим опции более подробно:
— -x509 означает, что сертификат обязателен, правильнее, чем просто запрос сертификата (смотри ниже)
— -days 365 устанавливает время истечения сертификата, равное году. Вы можете увеличить этот срок. Запомните дату истечения срока, чтобы обновить её при необходимости.
— -sha1 указывает, что будет использован SHA1 для шифрования.
— rsa:1024 делает ключ 1024 битным RSA.
— -nodes указывает отсутствие пароля.
— -keyout и -out указывают, где хранить сертификат и ключ. Ключ должен быть доступен для чтения только для root; сертификат может быть доступен для чтения для world, но должен быть доступным для чтения пользователю, который запускает Apache.
— -subj устанавливает имя компании, имя отделения компании и адрес веб-сайта. Если вы это пропустите, вас попросят это сделать. CN должен совпадать с адресом сайта, иначе сертификат не будет соответствовать, и пользователи будут получать предупреждение при подключении. Убедитесь, что вы не запрашиваете пароль.

Проблема с использованием сертификата, подписанного самостоятельно для сервера, работающего в реальном времени, заключается в том, что любой браузер, работающий с сайтом, не будет признавать сертификат правильным. Это значит, что пользователя будут запрашивать о подтверждении сертификата. Очевидно, что в большинстве случаев это не является оптимальным решением. Хотя, это нормально для целей теста, а для небольших локальных сетей было бы плохим вариантом платить за сертификат от CA.

Не смотря на это, безусловно, лучше использовать сертификат, подписанный доверенным Удостоверяющим Центром, таким как Verisign (который имеет наибольший охват рынка), или меньшей организацией. Большинство браузеров уже имеют набор предустановленных сертификатов, заверенных CA, которые верифицируют сертификат вашего веб-сервера при подключении клиента. Это уменьшает количество трудностей для конечного пользователя и удостоверяет законность вашего сайта.

Чтобы получить сертификат, подписанный CA, прежде всего вы должны создать криптографическую пару и запрос сертификата:

openssl req -new -sha1 -newkey rsa:1024 -nodes  
-keyout server.key -out www.example.com.csr  
-subj '/O=Company/OU=Department/CN=www.example.com'

Этот пример работает так же, как и предыдущий, но на этот раз мы не используем опцию -x509. Выполнение этой команды приведет к генерации ключа и запроса сертификата, но не самого сертификата. Если вы ввели CN и так далее, вы не должны вводить адрес e-mail или пароль.

Ключ сервера (файл server.key, который, опять же, должен быть доступен для чтения только для root) остается на вашем веб-сервере; запрос (файл www.example.com.csr) отправляется в CA. Вы можете назвать файл запроса так, как вам вздумается, но назвав его по своему доменному имени, вы упростите задачу для CA.

Следующей стадией будет послать этот файл www.example.com.csr в CA, с вашей оплатой. Они должны вернуть его достаточно быстро, если вы предоставили всю требуемую информацию в вашем запросе. Выбранный вами CA объяснит их действия на своем сайте. Вам может понадобиться поменять формат файла на PEM, но, в случае Verisign, этого делать не придется.

Когда вы получите файл назад в PEM формате, переименуйте его в server.crt (это не является строгой необходимостью, но соответствует условиям Apache) и проверьте его:

    openssl verify -CAfile /path/to/trusted_ca.crt 
		-purpose sslserver server.crt

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

    openssl x509 -noout -modulus -in server.pem | openssl sha1
    openssl rsa -noout -modulus -in server.key | openssl sha1

Теперь установите ваш ключ (сгенерированный выше как server.key) и сертификат (server.crt) в /etc/apache2/ssl или предпочитаемый вами каталог настроек, если он другой. Как указано выше, очень важно убедиться, что server.key доступен для чтения только для root, в то время как сертификат сервера может быть доступен для чтения для world, но принадлежать и быть доступным для записи только для root.

Компиляция Apache с SSL.

Итак, ваш сертификат сгенерирован. Теперь вам надо настроить свой сервер для его использования.

Для подавляющего большинства людей, лучшим способом установить и управлять Apache2 — модули, полученные через менеджер пакетов вашего дистрибутива. Apache2 из Debian идет вместе с модулем SSL, но он не включен по умолчанию. Для его включения вы должны выполнить команду: a2enmod ssl и перезапустить веб-сервер.

Чтобы сделать это, добавьте строчку

    Include /etc/apache2/mod_ssl.conf

в ваш /etc/apache2/apache2.conf (этот файл может также называться httpd.conf). Вы должны исправить её, обозначив соответствующее расположение файла mod_ssl.conf. Затем перезапустите веб-сервер.

Если вы хотите скомпилировать Apache2 из исходных кодов, в зависимости от того, какие установки вы до этого использовали, вы можете уже иметь или не иметь поддержку SSL. Проверьте это командой apache2 -l. Если перекомпиляция понадобится, запустите ./configure со всеми опциями, которые вы использовали до этого, добавив к ним –enable-ssl и –enable-setenvif (последняя нужна для совместимости с капризами Internet Explorer). Затем установите его как обычно, с помощью make;make install и проверьте правильность прав доступа.

Настройка Apache с SSL.

Следующим шагом будет настройка Apache2. Следующие инструкции приведут к запуску сервера как безопасного (порт 443) и как обычного веб-сервера (порт 80). Прежде всего, вам надо настроить сервер на принятие запросов на оба порта. Или отредактируйте /etc/apache2/ports.conf (в Debian, это входит в apache2.conf), или отредактируйте /etc/apache2/apache2.conf, включив строки:

Listen 80
Listen 443

Затем отредактируйте /etc/apache2/sites-enabled/yoursite для использования настроек SSL. Разделение настроек обычного и безопасного сервера с помощью VirtualHost — простейший способ из соображений условий эксплуатации. Любые настройки вне секций VirtualHost (например, установка ServerAdmin) будут применяться для обоих (и любых других) VirtualHost. Добавьте следующий текст в файл конфигурации:

# =================================================
# SSL/TLS settings
# =================================================
NameVirtualHost *:443



    DocumentRoot "/local/www/ssl_html"

    SSLEngine on
    SSLOptions  StrictRequire

    
        SSLRequireSSL
    

    SSLProtocol -all  TLSv1  SSLv3
    SSLCipherSuite HIGH:MEDIUM:!aNULL: SHA1: MD5: HIGH: MEDIUM

    SSLRandomSeed startup file:/dev/urandom 1024
    SSLRandomSeed connect file:/dev/urandom 1024

    SSLSessionCache shm:/usr/local/apache2/logs/ssl_cache_shm
    SSLSessionCacheTimeout 600    

    SSLCertificateFile /etc/apache2/ssl/server.crt
    SSLCertificateKeyFile /etc/apache2/ssl/server.key

    SSLVerifyClient none
    SSLProxyEngine off

    
        AddType application/x-x509-ca-cert      .crt
        AddType application/x-pkcs7-crl         .crl
    

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

Несколько замечаний об этой конфигурации:
— SSLEngine должен быть включен, обозначая, что сервер использует SSL.
— DocumentRoot устанавливает корневой каталог виртуального хоста. Это значит, что вы можете отделять безопасное содержимое от обычного.
— SSLRequireSSL запрашивает использование SSL (на этом виртуальном сервере), то есть, пользователь не может подключиться к этому виртуальному хосту с помощью обычного HTTP-запроса. Вот зачем мы разделили безопасное и обычное содержимое.
— SSLProtocol отключает все протоколы, отличные от TLS v1.0 и SSL v3.0. Для современных браузеров все будет работать хорошо.
— SSLCipherSuite устанавливает использование только HIGH и MEDIUM шифров. SHA1 считается более безопасным, чем MD5, поэтому выбран он.
— SSLCertificateFile и SSLCertificateKeyFile указывают расположение файлов сертификата и ключа.
— SSLVerifyClient должна быть установлена как ‘none’, если не используется аутентификация примера.

Чтобы запускать обычный сервер на 80 порту, добавьте следующий текст в конфигурационный файл:

NameVirtualHost: *.80


    DocumentRoot "/local/www/html"

После сохранения отредактированного конфигурационного файла, перезапустите сервер. Если вы использовали пароль при генерации сертификата, вам понадобится ввести его при запросе.

Тестирование.

Создайте базовую страницу index.html в корневой директории вашего сервера, если у вас ещё нет содержимого там.

Затем направьте свой браузер на https://yoursite.com. Вы должны увидеть открытие SSL-соединения и загрузку страницы. Если вы используете сертификат, подписанный вами, ваш браузер даст предупреждение о том, что подлинность сервера не может быть проверена. Вы можете выбрать просмотр сертификата и принять его. Если вы используете внешний сертификат, все должно пройти без проблем.

Убедитесь, что не можете получить доступ к безопасному содержимому, используя http://. Если вы попробуете, вы должны получить сообщение об ошибке.

Устранение проблем.

Если это работает не так, как ожидалось, прежде всего, проверьте, что ваш сервер вообще запущен с помощью команды ps -a | grep apache. Если она не вернет результата, попробуйте перезапустить сервер и проверьте сообщения об ошибке в консоли.

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

Затем, проверьте логи. Вы должны проверить как логи сервера, так и логи SSL, которые вы настроили в конфигурационном файле выше. Если вы не нашли там ничего полезного, попробуйте поменять значение LogLevel в файле конфигурации Apache2 на ‘debug’, перезапустите Apache2 и протестируйте снова. Это должно дать больше данных в логах.

Если вы запускаете веб-сервер на 80 порту, попробуйте запросить страницу с помощью http://, вместо https://, чтобы понять, заключается ли проблема в веб-сервере или в SSL-соединении. Учтите, что в приведенных выше установках, корневые каталоги веб-сервера разные для http:// и https://, так что вы не можете (или не должны!) получить доступ к тому же содержимому. Если ваша тестовая страница в корневом каталоге http:// работает, в то время, как тестовая страница в корневом каталоге https:// не работает, это поможет вам более точно указать на проблему.

Если проблема в SSL соединении, удобным инструментом будет s_client, который является диагностической утилитой для решения проблем в TLS/SSL-соединениях. Обычное его использование: /usr/bin/openssl s_client -connect localhost:443. Также существует множество других опций, которые вы можете узнать из документации. Если вы получили сообщения об ошибках, это должно вам помочь в определении проблемы.

Заключение.

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

Ssl, pct, tls и wtls (но не ssh)

Хотя SSL – самый известный и популярный, но не единственный протокол, используемый для защиты веб транзакций. Важно знать, что со времени изобретения SSL v1.0 (релиза которого, кстати говоря, не было) появилось, как минимум, пять протоколов, сыгравших более-менее важную роль в защите доступа к World Wide Web:

SSL v2.0

Релиз выпущен фирмой Netscape Communications в 1994. Основной целью этого протокола было повысить безопасность транзакций через World Wide Web. К несчастью, очень быстро нашлось несколько критических брешей в безопасности этой версии, что сделало его ненадежным для коммерческого использования:

  • Слабая конструкция MAC
  • Возможность принудительных партий для использования слабого алгоритма шифрования
  • Отсутствие защиты «рукопожатий»
  • Возможность злоумышленника осуществить атаки принудительного завершения

PCT v1.0

Разработан в 1995 году корпорацией Microsoft. В Privacy Communication Technology (PCT – Технология Конфиденциальной Связи – прим.пер.) v1.0 были усилены некоторые слабые места SSL v2.0, корпорация планировала заменить тем самым SSL. Однако, этот протокол так никогда и не получил популярности из-за появления SSL v3.0.

SSL v3.0

Релиз выпущен в 1996 году компанией Netscape Communications. В SSL v3.0 были решены большинство проблем SSL v2.0 и заимствовано множество возможностей нового для того времени протокола PCT, вследствие чего он быстро стал самым популярным протоколом для защиты соединений через WWW.

TLS v1.0 (также известный как SSL v3.1)

Опубликован IETF (Internet Engineering Task Force – Проблемная Группа Проектирования Интернет – прим.пер.) в 1999 году (RFC 2246). Протокол базируется на SSL v3.0 и PCT и согласован как с методами Netscape, так и с корпорацией Microsoft.

Стоит заметить, что если TLS базируется на SSL, он не 100% совместим со своим предшественником. IETF сделала некоторые поправки в безопасности, например использование HMAC вместо MAC, использование другого пересчета основного шифра и ключевого материала, добавлены коды предупреждения, отсутствует поддержка алгоритмов шифрования Fortezza и т.д.

WTLS

«Мобильная и беспроводная» версия протокола TLS, которая использует в качестве носителя UDP протокол. Он разработан и оптимизирован под нижнюю полосу частот и меньшую пропускную способность мобильных устройств с поддержкой WAP (Wireless Application Protocol – Протокол Беспроводных Приложений – прим.пер.).

WTLS был представлен с протоколом WAP 1.1 и был опубликован на форуме WAР. Однако, после релиза WAP 2.0, WTLS заменили профилированной версией TLS, которая оказалась намного безопаснее – в основном из-за того, что в этой версии нет необходимости расшифровки и перешифровки трафика на WAP шлюзе.

Аутентификация веб сервера

Итак, нам удалось настроить и протестировать SSL/TLS, но веб-браузер не смог проверить подлинность веб-сервера. В первой статье мы использовали сертификат веб-сервера, созданного только в целях тестирования и не содержащего информацию, требуемую для настоящей аутентификации и коммерческих транзакций.

Для того чтобы браузер смог успешно аутентифицировать веб-сервер, мы должны создать нормальный соответствующий сертификат веб-сервера, который будет содержать:

  • Открытый ключ веб-сервера
  • Даты подлинности (начала и истечения)
  • Поддерживаемые алгоритмы шифрования
  • Отличительное имя (the distinguish name DN), которое должно содержать полностью определенное доменное имя веб-сервера, называемое общим именем (Common Name CN). Опционально DN может содержать и некоторые другие атрибуты, например, страну (Country C), штат (State S), Расположение (Location L), название организации (the Organization’s name O), название службы организации (the Organization Unit’s name OU), и др.
  • Серийный номер сертификата
  • Атрибуты X.509v3, которые будут сообщать веб-браузерам о типе и применении
  • URI CRL (если есть)
  • URI политики сертификата X.509v3 (если есть)
  • Имя и подпись доверенного источника сертификатов (Certification Authority CA)

Стоит отметить, что атрибут общее имя (Common Name CN) должен иметь значение, равное доменному имени сервера (Fully Qualified Domain Name FQDN). Иначе браузерам не удастся определить принадлежность сертификата веб-серверу, на котором присутствует наш сертификат.

Пример сертификата веб-сервера (текстовая репродукция):

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: O=Seccure, OU=Seccure Root CA
        Validity
            Not Before: Nov 28 01:00:20 2004 GMT
            Not After : Nov 28 01:00:20 2005 GMT
        Subject: O=Seccure, OU=Seccure Labs, CN=www.seccure.lab
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:c1:19:c7:38:f4:89:91:27:a2:1b:1d:b6:8d:91:
                    48:63:0e:3d:0d:2e:f8:65:45:56:db:98:4d:11:21:
                    01:ac:81:8e:3f:64:4a:8a:3f:21:15:ca:49:6e:64:
                    5c:5d:a2:ab:5a:48:cb:2a:9f:0c:02:b9:ff:52:f6:
                    d9:39:6d:a3:4a:94:41:f9:e9:ab:f0:42:fb:68:9a:
                    4b:53:41:e7:4f:b0:2b:02:d7:92:a2:2b:02:a2:f9:
                    f1:2d:68:fa:50:01:2f:49:c1:28:2f:a8:c6:6d:6d:
                    ab:1d:b9:bd:c9:80:63:f1:d6:22:19:de:2d:4a:43:
                    50:76:79:7e:a5:5a:75:af:19
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Cert Type:
                SSL Server
            X509v3 Key Usage:
                Digital Signature, Key Encipherment
            X509v3 Extended Key Usage:
                TLS Web Server Authentication, Netscape Server Gated Crypto, 
                                                             Microsoft Server Gated Crypto
            Netscape Comment:
                OpenSSL Certificate for SSL Web Server
    Signature Algorithm: sha1WithRSAEncryption
        45:30:9d:04:0e:b7:86:9e:61:a1:b0:68:2b:44:93:1c:57:2a:
        99:42:bb:16:b1:ab:f5:c0:d2:33:12:c8:d3:1d:2b:bb:6b:9a:
        4c:c7:53:bc:e4:88:ef:1e:c3:37:ed:53:2c:15:cf:b8:90:df:
        df:4b:34:b8:db:cc:23:77:46:06:72:9d:43:60:a8:a2:ed:0a:
        bb:1a:a4:e8:4e:ba:66:93:63:74:87:fd:43:48:b6:93:a2:e3:
        3d:da:1b:64:46:35:88:b4:4b:22:e6:3c:84:70:5d:88:dd:64:
        c2:51:c2:d6:59:80:87:bc:bd:7f:e3:c1:45:7e:c0:5f:9c:ca:
        e1:a1

Примеры, представленные в последующих разделах статьи основаны на значениях, показанных в Таблице 3. Для создания соответствующих сертификатов читателю потребуется изменить эти значения на название их собственной компании или организации.

Описание атрибута

Атрибут

Пример значения

Код страны – Country code (two letters)CC = PL
Штат или регион – State or ProvinceSS = mazowieckie
Расположение – LocationLL = Warsaw
Название организации – Organization NameOO = Seccure
Название службы организации – Organization UnitOUOU = Seccure Labs
Общее имя – Common NameCNCN = www.seccure.lab

Table 3. Примеры значений сертификата.

Диагностика неисправностей

Если по каким-то причинам мы не можем получить доступ к веб-сайту, можно воспользоваться очень полезной утилитой “s_client” от библиотеки OpenSSL. Пример использования этой утилиты:

Настройка ssl/tls

Перед запуском Apache в первый раз, нам нужно подготовить некоторую начальную конфигурацию и образец веб-контента. Как минимум, мы должны сделать следующее (под root):

  1. Создание некоторого веб-контента, который будет обслуживаться через TLS/SSL:

Парольная фраза dilemma

Перед созданием сертификатов важно понять причастность парольной фразы. Следует ли шифровать закрытый ключ или нет? Существует много мнений, но рекомендуется не защищать закрытый ключ веб-сервера с использованием парольной фразы. Это не только неудобно, но и представляет собой лишь мираж безопасности. Почему? Рассмотрим эти точки зрения:

  1. Необходимо будет вводить парольную фразу после каждой перезагрузки сервера, что может раздражать, если систему нужно часто перезагружать (например, при обновлении ядра, перебоях с питанием, смене конфигурации и т.п.)
  2. Если злоумышленнику удастся получить закрытый ключ на веб-сервере, это будет означать, что веб-сервер уже компрометирован и взломщик получит привилегии root’a. В этом случае хакер сможет узнать и парольную фразу, установив кей-логгер и перезагрузив систему, тем самым он всё равно заставит системного администратора ввести парольную фразу. Также злоумышленник может просмотреть память Apache и найти закрыйтый ключ веб-сервера, хранимого в дампе в открытом тексте. Хотя осуществить это сложно, но для тех, кто имеет опыт во взломе систем семейства Unix, большой проблемы это не вызовет (самый простой способ – использовать утилиту pcat из The Coroner’s Toolkit).

Таким образом, в шифровании закрытого ключа сервера существует только одно преимущество – парольная фраза поможет сохранить закрытый ключ от бездарных скрипт-киддисов, но не от профессионалов, способных получить root доступ к серверу.

Проверяем установку

Теперь можно запустить Apache с поддержкой SSL/TLS:

/usr/local/apache2/bin/apachectl startssl
Apache/2.0.52 mod_ssl/2.0.52 (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 127.0.0.1:443 (RSA)
Enter pass phrase:*************
Ok: Pass Phrase Dialog successful.

Скрипт для создания клиентских сертификатов

Если сертификаты нужно создавать на регулярной основе — можно воспользоваться скриптом

Для корректной работы скрипта требуется наличие установленных программ: mail-client/mailx (mail — консольный клиент для отправки почтовых сообщений, app-arch/rar (архиватор), app-arch/sharutils (перекодировщик двоичных файлов в текстовый вид для почтовых вложений).

Создаем сертификат веб-сервера

Теперь мы можем создать сертификат нашего веб-сервера. Вообще, существует три типа сертификатов, которые мы можем использовать:

  1. Самоподписанный сертификат.
  2. Сертификат, подписанный доверенным CA (наиболее рекомендуемый).
  3. Сертификат, подписанный локальным CA.

Следующие разделы подробно описывают способы создания этих сертификатов. Конечный результат любого способа будет всего в двух файлах:

  • server.key – закрытый ключ веб-сервера
  • server.crt – зашифрованный PEM сертификат, содержащий открыйтый ключ сервера

Способ 1: самоподписанный сертификат (только для тестирования)

Этот способ стоит использовать только для продолжения нашего тестирования, или для использования в малых, закрытых условиях (малые корпоративные сети). Чтобы веб-браузеры могли аутентифицировать веб-сервер, самоподписанные сертификаты должны быть инсталлированы в каждый веб-браузер. Это может быть довольно таки неудобно.

Закрытый/открытый ключ и самоподписанный РЕМ-зашифрованный сертификат создаются следующим образом:

openssl req  
-new  
-x509  
-days 365  
-sha1  
-newkey rsa:1024  
-nodes  
-keyout server.key  
-out server.crt  
-subj '/O=Seccure/OU=Seccure Labs/CN=www.seccure.lab'

При помощи этих команд выполняются следующие действия: создание нового (-new) сертификата (-x509), который будет действителен в течение года (-days 365) и будет подписан с использованием алгоритма SHA1 (-sha1). Закрытый ключ RSA будет иметь длину 1024 бит (-newkey rsa:1024), и не будет защищен парольной фразой (-nodes).

Сертификат и закрытый/открытый ключи будут созданы в файлах “server.crt” и “server.key” (-out server.crt -keyout server.key). Параметр “-subj” говорит о том, что название компании “Seccure” (O=Seccure), название службы “Seccure Labs”, и полностью определенное доменное имя “www.seccure.lab”.

После создания этого сертификата мы должны установить его в каждый веб-браузер, который будет являться потенциальным клиентом нашего сервера. Иначе, веб-браузеры, отправляющие запрос на соединение нашему серверу, не смогут проверить его подлинность. Для Windows среды это будет выглядеть следующим образом:

Рисунок 1. Установка самоподписанного сертификата на машину клиента.

Способ 2: сертификат, подписанный доверенным ca (рекомендуется)

Создание запроса на сертификат и подписка его доверенным CA (таким как Thawte, RSA и др.) наиболее рекомендуемое дальнейшее действие, если вы хотите открыть публичный доступ к вашему сайту из Интернет. При использовании этого метода отпадает необходимость в установке сертификатов в каждый веб-браузер, ведь большинство из них уже имеют в установке несколько сертификатов от доверенных CA.

Не забывайте, что каждый СА имеет разные ограничение на атрибут DN, поэтому читателю стоит заранее ознакомиться с ними. Рекомендуется также выбирать такие сертификаты, которые установлены в большинстве веб браузеров (Thawte, Verisign и некоторые другие). Иначе, у веб-браузера пользователя возникнут проблемы с аутентификацией веб-сервера.

Процесс получения подписанного сертификата от доверенного СА состоит из следующих шагов:

  1. Первым делом, следует создать пару закрытого/открытого ключа (server.key) и запрос сертификата (request.pem), как показано ниже:
openssl req  
-new  
-sha1  
-newkey rsa:1024  
-nodes  
-keyout server.key  
-out request.pem  
-subj '/O=Seccure/OU=Seccure Labs/CN=www.seccure.lab'

2.  Теперь мы должны послать запрос на получение сертификата (request.pem) в СА и дождаться, пока он будет подписан и отослан обратно в виде сертификата.

3.  После получения сертификата от доверенного СА мы должны удостовериться в том, что он закодирован в формате PEM, а не TXT или DER. Если же полученный сертификат не соответствует формату РЕМ, то мы должны конвертировать его, в каком бы формате он не пришел.

Самый простой способ проверить формат сертификата это просмотреть его в текстовом редакторе. В зависимости от того, как выглядит сертификат, он может быть в одном из следующих форматов (типичные расширения файлов представлены в скобках):

    • PEM, Base64 кодировка формата X.509 (*.crt, *.pem, *.cer)
-----BEGIN CERTIFICATE-----
MIICdzCCAeCgAwIBAgIBATANBgkqhkiG9w0BAQUFADAsMRAwDgYDVQQKEwdTZWNj
dXJlMRgwFgYDVQQLEw9TZWNjdXJlIFJvb3QgQ0EwHhcNMDQxMTI4MDEwMDIwWhcN
...
ou0Kuxqk6E66ZpNjdIf9Q0i2k6LjPdobZEY1iLRLIuY8hHBdiN1kwlHC1lmAh7y9
f PBRX7AX5zK4aE=
-----END CERTIFICATE-----
    • TXT PEM format (*.crt, *.cer, *.pem, *.txt)
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
        Signature Algorithm: sha1WithRSAEncryption
        Issuer: O=Seccure, OU=Seccure Root CA
...
            RSA Public Key: (1024 bit)
                Modulus (1024 bit):
                    00:c1:19:c7:38:f4:89:91:27:a2:1b:1d:b6:8d:91:
...
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
...
-----BEGIN CERTIFICATE-----
MIICdzCCAeCgAwIBAgIBATANBgkqhkiG9w0BAQUFADAsMRAwDgYDVQQKEwdTZWNj
dXJlMRgwFgYDVQQLEw9TZWNjdXJlIFJvb3QgQ0EwHhcNMDQxMTI4MDEwMDIwWhcN
...
ou0Kuxqk6E66ZpNjdIf9Q0i2k6LjPdobZEY1iLRLIuY8hHBdiN1kwlHC1lmAh7y9
f PBRX7AX5zK4aE=
-----END CERTIFICATE-----

Команда для конвертирования формата TXT PEM в РЕМ:

openssl x509 -in signed_cert.pem -out server.crt
    • DER, двоичная кодировка X.509 (*.der, *.crt, *.cer)

[Нетекстовое, двоичное представление]

Команда для преобразования формата DER в РЕМ:

openssl x509 -in signed_cert.der -inform DER -out server.crt
  1. Верификация и тестирование сертификата

Перед установкой сертификата мы должны проверить, действительно ли он законный и может быть использован в целях аутентификации веб-ервера:

openssl verify -CAfile /path/to/trusted_ca.crt -purpose sslserver server.crt

Кроме того, было бы неплохо убедиться в том, что наш сертификат соответствует ранее созданному закрытому ключу (результаты выполнения обеих команд должны быть одинаковыми):

openssl x509 -noout -modulus -in server.crt | openssl sha1
openssl rsa -noout -modulus -in server.key | openssl sha1

Способ 3: сертификат, подписанный локальным ca

Этот метод может быть использован в интрасетях или в организациях, которые используют или планируют использовать собственный СА. В этом случае местный сертификат СА должен быть установлен на все веб-браузеры, которые будут соединяться с защищенным веб-сервером.

Для использования этого способа нам нужно создать локальный закрытый/открытый ключ СА, также как и сертификат и репозиторий СА для новых ключей.

Примечание: Локальный СА должен быть создан на отдельном сервере, который не имеет соединения с сетью. Операционная система должна давать доступ только авторизованному персоналу, а сама машина должна быть под охраной. Закрытый СА ключ – самый важный элемент всей системы PKI – если он будет компрометирован, то все другие сертификаты, подписанные этим СА также будут компрометированы!

Для установки среды мы будет использовать библиотеку OpenSSL. Понятно, что если у нас уже есть локальный СА, мы можем пропустить этот раздел и продолжить создание запроса на сертификат для веб-сервера.

  1. Подготовим структуру каталога для нового СА (среда переменной $SSLDIR должна быть добавлена в соответствующие скрипты автозагрузки, такие как /etc/profile или /etc/rc.local:

Установка apache с поддержкой ssl/tls

Первым шагом в установке Apache с поддержкой SSL/TLS будет настройка и установка Apache 2 веб-сервера и создание пользователя и группы с именем “apache”. Безопасный способ установки Apache 2.0 уже был рассмотрен на Securing Apache 2.0: Step-by-Step.

Установка сертификата

Теперь можно продолжить установку закрытого ключа веб-сервера (server.key) и самого сертификата (server.crt) в среду Apache:

install -m 600 -o root -g sys server.key /usr/local/apache2/conf/ssl.key/ 
install -m 644 -o root -g sys server.crt /usr/local/apache2/conf/ssl.crt/ 

Заключение к первой части

Итак, мы имеем безопасный Apache 2 сервер в состоянии онлайн и пример SSL-сертификата, на чем и заканчивается первая часть. В следующей части вы познакомитесь с рекомендуемыми настройками безопасности и функций для mod_ssl и процессом создания нормального сертификата.

Заключение второй части

Во второй части мы рассказали, как настроить mod_ssl и как создать и использовать X.509v3 сертификаты веб сервера. В следующей, третьей и последней части этого цикла статей мы обсудим процесс аутентификации клиентов через сертификаты, а также часты ошибки системных администраторов и известные атаки, которые могут представлять реальную угрозу SSL-соединениям.

Похожее:  Мобильные приложения Москвы

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *