HTTPS на примере Apache2 (методическое пособие) — различия между версиями

Материал из wiki
Перейти к: навигация, поиск
(Apache2)
(SSL сертификат)
 
(не показано 14 промежуточных версий 2 участников)
Строка 1: Строка 1:
== SSL сертификат ==
+
= HTTPS =
 +
== PKI ==
 +
 
 +
Сертификат сервера должен быть выдан Центром Сертификации, которому доверяет браузер. Браузер доверяет ЦС сертификаты которых хранятся в системном хранилище.
 +
 
 +
При использовании самоподписанных сертификатов, корневые сертификаты ставятся на компьютеры клиентов вручную (или с помощью груповой политики).
 +
 
 +
Крупные коммерческие ЦС, продающие сертификаты, распространяют свои корневые сертификаты с обновлениями браузеров и операционных систем.
 +
 
 +
== TLS/SSL ==
 +
HTTPS это протокол HTTP используемый поверх шифрованного канала TLS или SSL. Стандартный порт 443.
 +
 
 +
Использование TLS канала позволяет защитить передаваемые данные шифрованием. Использование сертификата сервера позволяет клиентам быть уверенными в аутентичности сайта.
 +
 
 +
= SSL сертификат =
  
 
Для протокола SSL на стороне сервера нам требуется сертификат X.509 на конкретное доменное имя и соответствующий закрытый ключ.
 
Для протокола SSL на стороне сервера нам требуется сертификат X.509 на конкретное доменное имя и соответствующий закрытый ключ.
Строка 7: Строка 21:
 
Для внутрикорпоративного использования, в простейшем случае, нам потребуется самостоятельно создать сертификат для доменного имени.
 
Для внутрикорпоративного использования, в простейшем случае, нам потребуется самостоятельно создать сертификат для доменного имени.
  
Если сертификатов требуется несколько - разумно создать Удостоверяющий Центр, сгенерировать корневой сертификат и им подписывать сертификаты сайтов.
+
Если сертификатов требуется несколько - разумно создать Удостоверяющий Центр, сгенерировать корневой сертификат и им подписывать сертификаты сайтов. На компьютеры клиентов придется устанавливать корневой сертификат.
  
Если сертификат требуется один - можно создать самоподписанный сертификат для сайта сразу.
+
Если сертификат требуется один - можно создать самоподписанный сертификат для сайта сразу. На компьютеры клиентов придется устанавливать этот сертификат.
  
Создаем простой Самоподписанный Сертификат и ключ для доменного имени www.model.local со сроком действия 1024 дня с ключом RSA 2048 бит.  
+
Создаем простой Самоподписанный Сертификат и ключ для доменного имени www.model.local со сроком действия 1024 дня с ключом RSA 2048 бит. Сертификат будет подписан алгоритмом SHA512/256.
  
Воспользуемся пакетом openssl. Часть параметров указывается в командной строке, часть в режиме диалога, прочие параметры заданы в /etc/ssl/openssl.cnf
+
Воспользуемся пакетом openssl. Часть параметров указывается в командной строке, часть в режиме диалога, расширения сертификата описаны в файле ./cert.config.
  
<code>
+
Отредактируйте файл cert.config в соответствии с требуемыми параметрами сертификата. Пример:
root@model-net-ctrl-1:~/ssltest# openssl req -x509 -nodes -days 1024 -newkey rsa:2048 -keyout web_key.pem -out web_cert.pem
+
 
 +
<code C>
 +
[ req ]
 +
default_bits        = 2048
 +
distinguished_name  = subject
 +
#req_extensions      = req_ext
 +
x509_extensions    = x509_ext
 +
string_mask        = utf8only
 +
 
 +
[ subject ]
 +
countryName                    = Country Code
 +
countryName_default            = RU
 +
stateOrProvinceName            = State
 +
stateOrProvinceName_default    = Permski Kray
 +
localityName                    = City
 +
localityName_default            = Perm
 +
organizationName                = Organization
 +
organizationName_default        = PSU
 +
 
 +
commonName                  = Common Name
 +
commonName_default          = PSU server
 +
 
 +
[ x509_ext ]
 +
subjectKeyIdentifier        = hash
 +
authorityKeyIdentifier  = keyid,issuer
 +
 
 +
#  RSA Key transport = keyEncipherment = non-ephemeral
 +
basicConstraints        = CA:FALSE
 +
keyUsage            = digitalSignature, keyEncipherment
 +
subjectAltName          = @alternate_names
 +
nsComment          = "PSU Generated Certificate"
 +
 
 +
[ alternate_names ]
 +
IP.0 = 1.2.3.4
 +
DNS.1      = model.local
 +
DNS.2      = www.model.local
 +
</code>
 +
 
 +
 
 +
Обратите внимание на то, что DNS имя сервера указывается в расширении alternate_names.
 +
 
 +
 
 +
Создаем сертификат командой openssl с параметрами, ссылаясь на файл конфигурации:
 +
<code C>
 +
root@model-net-ctrl-1:~/ssltest# openssl req -x509 -nodes -days 1024 -newkey rsa:2048 -sha512  -config cert.config -keyout web_key.pem -out web_cert.pem
 
Generating a 2048 bit RSA private key
 
Generating a 2048 bit RSA private key
 
writing new private key to 'web_key.pem'
 
writing new private key to 'web_key.pem'
Строка 22: Строка 80:
 
State or Province Name (full name) [Some-State]:Permsky Krai
 
State or Province Name (full name) [Some-State]:Permsky Krai
 
Locality Name (eg, city) []:Perm
 
Locality Name (eg, city) []:Perm
Organization Name (eg, company) [Internet Widgits Pty Ltd]:PSNRU
+
Organization Name (eg, company) [Internet Widgits Pty Ltd]:PSU
Organizational Unit Name (eg, section) []:KOIBAS
+
Common Name (e.g. server FQDN or YOUR name) []: PSU server www.model.local
Common Name (e.g. server FQDN or YOUR name) []:www.model.local
 
Email Address []:ru@model.local
 
 
</code>
 
</code>
  
Строка 37: Строка 93:
  
 
Проверить параметры сертификата можно следующей командой
 
Проверить параметры сертификата можно следующей командой
<code>
+
<code bash>
 
root@model-net-ctrl-1:~/ssltest# openssl x509 -in ./web_cert.pem -noout -text
 
root@model-net-ctrl-1:~/ssltest# openssl x509 -in ./web_cert.pem -noout -text
 
Certificate:
 
Certificate:
Строка 66: Строка 122:
 
Как видим, subject и issuer совпадают, поле CA=TRUE, значит это самоподписанный корневой сертификат.
 
Как видим, subject и issuer совпадают, поле CA=TRUE, значит это самоподписанный корневой сертификат.
  
== Apache2 ==
+
= Apache2 =
  
 
По-умолчанию шаблон конфигурации сайта для SSL лежит в /etc/apache2/sites-available/default-ssl.
 
По-умолчанию шаблон конфигурации сайта для SSL лежит в /etc/apache2/sites-available/default-ssl.
Строка 84: Строка 140:
 
Включаем наш сайт, проверяем конфиг и перезапускаем Apache2.
 
Включаем наш сайт, проверяем конфиг и перезапускаем Apache2.
 
<code>
 
<code>
a2ensite defaul-ssl
+
a2ensite default-ssl
 
apache2ctl configtest
 
apache2ctl configtest
 
apache2ctl restart
 
apache2ctl restart
 
</code>
 
</code>
  
 +
Если все сделано правильно, новый сайт будет доступен по адресу https://www.model.local.
 +
 +
= Настройка браузера =
 +
 +
При открытии сайта браузер будет выдавать сообщение об ошибке сертификата, т.к. издатель сертификата не является доверенным.
 +
 +
