Протокол безопасной передачи данных SSL (Secure Sockets Layer) помимо обеспечения безопасной передачи данных позволяет также реализовать авторизацию клиентов на сервере с помощью клиентских SSL сертификатов.
Процесс авторизация выглядит так. Клиент переходит в закрытую область сайта, веб-сервер запрашивает у браузера клиента сертификат. Если проверка клиентского сертификата прошла удачно, то клиент получает доступ в закрытую часть сайта.
Порядок создания SSL сертификата
-
Клиент должен создать сертификат, со всеми необходимыми данными.
-
Создать приватный ключ на локальной машине и отправить запрос в центр сертификации (ЦС) на сертификацию сертификата.
-
После обработки запроса, сертификат подписывается секретным ключем ЦС. Клиент имея публичный ключ ЦС, проверяет подлинность сертификата и далее может использовать его.
Настройка OpenSSL
Отредактируем файл /etc/ssl/openssl.cnf, согласно нашей конфигурации
[ ca ] default_ca = CA_default # The default ca section
[ CA_default ] dir = /etc/ssl.hostcomm # Where everything is kept certs = $dir/ssl.crt # Where the issued certs are kept crl_dir = $dir/ssl.crl # Where the issued crl are kept database = $dir/index.txt # database index file. new_certs_dir = $dir/ssl.crt # default place for new certs.
certificate = $dir/private/ca.pem # The CA certificate serial = $dir/serial # The current serial number crlnumber = $dir/crlnumber # the current crl number crl = $dir/crl.pem # The current CRL private_key = $dir/private/ca.key # The private key RANDFILE = $dir/private/.rand # private random number file
x509_extensions = usr_cert # The extentions to add to the cert
name_opt = ca_default # Subject Name options cert_opt = ca_default # Certificate field options
default_days = 365 # how long to certify for default_crl_days= 30 # how long before next CRL default_md = sha1 # which md to use. preserve = no # keep passed DN ordering
policy = policy_match
# For the CA policy [ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional |
Не забываем создать директории описанные в конфигурационном файле openssl.cnf
А также echo "01" > serial, т. к. пустышка не принимается.
Если вы собираетесь получать подписанный сертификат центром сертификации (ЦС), то нужно отправить запрос к ним. После обработки запроса, сертификат будет подписан на определенный срок.
Если у вас нет сертификата, то можно создать свой ЦС и подписывать сертификаты самостоятельно.
# openssl req -new -x509 -days 365 -config /etc/ssl/openssl.cnf -keyout ca.key -out ca.crt |
В результате выполнения команды появятся два файла ca.key и ca.crt.
Создание клиентского приватного ключа и запроса на сертификат (CSR).
Для создания подписанного клиентского сертификата необходимо создать запрос на сертификат, для его подписи.
# openssl req -new -newkey rsa:1024 -nodes -keyout client.key -out client.csr |
Client1.csr — есть файл, в котором находится запрос CSR.
Подпишем наш сертификат:
# openssl ca -config openssl.cnf -in client.csr -out client.crt -batch |
В результате у нас появится файл клиентского сертификата client.crt.
Описание опций команд openssl:
-
req - запрос на создание нового сертификата
-
-new - создание запроса на сертификат (Certificate Signing Request - далее CSR)
-
-newkey rsa:1024 - будет создан новый закрытый RSA ключ длиной 1024 бита
-
-nodes - не шифровать закрытый ключ
-
-keyout ca.key - закрытый ключ сохранить в файл ca.key
-
-x509 - создать самоподписанный сертификат
-
-days 365 - срок действия сертификата
-
-out ca.crt - сертификат сохранить в файл ca.crt.
Во время создания сертификата нас запрашивают некоторую информацию для создания сертификата:
С - Двухсимвольный код страны (Country) - Не обязательный
ST - Название региона/области/края/республики/… (State Name) - Не обязательный
L - Название города/поселка/… (Locality Name) - Не обязательный
O - Название организации (Organization Name) - Не обязательный
OU - Название отдела (Organization Unit) - Не обязательный
CN - Имя сертификата, при создании серверных сертификатов используется доменное имя сайта (Common Name) - Обязательный
emailAddress - Почтовый адрес (E-mail address) - Не обязательный
Чтобы не вводить эти параметры интерактивно можно использовать опцию -subj:
# openssl req -new -newkey rsa:1024 -nodes -subj /C=RU/O=My\ site/CN=mysite.ru/emailAddress=Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра. -keyout client.key -out client.csr |
На этом всё.