Содержание

OpenSSL

Показать сертификат:

openssl x509 -text -noout -in certificate.crt 

Проверить pfx или p12:

openssl pkcs12 -info -noout -in certificate.pfx

Показать все сертификаты:

openssl storeutl -noout -text -certs certificate.ca-bundle

Показать fingerprint сертификата:

openssl x509 -in certificate.crt -noout -fingerprint #-sha256
openssl pkcs12 -in certificate.pfx -info -nokeys | openssl x509 -noout -fingerprint

Проверка

Cоответствие сертификата и ключа

md5 хэш модуля ключа:

openssl rsa -noout -modulus -in selfsigned.key | openssl md5 #rsa
openssl pkey -pubout -in selfsigned.key | openssl md5 #rsa,ecc

md5 хэш модуля сертификата:

openssl x509 -noout -modulus -in selfsigned.crt | openssl md5 #rsa
openssl x509 -noout -pubkey -in selfsigned.crt | openssl md5 #rsa,ecc

md5 хэш модуля запроса:

openssl req -noout -modulus -in selfsigned.csr | openssl md5 #rsa
openssl req -noout -pubkey -in selfsigned.csr | openssl md5 #rsa,ecc

Если полученные md5 хэши одинаковы — значит файлы (crt, key и csr) соответствую друг другу.

Цепочка сертификатов

Цепочка AAACertificateServices.crt < USERTrustECCAAACA.crt < SectigoECCDomainValidationSecureServerCA.crt < domain.crt:

openssl verify -CAfile AAACertificateServices.crt -untrusted USERTrustECCAAACA.crt -untrusted SectigoECCDomainValidationSecureServerCA.crt domain.crt

Цепочка ca.crt < chain.crt < domain.crt:

openssl verify -CAfile ca.crt -untrusted chain.crt domain.crt

Цепочка ca-bundle.crt (сверху chain.crt, снизу ca.crt) < domain.crt:

openssl verify -CAfile ca-bundle.crt domain.crt

PFX

openssl pkcs12 -in domain.pfx -info -nokeys

Cамоподписанный ключ и сертификат

Выпустить ключ и сертифкат в текущей директории:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout registry.git.domain.com.key -out registry.git.domain.com.crt -subj '/C=RU/ST=Ural/L=Chelyabins/O=DKB/OU=IT/CN=registry.git.domain.com'

или с минимум значений subject, остальные берутся из openssl.conf:

  1. subj '/CN=registry.git.domain.com'

Ключ DH

Выпустить ключ Diffie Hellman:

openssl dhparam -out dhparams.pem 2048

Конвертирование

Создать pfx из crt и key:

openssl pkcs12 -export -out cert.pfx -inkey cert.key -in cert.crt

для старых ОС (Windows 2012R2)

openssl pkcs12 -export -certpbe PBE-SHA1-3DES -keypbe PBE-SHA1-3DES -nomac -out cert.pfx -inkey cert.key -in cert.crt

Создать pfx из crt, CA.crt и key:

openssl pkcs12 -export -out cert.pfx -inkey cert.key -in cert.crt -certfile cert.ca-bundle

Создать crt из p7b:

openssl pkcs7 -print_certs -in cert.p7b -out cert.crt

Создать crt из pfx:

openssl pkcs12 -in cert.pfx -clcerts -nokeys -out cert.crt

Создать rsa key из pfx:

openssl pkcs12 -in cert.pfx -nocerts -nodes | openssl rsa -out rsapriv.key

Объединить crt и ca_bundle (важна очерёдность):

cat cert.crt cert.ca-bundle > domain.crt

Создать der из pem:

openssl x509 -outform der -in crt.pem -out crt.der

https://www.ryadel.com/en/openssl-convert-ssl-certificates-pem-crt-cer-pfx-p12-linux-windows/#From_PEM_pem_cer_crt_to_PKCS12_p12_pfx

Зашифровать паролем

Зашифровать:

tar cz /folder | openssl enc -aes-256-cbc -pbkdf2 -pass pass:1 -e > folder.tgz.enc

Расшифровать:

openssl enc -aes-256-cbc -in folder.tgz.enc -pbkdf2 -pass pass:1 -d | tar xz