Чтобы браузер стал доверять нашему сертификату, необходимо его поместить в хранилище доверенных.
 +
 +
Для этого надо открыть сайт. В предупреждении о сертификате выбрать подробные сведения. Открывшийся сертификат сохранить в файл на диске. Браузер необходимо закрыть.
 +
 +
Запустить файл с сертификатом с диска. При помощи Мастера импорта сертификатов поместить сертификат в хранилище Доверенные Корневые ЦС.
 +
 +
Заново открыть сайт в браузере. На этот раз сайт должен открыться без предупреждений по защищенному каналу.
  
Открыть сайт
+
Следите за тем, чтобы на защищаемом сайте все ссылки имели вид https://
Сохранить серт в файл
 
Импорт в доверенные корневые
 
Перезапуск браузера
 
  
  

Текущая версия на 07:22, 7 апреля 2020

HTTPS

PKI

Сертификат сервера должен быть выдан Центром Сертификации, которому доверяет браузер. Браузер доверяет ЦС сертификаты которых хранятся в системном хранилище.

При использовании самоподписанных сертификатов, корневые сертификаты ставятся на компьютеры клиентов вручную (или с помощью груповой политики).

Крупные коммерческие ЦС, продающие сертификаты, распространяют свои корневые сертификаты с обновлениями браузеров и операционных систем.

TLS/SSL

HTTPS это протокол HTTP используемый поверх шифрованного канала TLS или SSL. Стандартный порт 443.

Использование TLS канала позволяет защитить передаваемые данные шифрованием. Использование сертификата сервера позволяет клиентам быть уверенными в аутентичности сайта.

SSL сертификат

Для протокола SSL на стороне сервера нам требуется сертификат X.509 на конкретное доменное имя и соответствующий закрытый ключ. Доменное имя должно быть указано в поле Subject сертификата в графе CN. Для указания множества имен используется поле subjectAltName. Имя домена должно указываться в том виде, в каком оно используется в ссылках на сайт. В нашем примере это будет доменное имя "www.model.local".

Для внутрикорпоративного использования, в простейшем случае, нам потребуется самостоятельно создать сертификат для доменного имени.

Если сертификатов требуется несколько - разумно создать Удостоверяющий Центр, сгенерировать корневой сертификат и им подписывать сертификаты сайтов. На компьютеры клиентов придется устанавливать корневой сертификат.

Если сертификат требуется один - можно создать самоподписанный сертификат для сайта сразу. На компьютеры клиентов придется устанавливать этот сертификат.

Создаем простой Самоподписанный Сертификат и ключ для доменного имени www.model.local со сроком действия 1024 дня с ключом RSA 2048 бит. Сертификат будет подписан алгоритмом SHA512/256.

Воспользуемся пакетом openssl. Часть параметров указывается в командной строке, часть в режиме диалога, расширения сертификата описаны в файле ./cert.config.

Отредактируйте файл cert.config в соответствии с требуемыми параметрами сертификата. Пример:

[ req ]
default_bits        = 2048
distinguished_name  = subject
#req_extensions      = req_ext
x509_extensions     = x509_ext
string_mask         = utf8only

[ subject ]
countryName                     = Country Code
countryName_default             = RU
stateOrProvinceName             = State
stateOrProvinceName_default     = Permski Kray
localityName                    = City
localityName_default            = Perm
organizationName                = Organization
organizationName_default        = PSU

commonName                  = Common Name
commonName_default          = PSU server

[ x509_ext ]
subjectKeyIdentifier        = hash
authorityKeyIdentifier  = keyid,issuer

#   RSA Key transport = keyEncipherment = non-ephemeral
basicConstraints        = CA:FALSE
keyUsage            = digitalSignature, keyEncipherment
subjectAltName          = @alternate_names
nsComment           = "PSU Generated Certificate"

[ alternate_names ]
IP.0 = 1.2.3.4
DNS.1       = model.local
DNS.2       = www.model.local


Обратите внимание на то, что DNS имя сервера указывается в расширении alternate_names.


Создаем сертификат командой openssl с параметрами, ссылаясь на файл конфигурации:

root@model-net-ctrl-1:~/ssltest# openssl req -x509 -nodes -days 1024 -newkey rsa:2048 -sha512  -config cert.config -keyout web_key.pem -out web_cert.pem
Generating a 2048 bit RSA private key
writing new private key to 'web_key.pem'
Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Permsky Krai
Locality Name (eg, city) []:Perm
Organization Name (eg, company) [Internet Widgits Pty Ltd]:PSU
Common Name (e.g. server FQDN or YOUR name) []: PSU server www.model.local

В текущем каталоге будут созданы файл сертификат и файл ключ. На файл ключа необходимо поставить доступ только на чтение и только пользователю, который будет шифровать.

-rw-r--r-- 1 root root 1424 Feb 26 12:23 web_cert.pem
-rw-r--r-- 1 root root 1704 Feb 26 12:23 web_key.pem
root@model-net-ctrl-1:~/ssltest# chmod 0400 web_key.pem

Проверить параметры сертификата можно следующей командой

root@model-net-ctrl-1:~/ssltest# openssl x509 -in ./web_cert.pem -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 9676869248984892495 (0x864b254fcba5444f)
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=RU, ST=Permsky Krai, L=Perm, O=PSNRU, OU=KOIBAS, CN=www.model.local/emailAddress=ru@ru.ru
        Validity
            Not Before: Feb 26 06:49:43 2014 GMT
            Not After : Dec 16 06:49:43 2016 GMT
        Subject: C=RU, ST=Permsky Krai, L=Perm, O=PSNRU, OU=KOIBAS, CN=www.model.local/emailAddress=ru@ru.ru
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:b6:39:4e:10:41:b4:e8:b1:17:87:e0:3f:61:3f:
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                FC:42:EF:CE:C0:B8:33:19:1A:AE:48:12:76:AD:E8:4D:75:A2:B0:2D
            X509v3 Authority Key Identifier:
                keyid:FC:42:EF:CE:C0:B8:33:19:1A:AE:48:12:76:AD:E8:4D:75:A2:B0:2D
            X509v3 Basic Constraints:
                CA:TRUE
    Signature Algorithm: sha1WithRSAEncryption
         6f:19:9e:f1:11:bc:fe:2d:3a:05:01:a3:5c:e3:97:03:e3:e7:

Как видим, subject и issuer совпадают, поле CA=TRUE, значит это самоподписанный корневой сертификат.

Apache2

По-умолчанию шаблон конфигурации сайта для SSL лежит в /etc/apache2/sites-available/default-ssl. Корневой каталог сайта /var/www.

Для запуска SSL необходимо включить соответствующий модуль.

a2enmod ssl

Теперь в конфигурации сайта (/etc/apache2/sites-available/default-ssl) указываем путь к сертификату и закрытому ключу

        SSLCertificateFile    /etc/apache2/ssltest/web_cert.pem
        SSLCertificateKeyFile /etc/apache2/ssltest/web_key.pem

Включаем наш сайт, проверяем конфиг и перезапускаем Apache2.

a2ensite default-ssl
apache2ctl configtest
apache2ctl restart

Если все сделано правильно, новый сайт будет доступен по адресу https://www.model.local.

Настройка браузера

При открытии сайта браузер будет выдавать сообщение об ошибке сертификата, т.к. издатель сертификата не является доверенным.

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

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

Запустить файл с сертификатом с диска. При помощи Мастера импорта сертификатов поместить сертификат в хранилище Доверенные Корневые ЦС.

Заново открыть сайт в браузере. На этот раз сайт должен открыться без предупреждений по защищенному каналу.

Следите за тем, чтобы на защищаемом сайте все ссылки имели вид https://