====== Пакет 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
...