Проверить SSL/TLS сайта

Показать дату истечения сертификата сайта:

SITE=google.com
echo | openssl s_client -connect $SITE:443 -servername $SITE 2>/dev/null | openssl x509 -noout -dates 2>/dev/null | grep notAfter | cut -d'=' -f2

Показать используемые cipherSuites:

nmap --script ssl-enum-ciphers -p 443 domain.com

docker

Запустить контейнер с передачей имени сайта в параметре:

docker run --rm drwetter/testssl.sh google.com

android

  1. Установить с маркета приложение Ping & Net
  2. В поле «Select Host» написать название сайта для тестирования
  3. Нажимать кнопку «SSL Scan»
  4. В окне «SSL Scan Options» отметить:
    • Show certificate chain ☑
    • Show available ciphers ☑
    • Port number 443
    • Не отмечать: Use SNI ☐
  5. Нажать «OK»

PKI

Корневой ЦС

Создать структуру директорий:

mkdir /root/ca/
cd /root/ca
mkdir certs private
touch index.txt
echo 01 > serial
echo 01 > crlnumber

/root/ca/openssl.cnf

/root/ca/openssl.cnf

[ ca ]
default_ca      = CA_default
 
[ CA_default ]
dir             = /root/ca
certs           = $dir/certs
database        = $dir/index.txt
new_certs_dir   = $dir/certs
certificate     = $dir/certs/cacert.pem
serial          = $dir/serial
crlnumber       = $dir/crlnumber
private_key     = $dir/private/cakey.pem
 
name_opt        = ca_default
cert_opt        = ca_default
 
default_days    = 365
default_crl_days= 30
default_md      = sha256
preserve        = no
policy          = policy_match
 
[ policy_match ]
countryName             = supplied
stateOrProvinceName     = optional
organizationName        = supplied
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional
 
[ policy_anything ]
countryName             = supplied
stateOrProvinceName     = optional
localityName            = optional
organizationName        = supplied
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional
 
[ req ]
default_bits            = 4096
default_md              = sha256
default_keyfile         = privkey.pem
distinguished_name      = req_distinguished_name
x509_extensions         = v3_ca
string_mask             = nombstr
 
