Как из сертификата сайта сделать клиентский сертификат


Авторизация клиентов в nginx посредством SSL сертификатов / Хабр

Введение:

Потребовалось мне тут как-то написать небольшой API, в котором необходимо было помимо обычных запросов принимать запросы с «высокой степенью секретности».
Не я первый с этим столкнулся и мир давно уже использует для таких вещей SSL.

Поскольку на моём сервере используется nginx, то был установлен модуль SSL
Гугл не выдал ни одного работоспособного howto, но информация в сети есть по частям.

Итак, пошаговое руководство по настройке nginx на авторизацию клиентов через SSL-сертификаты.

Внимание! В статье для примера используются самоподписанные сертификаты!

Перед стартом создадим папку в конфиге nginx, где будут плоды наших трудов:

cd /path/to/nginx/config/ mkdir ssl && cd ssl
Шаг 1. Создание собственного самоподписанного доверенного сертификата.

Собственный доверенный сертификат (Certificate Authority или CA) необходим для подписи клиентских сертификатов и для их проверки при авторизации клиента веб-сервером.
С помощью приведенной ниже команды создается закрытый ключ и самоподписанный сертификат.

openssl req -new -newkey rsa:1024 -nodes -keyout ca.key -x509 -days 500 -subj /C=RU/ST=Moscow/L=Moscow/O=Companyname/OU=User/CN=etc/[email protected] -out ca.crt

Описание аргументов:

req Запрос на создание нового сертификата.
-new Создание запроса на сертификат (Certificate Signing Request – далее CSR).
-newkey rsa:1023 Автоматически будет создан новый закрытый RSA ключ длиной 1024 бита. Длину ключа можете настроить по своему усмотрению.
-nodes Не шифровать закрытый ключ.
-keyout ca.key Закрытый ключ сохранить в файл ca.key.
-x509 Вместо создания CSR (см. опцию -new) создать самоподписанный сертификат.
-days 500 Срок действия сертификата 500 дней. Размер периода действия можете настроить по своему усмотрению. Не рекомендуется вводить маленькие значения, так как этим сертификатом вы будете подписывать клиентские сертификаты.
-subj /C=RU/ST=Moscow/L=Moscow/O=Companyname/OU=User/CN=etc/[email protected]
Данные сертификата, пары параметр=значение, перечисляются через ‘/’. Символы в значении параметра могут быть «подсечены» с помощью обратного слэша «\», например «O=My\ Inc». Также можно взять значение аргумента в кавычки, например, -subj «/xx/xx/xx».

Шаг 2. Сертификат сервера

Создадим сертификат для nginx и запрос для него
openssl genrsa -des3 -out server.key 1024 openssl req -new -key server.key -out server.csr

Подпишем сертификат нашей же собственной подписью

openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt

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

openssl rsa -in server.key -out server.nopass.key
Конфиг nginx
listen *:443; ssl on; ssl_certificate /path/to/nginx/ssl/server.crt; ssl_certificate_key /path/to/nginx/ssl/server.nopass.key; ssl_client_certificate /path/to/nginx/ssl/ca.crt; ssl_verify_client on; keepalive_timeout 70; fastcgi_param SSL_VERIFIED $ssl_client_verify; fastcgi_param SSL_CLIENT_SERIAL $ssl_client_serial; fastcgi_param SSL_CLIENT_CERT $ssl_client_cert; fastcgi_param SSL_DN $ssl_client_s_dn;


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

Однако если вы попытаетесь зайти на сайт, он выдаст ошибку:

400 Bad Request No required SSL certificate was sent

Что ж, логично, в этом-то и вся соль!

Шаг 3. Создание клиентских сертификатов
3.1 Подготовка CA

Создадим конфиг
nano ca.config

со следующим содержимым:

[ ca ] default_ca = CA_CLIENT # При подписи сертификатов # использовать секцию CA_CLIENT [ CA_CLIENT ] dir = ./db # Каталог для служебных файлов certs = $dir/certs # Каталог для сертификатов new_certs_dir = $dir/newcerts # Каталог для новых сертификатов database = $dir/index.txt # Файл с базой данных подписанных сертификатов serial = $dir/serial # Файл содержащий серийный номер сертификата (в шестнадцатеричном формате) certificate = ./ca.crt # Файл сертификата CA private_key = ./ca.key # Файл закрытого ключа CA default_days = 365 # Срок действия подписываемого сертификата default_crl_days = 7 # Срок действия CRL default_md = md5 # Алгоритм подписи policy = policy_anything # Название секции с описанием политики в отношении данных сертификата [ policy_anything ] countryName = optional # Поля optional - не обязательны, supplied - обязательны stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = optional emailAddress = optional


Далее надо подготовить структуру каталогов и файлов, соответствующую описанной в конфигурационном файле

mkdir db mkdir db/certs mkdir db/newcerts touch db/index.txt echo "01" > db/serial
3.2. Создание клиентского закрытого ключа и запроса на сертификат (CSR)

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

openssl req -new -newkey rsa:1024 -nodes -keyout client01.key -subj /C=RU/ST=Moscow/L=Moscow/O=Companyname/OU=User/CN=etc/[email protected] -out client01.csr

В результате выполнения команды появятся два файла client01.key и client01.csr.

