Пункт 48. Шифрование SSL/TLS: часто задаваемые вопросы
Мудрый человек не дает правильных ответов, он ставит правильные вопросы.
-- Клод Леви-Стросс
Монтаж
- Почему я получаю ошибки прав доступа, связанные с SSLMutex, при запуске Apache?
- Почему mod_ssl останавливается с ошибкой «Не удалось сгенерировать временный 512-битный закрытый ключ RSA» при запуске Apache?
Почему я получаю ошибки прав доступа, связанные с SSLMutex, при запуске Apache?
Такие ошибки, как `` mod_ssl: Child could not open
SSLMutex lockfile /opt/apache/logs/ssl_mutex.18332 (System error follows)
[...] System: Permission denied (errno: 13)
'', обычно вызваны слишком строгими разрешениями для родительских каталогов. Убедитесь, что все родительские каталоги (здесь и ) имеют x-бит, установленный как минимум для UID, под которым работают дочерние каталоги Apache (см. директиву /opt
)
. /opt/apache
/opt/apache/logs
User
Почему mod_ssl останавливается с ошибкой «Не удалось сгенерировать временный 512-битный закрытый ключ RSA» при запуске Apache?
Криптографическому программному обеспечению для правильной работы необходим источник непредсказуемых данных. Многие операционные системы с открытым исходным кодом предоставляют «устройство случайности», которое служит этой цели (обычно называется
/dev/random
). В других системах приложениям приходится вручную заполнять генератор псевдослучайных чисел (PRNG) OpenSSL соответствующими данными, прежде чем генерировать ключи или выполнять шифрование с открытым ключом. Начиная с версии 0.9.5, функции OpenSSL, которым требуется случайность, сообщают об ошибке, если генератор случайных чисел не содержит не менее 128 бит случайности.
Чтобы предотвратить эту ошибку, mod_ssl
необходимо обеспечить достаточную энтропию для PRNG, чтобы он мог работать правильно. Это можно сделать через SSLRandomSeed
директиву.
Конфигурация
- Можно ли предоставить HTTP и HTTPS с одного сервера?
- Какой порт использует HTTPS?
- Как мне вручную говорить по HTTPS в целях тестирования?
- Почему соединение зависает, когда я подключаюсь к моему серверу Apache с поддержкой SSL?
- Почему я получаю сообщение об ошибке «Отказ в подключении» при попытке доступа к моему недавно установленному серверу Apache+mod_ssl через HTTPS?
- Почему
SSL_XXX
переменные недоступны для моих сценариев CGI и SSI?
- Как я могу переключаться между HTTP и HTTPS в относительных гиперссылках?
Можно ли предоставить HTTP и HTTPS с одного сервера?
Да. HTTP и HTTPS используют разные серверные порты (HTTP привязывается к порту 80, HTTPS — к порту 443), поэтому прямого конфликта между ними нет. Вы можете либо запустить два отдельных экземпляра сервера, привязанных к этим портам, либо использовать элегантный виртуальный хостинг Apache для создания двух виртуальных серверов, оба обслуживаемых одним и тем же экземпляром Apache: один отвечает через HTTP на запросы через порт 80, а другой отвечает через HTTPS для запросов на порт 443.
Какой порт использует HTTPS?
Вы можете запустить HTTPS на любом порту, но в стандартах указан порт 443, который по умолчанию будет использовать любой браузер, совместимый с HTTPS. Вы можете заставить браузер искать другой порт, указав его в URL-адресе. Например, если ваш сервер настроен на обслуживание страниц через HTTPS через порт 8080, вы можете получить к ним доступ по адресу https://example.com:8080/
Как мне вручную говорить по HTTPS в целях тестирования?
Хотя вы обычно просто используете
$ telnet localhost 80
GET / HTTP/1.0
для простого тестирования Apache через HTTP это не так просто для HTTPS из-за протокола SSL между TCP и HTTP. Однако с помощью s_client
команды OpenSSL вы можете выполнить аналогичную проверку через HTTPS:
$ openssl s_client -connect localhost:443 -state -debug
GET / HTTP/1.0
Перед фактическим ответом HTTP вы получите подробную информацию о рукопожатии SSL. Для более общего клиента командной строки, который напрямую понимает как HTTP, так и HTTPS, может выполнять операции GET и POST, может использовать прокси, поддерживает диапазоны байтов и т. д., вам следует взглянуть на отличный инструмент cURL. Используя это, вы можете проверить, правильно ли Apache отвечает на запросы через HTTP и HTTPS, следующим образом:
$ curl http://localhost/
$ curl https://localhost/
Почему соединение зависает, когда я подключаюсь к моему серверу Apache с поддержкой SSL?
Это может произойти, когда вы пытаетесь подключиться к HTTPS-серверу (или виртуальному серверу) через HTTP (например, используя http://example.com/
вместо
https://example.com
). Это также может произойти при попытке подключения через HTTPS к HTTP-серверу (например, при использовании
https://example.com/
на сервере, который не поддерживает HTTPS или поддерживает его на нестандартном порту). Убедитесь, что вы подключаетесь к (виртуальному) серверу, который поддерживает SSL.
Почему я получаю сообщения «Отказ в подключении» при попытке доступа к моему недавно установленному серверу Apache+mod_ssl через HTTPS?
Эта ошибка может быть вызвана неправильной конфигурацией. Пожалуйста, убедитесь, что ваши Listen
директивы совпадают с вашими
<VirtualHost>
директивами. Если ничего не помогло, начните заново, используя конфигурацию по умолчанию, предоставленную mod_ssl
.
Почему SSL_XXX
переменные недоступны для моих сценариев CGI и SSI?
Пожалуйста, убедитесь, что вы SSLOptions +StdEnvVars
включили `` '' для контекста ваших запросов CGI/SSI.
Как я могу переключаться между HTTP и HTTPS в относительных гиперссылках?
Обычно для переключения между HTTP и HTTPS необходимо использовать полноценные гиперссылки (поскольку необходимо изменить схему URL). Однако с помощью mod_rewrite
вы можете манипулировать относительными гиперссылками для достижения того же эффекта.
RewriteEngine включен
RewriteRule "^/(.*)_SSL$" "https://%{ИМЯ_СЕРВЕРА}/$1" [R,L]
RewriteRule "^/(.*)_NOSSL$" "http://%{ИМЯ_СЕРВЕРА}/$1" [R,L]
Этот набор правил перезаписи позволяет использовать гиперссылки в форме
<a href="document.html_SSL">
для переключения на HTTPS в относительной ссылке. (Замените SSL на NOSSL, чтобы переключиться на HTTP.)
Сертификаты
- Что такое закрытые ключи RSA, CSR и сертификаты?
- Есть ли разница при запуске между Apache, не поддерживающим SSL, и Apache, поддерживающим SSL?
- Как создать самозаверяющий SSL-сертификат для целей тестирования?
- Как создать настоящий SSL-сертификат?
- Как создать и использовать собственный центр сертификации (ЦС)?
- Как я могу изменить фразу-пароль в моем файле закрытого ключа?
- Как я могу избавиться от диалога парольной фразы во время запуска Apache?
- Как проверить, что закрытый ключ соответствует его сертификату?
- Как преобразовать сертификат из формата PEM в формат DER?
- Почему браузеры жалуются, что не могут проверить мой сертификат сервера?
Что такое закрытые ключи RSA, CSR и сертификаты?
Файл закрытого ключа RSA — это цифровой файл, который вы можете использовать для расшифровки отправленных вам сообщений. У него есть общедоступный компонент, который вы распространяете (через файл сертификата), который позволяет людям шифровать эти сообщения для вас.
Запрос на подпись сертификата (CSR) — это цифровой файл, который содержит ваш открытый ключ и ваше имя. Вы отправляете CSR в центр сертификации (CA), который преобразует его в настоящий сертификат, подписывая его.
Сертификат содержит ваш открытый ключ RSA, ваше имя, имя ЦС и имеет цифровую подпись ЦС. Браузеры, знающие центр сертификации, могут проверить подпись на этом сертификате, тем самым получив ваш открытый ключ RSA. Это позволяет им отправлять сообщения, которые только вы можете расшифровать.
Общее описание протокола SSL см. в главе «Введение».
Есть ли разница при запуске между Apache, не поддерживающим SSL, и Apache, поддерживающим SSL?
Да. В общем, запуск Apache со
mod_ssl
встроенными средствами аналогичен запуску Apache без него. Однако, если у вас есть парольная фраза в файле закрытого ключа SSL, появится диалоговое окно запуска, в котором вас попросят ввести парольную фразу.
Необходимость вручную вводить парольную фразу при запуске сервера может быть проблематичной, например, при запуске сервера из сценариев загрузки системы. В этом случае вы можете выполнить следующие шаги, чтобы удалить парольную фразу из вашего закрытого ключа. Имейте в виду, что это создает дополнительные риски для безопасности — действуйте осторожно!
Как создать самозаверяющий SSL-сертификат для целей тестирования?
- Убедитесь, что OpenSSL установлен и находится в вашем
PATH
.
- Выполните следующую команду, чтобы создать файлы
server.key
и
:
Их можно использовать в вашем
файле следующим образом:
server.crt
$ openssl req -new -x509 -nodes -out server.crt
-keyout server.key
apache2.conf
SSLCertificateFile "/path/to/this/server.crt"
SSLCertificateKeyFile "/path/to/this/server.key"
- Важно, чтобы вы знали, что у него
нет
server.key
парольной фразы. Чтобы добавить парольную фразу к ключу, вы должны выполнить следующую команду, а затем ввести и проверить парольную фразу в соответствии с запросом.
$ openssl rsa -des3 -in server.key -out
server.key.new
$ mv server.key.new server.key
Сделайте резервную копию server.key
файла и введенной вами парольной фразы в надежном месте.
Как создать настоящий SSL-сертификат?
Вот пошаговое описание:
- Убедитесь, что OpenSSL установлен и находится в вашем
PATH
.
- Создайте закрытый ключ RSA для вашего сервера Apache (будет зашифрован Triple-DES и отформатирован PEM):
Пожалуйста, сделайте резервную копию этого файла и введенной вами парольной фразы в безопасном месте. Вы можете просмотреть подробности этого закрытого ключа RSA с помощью команды:
При необходимости вы также можете создать расшифрованную версию PEM (не рекомендуется) этого закрытого ключа RSA с помощью:
$ openssl genrsa -des3 -out server.key 2048
server.key
$ openssl rsa -noout -text -in server.key
$ openssl rsa -in server.key -out server.key.unsecure
- Создайте запрос на подпись сертификата (CSR) с закрытым ключом RSA сервера (выходные данные будут в формате PEM):
убедитесь, что вы вводите полное доменное имя («полное доменное имя») сервера, когда OpenSSL запрашивает «CommonName», т. е. когда вы создаете CSR для веб-сайта, доступ к которому позже будет осуществляться через
, введите здесь «www.foo.dom». Вы можете увидеть подробности этого CSR, используя
$ openssl req -new -key server.key -out server.csr
https://www.foo.dom/
$ openssl req -noout -text -in server.csr
- Теперь вам нужно отправить этот запрос на подпись сертификата (CSR) в центр сертификации (CA) для подписания. После того, как CSR будет подписан, у вас будет настоящий сертификат, который может использовать Apache. У вас может быть CSR, подписанный коммерческим ЦС, или вы можете создать свой собственный ЦС, чтобы подписать его.
Коммерческие центры сертификации обычно просят вас опубликовать CSR в веб-форме, заплатить за подписание, а затем отправить подписанный сертификат, который вы можете сохранить в файле server.crt.
Подробнее о том, как создать собственный ЦС и использовать его для подписания CSR, см. ниже.
После того, как ваш CSR был подписан, вы можете увидеть детали сертификата следующим образом:
$ openssl x509 -noout -text -in server.crt
- Теперь у вас должно быть два файла:
server.key
и
server.crt
. Их можно использовать в
apache2.conf
файле следующим образом:
SSLCertificateFile "/path/to/this/server.crt"
SSLCertificateKeyFile "/path/to/this/server.key"
Файл server.csr
больше не нужен.
Как создать и использовать собственный центр сертификации (ЦС)?
Короткий ответ — использовать сценарий CA.sh
or, CA.pl
предоставляемый OpenSSL. Если у вас нет веской причины не делать этого, вы должны использовать их для предпочтения. Если вы не можете, вы можете создать самозаверяющий сертификат следующим образом:
- Создайте закрытый ключ RSA для своего сервера (будет зашифрован Triple-DES и отформатирован в формате PEM):
сделайте резервную копию этого файла и введенной вами парольной фразы в безопасном месте. Вы можете просмотреть подробности этого закрытого ключа RSA с помощью команды:
При необходимости вы также можете создать расшифрованную версию PEM (не рекомендуется) этого закрытого ключа RSA с помощью:
$ openssl genrsa -des3 -out server.key 2048
server.key
$ openssl rsa -noout -text -in server.key
$ openssl rsa -in server.key -out server.key.unsecure
- Создайте самозаверяющий сертификат (структура X509) с только что созданным ключом RSA (выходные данные будут в формате PEM):
это подпишет CSR сервера и приведет к созданию файла.
Вы можете увидеть детали этого Сертификата, используя:
$ openssl req -new -x509 -nodes -sha1 -days 365
-key server.key -out server.crt -extensions usr_cert
server.crt
$ openssl x509 -noout -text -in server.crt
Как я могу изменить фразу-пароль в моем файле закрытого ключа?
Вам просто нужно прочитать его со старой фразой-паролем и записать заново, указав новую фразу-пароль. Вы можете выполнить это с помощью следующих команд:
$ openssl rsa -des3 -in server.key -out server.key.new
$ mv server.key.new server.key
В первый раз, когда вас попросят ввести парольную фразу PEM, вы должны ввести старую парольную фразу. После этого вас снова попросят ввести парольную фразу — на этот раз используйте новую парольную фразу. Если вас попросят подтвердить парольную фразу, вам потребуется ввести новую парольную фразу еще раз.
Как я могу избавиться от диалога парольной фразы во время запуска Apache?
Причина, по которой это диалоговое окно появляется при запуске и каждом перезапуске, заключается в том, что закрытый ключ RSA внутри вашего файла server.key хранится в зашифрованном формате по соображениям безопасности. Парольная фраза необходима для расшифровки этого файла, чтобы его можно было прочитать и проанализировать. Удаление парольной фразы удаляет уровень безопасности с вашего сервера — действуйте осторожно!
- Удалите шифрование из закрытого ключа RSA (сохранив при этом резервную копию исходного файла):
$ cp server.key server.key.org
$ openssl rsa -in server.key.org -out server.key
- Убедитесь, что файл server.key доступен для чтения только пользователю root:
$ chmod 400 server.key
Теперь server.key
содержит незашифрованную копию ключа. Если вы укажете серверу на этот файл, он не будет запрашивать парольную фразу. ОДНАКО, если кто-то получит этот ключ, он сможет выдать себя за вас в сети. ПОЖАЛУЙСТА, убедитесь, что разрешения на этот файл таковы, что его могут прочитать только root или пользователь веб-сервера (предпочтительно, чтобы ваш веб-сервер запускался как root, но работал как другой пользователь, и чтобы ключ был доступен для чтения только root).
В качестве альтернативного подхода вы можете использовать SSLPassPhraseDialog
exec:/path/to/program
средство `` ''. Имейте в виду, что это не более и не менее безопасно, конечно.
Как проверить, что закрытый ключ соответствует его сертификату?
Закрытый ключ содержит ряд чисел. Два из этих чисел образуют «открытый ключ», остальные являются частью «закрытого ключа». Биты «открытого ключа» включаются при создании CSR и впоследствии становятся частью связанного сертификата.
Чтобы убедиться, что открытый ключ в вашем сертификате соответствует открытой части вашего закрытого ключа, вам просто нужно сравнить эти числа. Для просмотра сертификата и ключа выполните команды:
$ openssl x509 -noout -text -in server.crt
$ openssl rsa -noout -text -in server.key
Части «модуль» и «публичный показатель» в ключе и сертификате должны совпадать. Поскольку общедоступный показатель обычно равен 65537, и трудно визуально проверить, совпадают ли числа длинных модулей, вы можете использовать следующий подход:
$ openssl x509 -noout -modulus -in server.crt | openssl md5
$ openssl rsa -noout -modulus -in server.key | openssl md5
Это оставляет вам два более коротких числа для сравнения. Теоретически возможно, что эти числа могут быть одинаковыми, но числа модулей не будут одинаковыми, но шансы на это крайне малы.
Если вы хотите проверить, какому ключу или сертификату принадлежит конкретный CSR, вы можете выполнить те же вычисления для CSR следующим образом:
$ openssl req -noout -modulus -in server.csr | openssl md5
Как преобразовать сертификат из формата PEM в формат DER?
Формат сертификата по умолчанию для OpenSSL — PEM, который представляет собой просто DER в кодировке Base64 со строками заголовка и нижнего колонтитула. Для некоторых приложений (например, Microsoft Internet Explorer) вам нужен сертификат в простом формате DER. Вы можете преобразовать файл PEM cert.pem
в соответствующий файл DER, cert.der
используя следующую команду:
$ openssl x509 -in cert.pem -out cert.der -outform DER
Почему браузеры жалуются, что не могут проверить мой сертификат сервера?
Одна из причин, по которой это может произойти, заключается в том, что сертификат вашего сервера подписан промежуточным центром сертификации. Различные центры сертификации, такие как Verisign или Thawte, начали подписывать сертификаты не своим корневым сертификатом, а промежуточными сертификатами.
Промежуточные сертификаты ЦС находятся между корневым сертификатом ЦС (который устанавливается в браузерах) и сертификатом сервера (который вы установили на сервере). Чтобы браузер мог пройти и проверить цепочку доверия от сертификата сервера до корневого сертификата, ему необходимо предоставить промежуточные сертификаты. Центры сертификации должны быть в состоянии предоставить вам такие пакеты промежуточных сертификатов, которые можно установить на сервере.
Вам необходимо включить эти промежуточные сертификаты в
SSLCertificateChainFile
директиву.
SSL-протокол
- Почему я получаю много случайных ошибок протокола SSL при большой нагрузке на сервер?
- Почему мой веб-сервер имеет более высокую нагрузку, теперь, когда он обслуживает зашифрованный SSL-трафик?
- Почему подключение HTTPS к моему серверу иногда занимает до 30 секунд?
- Какие шифры SSL поддерживаются mod_ssl?
- Почему я получаю сообщение об ошибке «нет общего шифра» при попытке использовать анонимные шифры Диффи-Хеллмана (ADH)?
- Почему я получаю сообщение об ошибке «нет общих шифров» при подключении к моему только что установленному серверу?
- Почему я не могу использовать SSL с виртуальными хостами на основе имени/не на основе IP?
- Можно ли использовать виртуальный хостинг на основе имени для идентификации различных виртуальных хостов SSL?
- Как заставить работать сжатие SSL?
- Когда я использую обычную аутентификацию через HTTPS, значок замка в браузерах Netscape остается разблокированным, когда появляется диалоговое окно. Означает ли это, что имя пользователя/пароль отправляется в незашифрованном виде?
- Почему я получаю ошибки ввода-вывода при подключении через HTTPS к серверу Apache+mod_ssl с помощью Microsoft Internet Explorer (MSIE)?
- Как включить TLS-SRP?
- Почему я получаю сбои рукопожатия с клиентами на основе Java при использовании сертификата с более чем 1024 битами?
Почему я получаю много случайных ошибок протокола SSL при большой нагрузке на сервер?
Этому может быть ряд причин, но основная из них — проблемы с кэшем сеанса SSL, указанным в директиве
SSLSessionCache
. Кэш сеанса DBM является наиболее вероятным источником проблемы, поэтому может помочь использование кэша сеанса SHM (или вообще его отсутствие).
Почему мой веб-сервер имеет более высокую нагрузку, теперь, когда он обслуживает зашифрованный SSL-трафик?
SSL использует сильное криптографическое шифрование, что требует большого количества вычислений. Когда вы запрашиваете веб-страницу через HTTPS, все (даже изображения) шифруется перед передачей. Таким образом, увеличение трафика HTTPS приводит к увеличению нагрузки.
Почему подключение HTTPS к моему серверу иногда занимает до 30 секунд?
Обычно это вызвано тем, что /dev/random
устройство
SSLRandomSeed
блокирует вызов read(2) до тех пор, пока не будет доступно достаточно энтропии для обслуживания запроса. Более подробная информация доступна в справочном руководстве к SSLRandomSeed
директиве.
Какие шифры SSL поддерживаются mod_ssl?
Обычно любые шифры SSL, поддерживаемые используемой версией OpenSSL, также поддерживаются mod_ssl
. Доступные шифры могут зависеть от того, как вы создали OpenSSL. Как правило, поддерживаются как минимум следующие шифры:
- RC4 с SHA1
- AES с SHA1
- Тройной DES с SHA1
Чтобы определить фактический список доступных шифров, вы должны запустить следующее:
$ openssl ciphers -v
Почему я получаю сообщение об ошибке «нет общего шифра» при попытке использовать анонимные шифры Диффи-Хеллмана (ADH)?
По умолчанию OpenSSL не поддерживает шифры ADH из соображений безопасности. Пожалуйста, убедитесь, что вы знаете о возможных побочных эффектах, если вы решите включить эти шифры.
Чтобы использовать анонимные шифры Диффи-Хеллмана (ADH), вы должны собрать OpenSSL с `` -DSSL_ALLOW_ADH
'', а затем добавить `` ADH
'' в ваш файл SSLCipherSuite
.
Почему я получаю сообщение об ошибке «нет общих шифров» при подключении к моему только что установленному серверу?
Либо вы допустили ошибку со своей
SSLCipherSuite
директивой (сравните ее с предварительно сконфигурированным примером в
extra/httpd-ssl.conf
), либо вы решили использовать алгоритмы DSA/DH вместо RSA, когда вы сгенерировали свой закрытый ключ и проигнорировали или проигнорировали предупреждения. Если вы выбрали DSA/DH, ваш сервер не сможет обмениваться данными с использованием SSL-шифров на основе RSA (по крайней мере, пока вы не настроите дополнительную пару сертификат/ключ на основе RSA). Современные браузеры, такие как NS или IE, могут обмениваться данными только через SSL с использованием шифров RSA. Результатом является ошибка «нет общих шифров». Чтобы исправить это, повторно создайте пару сертификат/ключ сервера, используя алгоритм RSA.
Почему я не могу использовать SSL с виртуальными хостами на основе имени/не на основе IP?
Причина очень техническая и несколько проблема «курицы и яйца». Уровень протокола SSL остается ниже уровня протокола HTTP и инкапсулирует HTTP. Когда соединение SSL (HTTPS) установлено, Apache/mod_ssl должен согласовать параметры протокола SSL с клиентом. Для этого mod_ssl должен проконсультироваться с конфигурацией виртуального сервера (например, он должен найти набор шифров, сертификат сервера и т. д.). Но для того, чтобы перейти к правильному виртуальному серверу, Apache должен знать Host
поле заголовка HTTP. Для этого необходимо прочитать заголовок HTTP-запроса. Это невозможно сделать до завершения рукопожатия SSL, но информация необходима для завершения фазы рукопожатия SSL. См. следующий вопрос о том, как обойти эту проблему.
Обратите внимание, что если у вас есть сертификат SSL с подстановочными знаками или сертификат с несколькими именами хостов с использованием полей subjectAltName, вы можете использовать SSL на виртуальных хостах на основе имен без дополнительных обходных путей.
Можно ли использовать виртуальный хостинг на основе имени для идентификации различных виртуальных хостов SSL?
Виртуальный хостинг на основе имени — очень популярный метод идентификации различных виртуальных хостов. Это позволяет использовать один и тот же IP-адрес и один и тот же номер порта для разных сайтов. Когда люди переходят на SSL, кажется естественным предположить, что один и тот же метод можно использовать для множества разных виртуальных хостов SSL на одном сервере.
Это возможно, но только при использовании веб-сервера 2.2.12 или более поздней версии, созданного с использованием OpenSSL версии 0.9.8j или более поздней. Это связано с тем, что для этого требуется функция, добавленная только в самые последние версии спецификации SSL, называемая индикацией имени сервера (SNI).
Обратите внимание, что если у вас есть сертификат SSL с подстановочными знаками или сертификат с несколькими именами хостов с использованием полей subjectAltName, вы можете использовать SSL на виртуальных хостах на основе имен без дополнительных обходных путей.
Причина в том, что протокол SSL представляет собой отдельный уровень, который инкапсулирует протокол HTTP. Таким образом, сеанс SSL — это отдельная транзакция, которая выполняется до начала сеанса HTTP. Сервер получает SSL-запрос на IP-адрес X и порт Y (обычно 443). Поскольку запрос SSL не содержал поля Host:, сервер не мог решить, какой виртуальный хост SSL использовать. Обычно он просто использовал первый найденный, который соответствовал указанному порту и IP-адресу.
Если вы используете версию веб-сервера и OpenSSL, которые поддерживают SNI, а браузер клиента также поддерживает SNI, то имя хоста включается в исходный запрос SSL, и веб-сервер может выбрать правильный виртуальный хост SSL.
Конечно, вы можете использовать виртуальный хостинг на основе имени, чтобы идентифицировать множество виртуальных хостов без SSL (например, все на порту 80), а затем иметь один виртуальный хост SSL (на порту 443). Но если вы сделаете это, вы должны обязательно указать номер порта без SSL в директиве NameVirtualHost, например
ИмяВиртуальный хост 192.168.1.1:80
Другие обходные решения включают в себя:
Использование отдельных IP-адресов для разных хостов SSL. Использование разных номеров портов для разных хостов SSL.
Как заставить работать сжатие SSL?
Хотя согласование сжатия SSL было определено в спецификации SSLv2 и TLS, только в мае 2004 года RFC 3749 определил DEFLATE как согласованный стандартный метод сжатия.
OpenSSL 0.9.8 начал поддерживать это по умолчанию при компиляции с этой
zlib
опцией. Если и клиент, и сервер поддерживают сжатие, оно будет использоваться. Однако большинство клиентов по-прежнему пытаются первоначально подключиться с помощью приветствия SSLv2. Поскольку SSLv2 не включает набор предпочтительных алгоритмов сжатия в свое рукопожатие, сжатие не может быть согласовано с этими клиентами. Если клиент отключает поддержку SSLv2, может быть отправлено приветствие SSLv3 или TLS, в зависимости от используемой библиотеки SSL, и может быть настроено сжатие. Вы можете проверить, используют ли клиенты сжатие SSL, записав эту %{SSL_COMPRESS_METHOD}x
переменную в журнал.
Когда я использую обычную аутентификацию через HTTPS, значок замка в браузерах Netscape остается разблокированным, когда появляется диалоговое окно. Означает ли это, что имя пользователя/пароль отправляется в незашифрованном виде?
Нет, логин/пароль передаются в зашифрованном виде. Значок в браузерах Netscape на самом деле не синхронизирован со слоем SSL/TLS. Он переключается в заблокированное состояние только тогда, когда передается первая часть фактических данных веб-страницы, что может сбить людей с толку. Средство базовой аутентификации является частью уровня HTTP, который находится над уровнем SSL/TLS в HTTPS. Перед тем, как какая-либо передача данных HTTP произойдет в HTTPS, уровень SSL/TLS уже завершил свою фазу рукопожатия и переключился на зашифрованную связь. Так что пусть вас не смущает этот значок.
Почему я получаю ошибки ввода-вывода при подключении через HTTPS к серверу Apache+mod_ssl со старыми версиями Microsoft Internet Explorer (MSIE)?
Первая причина заключается в том, что реализация SSL в некоторых версиях MSIE имеет некоторые тонкие ошибки, связанные с механизмом проверки активности HTTP и уведомлениями о закрытии SSL при закрытии соединения сокета. Кроме того, взаимодействие между функциями SSL и HTTP/1.1 проблематично в некоторых версиях MSIE. Вы можете обойти эти проблемы, заставив Apache не использовать HTTP/1.1, поддерживающие соединения или отправлять уведомления о закрытии SSL клиентам MSIE. Это можно сделать с помощью следующей директивы в разделе вашего виртуального хоста с поддержкой SSL:
SetEnvIf User-Agent "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
даунгрейд-1.0 сила-реакция-1.0
Кроме того, некоторые версии MSIE имеют проблемы с определенными шифрами. К сожалению, для этого невозможно реализовать обходной путь, специфичный для MSIE, поскольку шифры необходимы уже на этапе рукопожатия SSL. Таким образом, специфичный для MSIE
SetEnvIf
не решит эти проблемы. Вместо этого вам придется внести более радикальные изменения в глобальные параметры. Прежде чем вы решите это сделать, убедитесь, что у ваших клиентов действительно есть проблемы. Если нет, не вносите эти изменения — они затронут всех ваших клиентов, MSIE или других.
Как включить TLS-SRP?
TLS-SRP (безопасный обмен ключами удаленного пароля для TLS, указанный в RFC 5054) может дополнять или заменять сертификаты при аутентификации соединения SSL. Чтобы использовать TLS-SRP, установите
SSLSRPVerifierFile
директиву так, чтобы она указывала на файл проверки OpenSSL SRP. Чтобы создать файл верификатора, используйте
openssl
инструмент:
openssl srp -srpvfile passwd.srpv -add username
После создания этого файла укажите его в конфигурации SSL-сервера:
SSLSRPVerifierFile /path/to/passwd.srpv
Чтобы заставить клиентов использовать наборы шифров TLS-SRP без сертификата, используйте следующую директиву:
SSLCipherSuite "!DSS:!aRSA:SRP"
Почему я получаю сбои рукопожатия с клиентами на основе Java при использовании сертификата с более чем 1024 битами?
Начиная с версии 2.4.7,
mod_ssl
будут использоваться параметры DH, которые включают простые числа длиной более 1024 бит. Однако Java 7 и более ранние версии ограничивают поддержку простых размеров DH максимум 1024 битами.
Если ваш клиент на основе Java завершает работу с исключениями, такими как
java.lang.RuntimeException: Could not generate DH keypair
и
java.security.InvalidAlgorithmParameterException: Prime size must be
multiple of 64, and can only range from 512 to 1024 (inclusive)
, и журналами httpd tlsv1 alert internal error (SSL alert number 80)
(на уровне LogLevel
info
или выше), вы можете либо изменить порядок списка шифров mod_ssl с помощью
SSLCipherSuite
(возможно, в сочетании с SSLHonorCipherOrder
), либо вы можете использовать пользовательские параметры DH с 1024-битным простым числом. , который всегда будет иметь приоритет над любым из встроенных параметров DH.
Чтобы сгенерировать пользовательские параметры DH, используйте openssl dhparam 1024
команду. В качестве альтернативы вы можете использовать следующие стандартные 1024-битные параметры DH из RFC 2409, раздел 6.2:
-----НАЧАЛО ПАРАМЕТРОВ DH-----
MIGHAoGBAP//////////yQ/aoiFowjTExmKLgNwc0SkCTgiKZ8x0Agu+pjsTmyJR
Sgh5jjQE3e+VGbPNOkMbMCsKbfJfFDdP4TVtbVHCReSFtXZiXn7G9ExC6aY37WsL
/1y29Aa37e44a/taiZ+lrp8kEXxLH+ZJKGZR7OZTgf//////////AgEC
-----КОНЕЦ ПАРАМЕТРОВ DH-----
Добавьте пользовательские параметры, включая строки «BEGIN DH PARAMETERS» и «END DH PARAMETERS», в конец первого файла сертификата, который вы настроили с помощью директивы
SSLCertificateFile
.
Поддержка mod_ssl
- Какие информационные ресурсы доступны в случае проблем с mod_ssl?
- Какие контакты службы поддержки доступны в случае проблем с mod_ssl?
- Какую информацию я должен предоставить при написании отчета об ошибке?
- У меня был дамп ядра, вы можете мне помочь?
- Как мне получить обратную трассировку, чтобы помочь найти причину моего дампа ядра?
Какие информационные ресурсы доступны в случае проблем с mod_ssl?
Доступны следующие информационные ресурсы. В случае проблем вы должны искать здесь в первую очередь.
- Ответы в списке часто задаваемых вопросов руководства пользователя (этот)
-
http://httpd.apache.org/docs/2.4/ssl/ssl_faq.html
Сначала проверьте FAQ (этот текст). Если ваша проблема является распространенной, возможно, на нее уже отвечали несколько раз, и она была включена в этот документ.
Какие контакты службы поддержки доступны в случае проблем с mod_ssl?
Ниже перечислены все возможности поддержки mod_ssl в порядке предпочтения. Пожалуйста, просмотрите эти возможности
в этом порядке - не просто выберите тот, который вам нравится.
- Отправить отчет о проблеме в список рассылки поддержки пользователей Apache httpd
users@httpd.apache.org
Это второй способ отправить отчет о проблеме. Опять же, вы должны сначала подписаться на список, но затем вы можете легко обсудить свою проблему со всем сообществом пользователей Apache httpd.
- Напишите отчет о проблеме в базе данных ошибок
http://httpd.apache.org/bug_report.html
Это последний способ отправить отчет о проблеме. Это следует делать только в том случае, если вы уже отправляли сообщения в списки рассылки, но безуспешно. Пожалуйста , внимательно следуйте инструкциям на странице выше .
Какую информацию я должен предоставить при написании отчета об ошибке?
Вы всегда должны предоставлять как минимум следующую информацию:
- Информация о версии Apache httpd и OpenSSL
- Версию Apache можно определить, запустив
httpd -v
. Версию OpenSSL можно определить, запустив openssl version
. В качестве альтернативы, если у вас установлен Lynx, вы можете запустить команду lynx -mime_header
http://localhost/ | grep Server
для сбора этой информации за один шаг.
- Подробная информация о том, как вы собрали и установили Apache httpd и OpenSSL
- Для этого вы можете предоставить файл журнала сеанса терминала, в котором показаны шаги настройки и установки. Если это невозможно, вы должны, по крайней мере, указать
configure
используемую вами командную строку.
- В случае дампов ядра, пожалуйста, включите Backtrace
- Если ваш Apache httpd сбрасывает свое ядро, прикрепите ``backtrace'' стека-фрейма (см. ниже информацию о том, как это сделать). Эта информация необходима для того, чтобы найти причину вашего дампа ядра.
- Подробное описание вашей проблемы
- Не смейтесь, мы действительно серьезно! Многие отчеты о проблемах не содержат описания фактической проблемы. Без этого вам очень сложно кому-либо помочь. Итак, в ваших же интересах (вы же хотите, чтобы проблема была решена, не так ли?) включить как можно больше подробностей, пожалуйста. Конечно, вы все равно должны включить все вышеперечисленное.
У меня был дамп ядра, вы можете мне помочь?
В общем нет, по крайней мере, если вы не предоставите более подробную информацию о месте кода, где Apache сбрасывает ядро. Что обычно всегда требуется, чтобы помочь вам, так это обратная трассировка (см. следующий вопрос). Без этой информации практически невозможно найти проблему и помочь вам в ее устранении.
Как мне получить обратную трассировку, чтобы помочь найти причину моего дампа памяти?
Ниже приведены шаги, которые вам необходимо выполнить, чтобы получить обратную трассировку:
- Убедитесь, что у вас есть символы отладки, по крайней мере, в Apache. На платформах, где вы используете GCC/GDB, вам нужно будет собрать Apache+mod_ssl с ``
OPTIM="-g -ggdb3"
'', чтобы получить это. OPTIM="-g"
На других платформах требуется
как минимум `` ''.
- Запустите сервер и попробуйте воспроизвести дамп ядра. Для этого вы можете использовать директиву типа ``
CoreDumpDirectory /tmp
'', чтобы убедиться, что файл дампа ядра может быть записан. Это должно привести к файлу /tmp/core
или /tmp/httpd.core
. Если вы не получили ни одного из них, попробуйте запустить сервер под UID без полномочий root. Многие современные ядра не позволяют процессу создавать дамп ядра после того, как он выполнил a setuid()
(если только он не выполнил exec()
) по соображениям безопасности (в памяти может остаться привилегированная информация). При необходимости вы можете запустить /path/to/httpd -X
вручную, чтобы заставить Apache не разветвляться.
- Проанализируйте дамп ядра. Для этого запустите
gdb /path/to/httpd
/tmp/httpd.core
или аналогичную команду. В GDB все, что вам нужно сделать, это ввести bt
, и вуаля, вы получите обратную трассировку. Для других отладчиков обратитесь к местному руководству по отладчику.