[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
countryName_default             = US
countryName_min                 = 2
countryName_max                 = 2
organizationName                = Organization Name (eg, company)
organizationName_default        = Company Ltd
commonName                      = Common Name (eg, your name or your servers hostname)
commonName_max                  = 64
 
[ v3_ca ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical,CA:true
 
[ v3_intermediate_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:0
keyUsage = critical, digitalSignature, cRLSign, keyCertSign


Раздел [ca] - обязательный первый раздел с указанием раздела ЦС по умолчанию.
Раздел [ policy_match ] будет применяться для создания сертификатов корневого центра сертификации и [ policy_anything ] для создания сертификатов промежуточного центра сертификации.

Значения в разделе [ req ] применяются при создании запросов на подпись сертификатов (CSR) или сертификатов. Ключ x509_extensions указывает имя раздела, содержащего расширения, которые мы хотим включить в сертификат.
В [ req_distinguished_name ] значения по умолчанию.
[ v3_ca ] расширение для создания корневого сертификата ЦС и расширение [ v3_intermediate ] для промежуточного сертификата ЦС. Значение pathlen ограничивает создание дополнительных промежуточных центров сертификации в цепочке, 0 - последний промежуточный сертификат.

Создать пароль, закрытый ключ для корневого ЦС и проверить его:

cat /dev/urandom | tr -dc 'a-zA-Z0-9.,_=\-' | head -c 18 >.pwd
openssl genrsa -aes256 -passout file:.pwd -out private/cakey.pem 4096
openssl rsa -noout -text -in private/cakey.pem -passin file:.pwd | grep -i key

Вывод:

RSA Private-Key: (4096 bit, 2 primes)

Создать сертификат ЦС и посмотреть его:

openssl req -new -x509 -days 3650 -passin file:.pwd -config openssl.cnf -extensions v3_ca -key private/cakey.pem -out certs/cacert.pem
openssl x509 -noout -text -in certs/cacert.pem | head -n14

Промежуточный ЦС

Создать структуру директорий:

mkdir /root/ca/intermediate
mkdir intermediate/certs intermediate/csr intermediate/private
touch intermediate/index.txt
echo 01 > intermediate/serial
echo 01 > intermediate/crlnumber
cp openssl.cnf intermediate

Поменять в ~/ca/intermediate/openssl.cnf строки на:

dir             = /root/ca/intermediate
certificate     = $dir/certs/intermediate.cacert.pem
private_key     = $dir/private/intermediate.cakey.pem
policy          = policy_anything

Создать пароль, закрытый ключ для корневого ЦС и проверить его:

openssl genrsa -aes256 -passout file:.pwd -out intermediate/private/intermediate.cakey.pem 4096
openssl rsa -noout -text -in intermediate/private/intermediate.cakey.pem -passin file:.pwd | grep -i key

Вывод:

RSA Private-Key: (4096 bit, 2 primes)

Создать запрос на подписание сертификата промежуточного ЦС:

openssl req -new -sha256 -config intermediate/openssl.cnf -passin file:.pwd -key intermediate/private/intermediate.cakey.pem -out intermediate/csr/intermediate.csr.pem

Подписать, сгенерировать сертификат промежуточного ЦС и проверить:

openssl ca -config openssl.cnf -extensions v3_intermediate_ca -days 3650 -notext -batch -passin file:.pwd -in intermediate/csr/intermediate.csr.pem -out intermediate/certs/intermediate.cacert.pem
openssl verify -CAfile certs/cacert.pem intermediate/certs/intermediate.cacert.pem

Создать и проверить цепочку сертификатов:

cat intermediate/certs/intermediate.cacert.pem certs/cacert.pem > intermediate/certs/ca-chain-bundle.cert.pem
openssl verify -CAfile certs/cacert.pem intermediate/certs/ca-chain-bundle.cert.pem

https://www.golinuxcloud.com/openssl-create-certificate-chain-linux/

SAN

https://www.golinuxcloud.com/openssl-generate-csr-create-san-certificate/
http://wiki.cacert.org/FAQ/subjectAltName

ECC

Генерировать ключ:

openssl ecparam -out private.key -name prime256v1 -genkey

Создать запрос на сертификат / CSR:

openssl req -new -key private.key -out server.csr

Обязательные поля:

GOST

Установить библиотеки ГОСТ для openssl:

apt install libengine-gost-openssl

Проверить

Проверить

openssl engine gost -c -t
(gost) Reference implementation of GOST engine
 [gost89, gost89-cnt, gost89-cnt-12, gost89-cbc, kuznyechik-ecb, kuznyechik-cbc, kuznyechik-cfb, kuznyechik-ofb, kuznyechik-ctr, magma-ecb, kuznyechik-mgm, magma-cbc, magma-ctr, magma-ctr-acpkm, magma-ctr-acpkm-omac, magma-mgm, kuznyechik-ctr-acpkm, kuznyechik-ctr-acpkm-omac, magma-kexp15, kuznyechik-kexp15, md_gost94, gost-mac, md_gost12_256, md_gost12_512, gost-mac-12, magma-mac, kuznyechik-mac, kuznyechik-ctr-acpkm-omac, gost2001, id-GostR3410-2001DH, gost-mac, gost2012_256, gost2012_512, gost-mac-12, magma-mac, kuznyechik-mac, magma-ctr-acpkm-omac, kuznyechik-ctr-acpkm-omac]
     [ available ]
openssl engine
(dynamic) Dynamic engine loading support
(gost) Reference implementation of GOST engine


Добавить в начало файла /etc/ssl/openssl.cnf перед первым заголовком раздела в квадратных скобках:

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

openssl_conf = openssl_def

[openssl_def]
engines = engine_section

[engine_section]
gost = gost_section

[gost_section]
engine_id = gost
dynamic_path = /usr/lib/x86_64-linux-gnu/engines-3/gost.so
default_algorithms = ALL

Проверить

Проверить

openssl ciphers | tr ':' '\n' | grep GOST
GOST2012-MAGMA-MAGMAOMAC
GOST2012-KUZNYECHIK-KUZNYECHIKOMAC
LEGACY-GOST2012-GOST8912-GOST8912
IANA-GOST2012-GOST8912-GOST8912
GOST2001-GOST89-GOST89


Создать закрытый ключ с алгоритмом gost2012_256 и сертификат:

openssl genpkey -algorithm gost2012_256 -pkeyopt paramset:TCB -out ca.key
openssl req -new -x509 -md_gost12_256 -days 365 -key ca.key -out ca.cer \
  -subj "/C=RU/ST=Russia/L=Moscow/O=Organization/OU=Organization CA/CN=Organization CA Root"

Проверить

Проверить

openssl x509 -in ca.cer -text -noout
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            25:f0:6c:f5:fd:4a:70:7c:40:01:c9:b8:54:92:f4:c4:99:7d:85:7c
        Signature Algorithm: GOST R 34.10-2012 with GOST R 34.11-2012 (256 bit)
        Issuer: C = RU, ST = Russia, L = Moscow, O = Organization, OU = Organization CA, CN = Organization CA Root
        Validity
            Not Before: Jun 30 18:24:43 2025 GMT
            Not After : Jun 30 18:24:43 2026 GMT
        Subject: C = RU, ST = Russia, L = Moscow, O = Organization, OU = Organization CA, CN = Organization CA Root
        Subject Public Key Info:
            Public Key Algorithm: GOST R 34.10-2012 with 256 bit modulus
                Public key:
                   X:4E6FA79A52FADC40ABF2D386BD499A5182A95DE81DE2CCED882DDEE8849CFADF
                   Y:F73E365FC6925AC159090B28CB586CB89FDD80F8B7DEDE44E072F00C31D6C243
                Parameter set: GOST R 34.10-2012 (256 bit) ParamSet B
        X509v3 extensions:
            X509v3 Subject Key Identifier: 
                D5:DA:AA:3D:01:06:6C:DD:8D:D0:60:BB:48:44:9D:92:A0:00:57:3B
            X509v3 Authority Key Identifier: 
                D5:DA:AA:3D:01:06:6C:DD:8D:D0:60:BB:48:44:9D:92:A0:00:57:3B
            X509v3 Basic Constraints: critical
                CA:TRUE
    Signature Algorithm: GOST R 34.10-2012 with GOST R 34.11-2012 (256 bit)
    Signature Value:
        34:70:97:8b:0f:9f:4e:58:75:e0:65:05:53:9a:19:50:7e:16:
        76:85:d8:38:f5:7a:04:e0:89:93:4c:88:69:ef:54:3e:16:8f:
        f6:c1:80:05:51:30:1d:87:e3:00:88:62:28:4a:09:ec:0f:eb:
        ba:68:70:88:0d:a0:7e:fd:52:7b


Подписать документ test.txt

Подписать документ test.txt

openssl dgst -sign key.pem -engine gost test.txt | base64 | tr -d "\n"


https://github.com/gost-engine/engine
https://www.altlinux.org/ГОСТ_в_OpenSSL

Ошибки

error:1414D172:SSL routines:tls12_check_peer_sigalg:wrong signature type

Временное решение, установить libssl1.1_1.1.1h-1_amd64.deb, openssl_1.1.1h-1_amd64.deb и выполнить:

export OPENSSL_CONF=

чтобы игнорировать проблемный параметр в конфигурационном файле /usr/lib/ssl/openssl.cnf:

CipherString = DEFAULT@SECLEVEL=2

или поменять его на:

CipherString = DEFAULT@SECLEVEL=1

https://github.com/syldrathecat/nxtlauncher/issues/13
https://stackoverflow.com/questions/58342699/php-curl-curl-error-35-error1414d172ssl-routinestls12-check-peer-sigalgwr

Ссылки

https://www.ssllabs.com - Тестирование SSL и TLS соедиения
https://tls.imirhil.fr/ - Check SSL, TLS, SSH

https://ssl-config.mozilla.org/ (https://mozilla.github.io/server-side-tls/ssl-config-generator/) - Генератор SSL конфигурационных файлов для web серверов