====== Пакет OpenSSL ====== ===== Статьи ===== * [[http://habrahabr.ru/company/tuthost/blog/150433/|Цифровые SSL сертификаты. Разновидности, как выбрать?]] * [[http://citforum.ru/security/cryptography/openssl/|Основы работы с OpenSSL]] * [[https://jamielinux.com/articles/2013/08/create-an-intermediate-certificate-authority/|How to create an intermediate certificate authority (CA)]] * [[https://ssltools.geotrust.com/checker/views/certCheck.jsp|Check your certificate installation]] ===== Проверка производительности CPU ===== $ openssl speed ===== Интерактивное подключение по ssl ===== * [[Настройка терминалов]] $ openssl s_client -connect ru.wikipedia.org:443 $ openssl s_client -showcerts -connect webinar6.bmstu.ru:443 2>/dev/null | openssl x509 -noout -dates #-text | grep bmstu $ faketime -f "+500d" wget -q -O /dev/null https://webinar7.bmstu.ru && echo Ok || echo Err $ openssl s_client -starttls smtp -crlf -connect mailhub.bmstu.ru:25 $ openssl s_client -connect server.corp13.un:993 -crlf lan# openssl s_client -cert user1.crt -key user1.key -connect www.corpX.un:443 GET /cgi-bin/test-cgi HTTP/1.1 Host: www.corpX.un lan# openssl s_client -cert user1.crt -key user1.key -connect server.corpX.un:993 01 AUTHENTICATE EXTERNAL = ===== Использование алгоритмов симметричного шифрования ====== # openssl enc -aes-256-cbc -e -md md5 -in /root/spa-000E08NNNNNN.cfg -out spa-000E08NNNNNN.enc -pass pass:spapassword # openssl enc -aes-256-cbc -d -md md5 -in spa-000E08NNNNNN.enc -out spa-000E08NNNNNN.cfg -pass pass:spapassword ===== Использование алгоритмов с открытым ключем ===== ==== Создание пары приватный/публичный ключ ==== $ openssl genrsa 2048 > key.private $ openssl rsa -pubout < key.private > key.public ==== Шифрование данных ==== openssl3$ openssl pkeyutl -encrypt -inkey key.public -pubin < data.txt > data.enc openssl1$ openssl rsautl -encrypt -inkey key.public -pubin < data.txt > data.enc openssl3$ openssl pkeyutl -decrypt -inkey key.private < data.enc | tee data.txt openssl1$ openssl rsautl -decrypt -inkey key.private < data.enc > data.txt ==== Цифровая подпись ==== $ openssl dgst -sha256 -sign key.private -out data.sign data.txt $ openssl dgst -sha256 -verify key.public -signature data.sign data.txt ===== Создание параметра DH ===== # time openssl dhparam -out /etc/openvpn/dh2048.pem 2048 ... real 2m6.588s ... ===== Создание самоподписанного сертификата ===== * *.corpX.un для wild card сертификата ==== Создание приватного ключа ==== server# openssl genrsa -out server.key 2048 server# ###chmod 400 server.key ==== Создание сертификата ==== server# openssl req -new -x509 -days 3650 -key server.key -out server.crt -addext 'subjectAltName=DNS:server.corpX.un' ... Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Moscow region Locality Name (eg, city) []:Moscow Organization Name (eg, company) [Internet Widgits Pty Ltd]:cko Organizational Unit Name (eg, section) []:noc Common Name (eg, YOUR name) []:server.corpX.un !!!! для некоторых сервисов (ovpn) не должно быть пустым Email Address []:noc@corpX.un ИЛИ openssl genrsa -out wild.key 2048 openssl req -new -x509 -days 3650 -key wild.key -out wild.crt -subj '/CN=*.corpX.un/O=CKO/C=RU' -addext 'subjectAltName=DNS:*.corpX.un' ==== Просмотр содержимого файла сертификата ==== server# openssl x509 -text -noout -in server.crt server# openssl x509 -text -noout -----BEGIN CERTIFICATE----- ... $ cat ~/.kube/config | grep client-certificate-data | cut -f2 -d : | tr -d ' ' | base64 -d | openssl x509 -text -out - ===== Импорт сертификата центра сертификации ===== * Материалы по Windows [[Материалы по Windows#Экспорт корневого сертификата]] ==== Проверка ==== server# openssl verify server.crt ... error 20 at 0 depth lookup: unable to get local issuer certificate error server.crt: verification failed ==== Debian ==== # wget http://lan.corpX.un/ca.crt # cp ca.crt /usr/local/share/ca-certificates/ или # cp corpX-PDC-CA.crt /usr/local/share/ca-certificates/ или # cp wild.crt /usr/local/share/ca-certificates/ # update-ca-certificates Updating certificates in /etc/ssl/certs... 1 added, 0 removed; done. ... server# ls /etc/ssl/certs | grep "wild\|corp\|ca.pem" ... # openssl verify server.crt server.crt: OK # curl -v https://www.corpX.un ==== CentOS/AlmaLinux ==== # yum install ca-certificates # update-ca-trust force-enable # wget http://lan.corp13.un/ca.crt # cp ca.crt /etc/pki/ca-trust/source/anchors/ # update-ca-trust extract # wget -O - https://www.corp13.un ===== Удаление сертификата центра сертификации ===== server# rm /usr/local/share/ca-certificates/corpX-PDC-CA.crt server# rm /etc/ssl/certs/corpX-PDC-CA.pem server# update-ca-certificates ===== Создание центра сертификации ===== * [[http://gagravarr.org/writing/openssl-certs/ca.shtml|Certificate Management and Generation with OpenSSL]] * [[http://www.opennet.ru/base/sec/ssl_cert.txt.html|Авторизация с помощью клиентских SSL сертификатов]] * [[https://arminreiter.com/2022/01/create-your-own-certificate-authority-ca-using-openssl/|Create your own Certificate Authority (CA) using OpenSSL]] * [[https://www.golinuxcloud.com/openssl-ca-vs-openssl-x509-comparison/|openssl ca vs openssl x509 comparison]] ==== Зачем может понадобиться свой УЦ? ==== * [[https://community.letsencrypt.org/t/can-i-create-client-certificates-for-a-received-letsencrypt-certificate/78627|Can I create client certificates for a received LetsEncrypt certificate?]] ==== Синхронизация времени ==== * [[Сервис NTP]] ==== Настройка атрибутов базы CA в конфигурации ssl ==== * [[https://unix.stackexchange.com/questions/313216/openssl-sign-requests-with-extensions|OpenSSL sign requests with extensions]] lan# cat /etc/ssl/openssl.cnf ... [ CA_default ] dir = /root/CA ... #unique_subject = no ... #copy_extensions = copy ... certificate = /var/www/html/ca.crt crl = /var/www/html/ca.crl private_key = $dir/ca.key [ policy_match ] ... cd mkdir -p /var/www/html/ mkdir CA mkdir CA/certs mkdir CA/newcerts mkdir CA/crl touch CA/index.txt echo "01" > CA/serial echo "01" > CA/crlnumber ==== Создание зашифрованного приватного ключа ==== lan# openssl genrsa -des3 -out CA/ca.key 2048 Generating RSA key, 2048 bits Enter PEM pass phrase:Pa$$w0rd Verifying - Enter PEM pass phrase:Pa$$w0rd ==== Настройка атрибутов организации в конфигурации ssl ==== lan# cat /etc/ssl/openssl.cnf ... [ req_distinguished_name ] ... countryName_default = RU stateOrProvinceName_default = Moscow region localityName_default = Moscow 0.organizationName_default = cko organizationalUnitName_default = noc emailAddress_default = noc@corpX.un [ req_attributes ] ... ==== Создание самоподписанного корневого сертификата ==== lan# openssl req -new -x509 -days 3650 -key CA/ca.key -out /var/www/html/ca.crt Enter pass phrase for ca.key:Pa$$w0rd ... Common Name (eg, YOUR name) []:corpX.un ==== Инициализация списка отозванных сертификатов ==== lan# openssl ca -gencrl -out /var/www/html/ca.crl Enter pass phrase for ./CA/ca.key:Pa$$w0rd ===== Создание сертификата сервиса, подписанного CA ===== ==== Создание приватного ключа сервиса ==== www# openssl genrsa -out www.key 2048 ==== Создание запроса на сертификат ==== * *.corpX.un для wild card сертификата lan# scp /etc/ssl/openssl.cnf www:/etc/ssl/ www# openssl req -new -key www.key -out www.req #-sha256 ... Common Name (eg, YOUR name) []:www.corpX.un ... === Добавление расширений в запрос на сертификат === # cat /etc/ssl/openssl.cnf ... [ req ] ... req_extensions = v3_req [ req_distinguished_name ] ... [ v3_req ] ... subjectAltName = @alt_names [ alt_names ] DNS.1 = corpX.un DNS.2 = www.corpX.un #DNS.1 = *.corpX.un ==== Передача и просмотр содержимого запроса на сертификат ==== www# scp www.req lan: lan# openssl req -text -noout -in www.req ==== Подпись запроса на сертификат центром сертификации ==== lan# openssl ca -days 365 -in www.req -out www.crt # -extfile www.ext lan# cat CA/index.txt lan# ls CA/newcerts/ === Добавление расширений при подписи запроса на сертификат === # cat www.ext subjectAltName = @alt_names [alt_names] DNS.1 = corpX.un DNS.2 = www.corpX.un #DNS.1 = *.corpX.un ==== Копирование подписанного сертификата на целевой сервер ==== lan# scp www.crt www: www# rm www.req ==== Проверка подписи сертификата ==== * [[#Просмотр содержимого файла сертификата]] www# wget http://lan.corpX.un/ca.crt www# openssl verify -CAfile ca.crt www.crt ==== Проверка соответствия ключа и сертификата ==== $ openssl x509 -noout -modulus -in www.crt | openssl md5 $ openssl rsa -noout -modulus -in www.key | openssl md5 ==== Шифрование ключа сервера ==== www# openssl rsa -des3 -in www.clkey -out www.enckey ===== Создание пользовательского сертификата, подписанного CA ===== ==== Создание приватного ключа пользователя ==== $ openssl genrsa -out user1.key 2048 ==== Создание запроса на сертификат ==== $ openssl req -new -key user1.key -out user1.req ... Organizational Unit Name (eg, section) [noc]:group1 Common Name (eg, YOUR name) []:user1 Email Address [noc@corpX.un]:user1@corpX.un ... ИЛИ $ openssl req -new -key user1.key -out user1.req -subj '/C=RU/ST=Moscow region/L=Moscow/O=cko/OU=group1/CN=user1/emailAddress=user1@corpX.un/' ==== Подпись запроса на сертификат центром сертификации ==== lan# openssl ca -days 365 -in user1.req -out user1.crt lan# cat CA/index.txt lan# ls CA/newcerts/ ==== Оформление сертификата и ключа в формате PKS#12 с парольной защитой ==== !!! Сразу импортировать в хранилище сертификатов на клиенте !!! $ openssl pkcs12 -export -in user1.crt -inkey user1.key -out user1.p12 -passout pass:ppassword1 openssl3# openssl pkcs12 -legacy -export -in user1.crt -inkey user1.key -out user1.p12 -passout pass:ppassword1 $ openssl pkcs12 -info -in user1.p12 ===== Отзыв сертификатов ===== lan# less CA/index.txt lan# openssl ca -revoke CA/newcerts/02.pem lan# less CA/index.txt lan# openssl ca -gencrl -out /var/www/html/ca.crl lan# openssl crl -text -noout -in /var/www/html/ca.crl | less ... Serial Number: 0M ... Serial Number: 0N ...