3.3. Подпись запроса на сертификат (CSR) с помощью доверенного сертификата (CA).

При подписи запроса используются параметры заданные в файле ca.config




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

В результате выполнения команды появится файл клиентского сертификата client01.crt.

Для создания следующих сертификатов нужно повторять эти два шага.

3.4. Создание сертификата в формате PKCS#12 для браузера клиента

Это на тот случай, если к вашему серверу подключаются не бездушные машины, как в моём случае, а живые люди через браузер.
Запароленный файл PKCS#12 надо скормить браузеру, чтобы он смог посещать ваш сайт.
openssl pkcs12 -export -in client01.crt -inkey client01.key -certfile ca.crt -out client01.p12 -passout pass:q1w2e3
3.5 Подключение к полученному ssl cерверу с помощью curl
curl -k --key client.key --cert client1.crt --url "https://site.com"

Использована опция -k, потому что сертификат в примере самоподписанный

Использованное ПО

Ubuntu Server 10.10 (Linux 2.6.35-22-server #35-Ubuntu SMP x86_64 GNU/Linux)
nginx 0.9.3
OpenSSL 0.9.8o 01 Jun 2010
Полезные ссылки

Надеюсь, был кому-то полезен.

P.S. Этот пост был моей первой публикацией 16 января 2011 года, старая копия удалена (по желанию администрации сайта и потому, что она не была привязана к моему аккаунту).

Получить сертификат SSL с сервера (URL сайта) - Экспорт и загрузка

Когда-нибудь вам может потребоваться получить SSL-сертификат веб-сайта и сохранить его локально.

Например, вы можете получить сообщение об ошибке, в котором говорится, что вы не можете клонировать репозиторий Git из-за самозаверяющего сертификата, и для решения этой проблемы вам нужно будет загрузить сертификат SSL и сделать его доверенным для вашего клиента Git.

В следующей статье я покажу, как экспортировать сертификат SSL с сервера (URL сайта) с помощью браузеров Google Chrome, Mozilla Firefox и Internet Explorer, а также как получить сертификат SSL из командной строки с помощью команды openssl .

Дельный Совет: Создайте самоподписанный сертификат SSL! Узнать больше →

Экспорт SSL-сертификата

Google Chrome

Экспорт SSL-сертификата веб-сайта с помощью Google Chrome:

  1. Нажмите кнопку Secure (замок) в адресной строке
  2. Нажмите кнопку Показать сертификат кнопку
  3. Перейти на вкладку Подробности
  4. Нажмите кнопку Экспорт
  5. Укажите имя файла, в который вы хотите сохранить сертификат SSL, сохраните формат «ASCII с кодировкой Base64, единый сертификат» и нажмите кнопку Сохранить .

Mozilla Firefox

Экспорт SSL-сертификата веб-сайта с помощью Mozilla Firefox:

  1. Нажмите кнопку Site Identity (замок) в адресной строке
  2. Щелкните Показать сведения о подключении стрелка
  3. Нажмите кнопку Дополнительная информация
  4. Нажмите кнопку Просмотр сертификата кнопку
  5. Перейти на вкладку Подробности
  6. Нажмите кнопку Экспорт
  7. Укажите имя файла, в который вы хотите сохранить сертификат SSL, оставьте «X.509 Certificate (PEM) »и нажмите кнопку Сохранить

Дельный Совет: Проверьте дату истечения срока действия SSL-сертификата из командной строки Linux! Самый быстрый способ! Узнать больше →

Internet Explorer

Загрузите и сохраните SSL-сертификат веб-сайта с помощью Internet Explorer:

  1. Нажмите кнопку Отчет о безопасности (замок) в адресной строке
  2. Нажмите кнопку Просмотр сертификата кнопку
  3. Перейти на вкладку Подробности
  4. Щелкните Копировать в файл... кнопка
  5. Нажмите кнопку Далее
  6. Выберите формат «X.509 (.CER) в кодировке Base-64» и нажмите кнопку Далее
  7. Укажите имя файла, в котором вы хотите сохранить сертификат SSL на
  8. Нажмите кнопки Next и Finish

OpenSSL

Получите SSL-сертификат веб-сайта с помощью команды openssl :

 $ echo | openssl s_client -servername  NAME  -connect  HOST: PORT  | \ sed -ne '/ -BEGIN CERTIFICATE - /, / - END CERTIFICATE- / p'> сертификат.crt 

Краткое объяснение:

Опция Описание
-соедините ХОСТ: ПОРТ Хост и порт для подключения к
- имя сервера ИМЯ Расширение TLS SNI (указание имени сервера) (веб-сайт)
certificate.crt Сохранить сертификат SSL в этот файл

Пример:

 $ echo | openssl s_client -servername google.com -connect google.com:443 | \ sed -ne '/ -НАЧАТЬ СЕРТИФИКАТ - /, / - КОНЕЦ СЕРТИФИКАТА- / p'> certificate.crt 
.

windows 7 - Как создать сертификаты клиента для локального тестирования двусторонней аутентификации через SSL?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
.

c # - Как использовать сертификат клиента для аутентификации и авторизации в веб-API

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
  4. Талант
.

java - Как программно сгенерировать сертификат аутентификации клиента

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
.

Смотрите также

Поделиться в соц. сетях

Опубликовать в Facebook
Опубликовать в Одноклассники
Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий