Содержание

OpenSSL

Разное

rand

Генерирует последовательность случайных байтов

  # Случайная строка (10 символов)
openssl rand -hex (base64) 10 

Работа с сертами

Можно получить/скачать сертификат с указанного сайта

  # Просмотреть сведения о сертификате
openssl s_client -connect deeplay.enterprise.slack.com:443
 
  # Для postgres
openssl s_client -starttls postgres -connect ip:port
 
  # Сохранить сведения в файл (экспорт)
echo -n | openssl s_client -connect site.ru:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/newfile.crt
 
  # Далее можно импортировать его например в Java
keytool -import -trustcacerts -keystore /usr/lib/jvm/bellsoft-java8-full.x86_64/jre/lib/security/cacerts \
   -storepass changeit -noprompt -alias slack_notify -file /tmp/slack_notify.crt
 
  # Узнать кто выдал сертификат
  # далее, по указанной ссылке можно скачать вышестоящий, просто wget
openssl x509 -in <certificate.pem> -text -noout | grep -i issuer
  # проверка какая то
openssl verify <certificate.pem>
 
  # Перчень установленных сертов в системе
awk -v cmd='openssl x509 -noout -subject' ' /BEGIN/{close(cmd)};{print | cmd}' < /etc/ssl/certs/ca-certificates.crt

Cheat Sheet

# Просмотр сведений
openssl x509 -in server.crt -text -noout
openssl x509 -in server.cer -text -noout
 
# Проверка закрытого ключа
openssl rsa -in server.key -check

keytool gui утилита

  # Содержимое хранилища
keytool -list [-v] -keystore kafka.keystore.p12 (или .jks) [-storepass passwd]
  # Экспорт содержащегося серта в файл
keytool -exportcert -keystore kafka.keystore.p12 -alias myCert -file toFile.cer
  # Импорт
keytool -importcert -keystore kafka.keystore.jks -alias first -file first.cer
  # Для создания нового контейнера, нужно просто указать несуществующий файл, создастся
 
  # Удаление серта
keytool -delete -alias <my-name> -keystore <my-name>
:!: Про jks

Работа с контейнером для джавы
Есть пароль для контейнера, есть пароли для сертов, могут совпадать, тогда меньше гемора
Бывает так что показывает только те серты, что подходт под введенный пароль
При запуске джарки, есть такие аргументы для задания параметров

  1. Djavax.net.ssl.keyStore=cert.jks
  2. Djavax.net.ssl.keyStorePassword=changeit
  3. Djavax.net.ssl.trustStor=cacerts
  4. Djavax.net.ssl.trustStorePassword=changeit

Установка сертификата

trust list
sudo cp mycert.crt /usr/share/pki/ca-trust-source/anchors/
sudo update-ca-trust
 
	# debian
sudo cp mycert.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates

Форматы

:!: PEM

PEM - наиболее распространенный формат для X.509 сертификаты, CSRи криптографические ключи. Файл PEM представляет собой текстовый файл, может содержать сертификат конечного объекта, закрытый ключ или несколько сертификатов
PEM файлы обычно видны с расширениями .crt, .pem, .cer, и .key (для закрытых ключей), возможно и что нить типа «.ca-bundle»

Выглядит например так

-----BEGIN CERTIFICATE-----
MIIH/TCCBeWgAwIBAgIQaBYE3/M08XHYCnNVmcFBcjANBgkqhkiG9w0BAQsFADBy
MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0b24x
(...)
-----END CERTIFICATE-----

Примеры

:!: Генерация самоподписанного ключа
#!/bin/bash
 
mkdir -p certs
cd certs
 
# create self signed root CA
openssl genrsa -out test_ca.key 4096
openssl req -x509 -new -nodes -key test_ca.key -sha256 -days 1024 -subj "/C=RU/ST=SR/O=Org Test Root CA, Inc./CN=Test Root CA" -out test_ca.crt
 
 
# create test key and csr for app
openssl genrsa -out test_app.key 4096
openssl req -new -sha256 -key test_app.key -subj "/C=RU/ST=SR/O=Org Test APP, Inc./CN=client.app.org" -out test_app.csr
 
# sign test cert by CA for APP
openssl x509 -req -in test_app.csr -CA test_ca.crt -CAkey test_ca.key -CAcreateserial -out test_app.crt -days 3650 -sha256
 
echo "DONE!"
:!: Генерация, подпись, сбор в комплекты

Для подписи используем сторонний ЦС, на своей стороне, с помощью файла «req», формируем закрытый ключ и запрос на подпись
После получаем подписанный, открытый ключ, далее собираем в ключевую пару и JKS-ники
Корневой сертификат так же получаем от ЦС

# Из файла с запросом генерируем закрытый ключ
openssl req -new -newkey rsa:2048 -keyout my_cert.key -out my_cert.csr -config req.txt
 
# ==== Подпись, генерация открытого ключа ====
 
# Из закрытого, открытого и корневого сертов, генерируем ключевую пару (.p12)
openssl pkcs12 -export -in my_cert.crt -inkey my_cert.key -out my_cert.p12 -name SARM_PD10 -CAfile my_cert_ca.crt -caname MY.RU -passout pass:123
 
# Из ключевой пары генерируем JKS
keytool -importkeystore -srckeystore my_cert.p12 -srcstoretype PKCS12 -destkeystore my_cert.jks -deststoretype JKS -alias "MYCERT" -destalias "MYCERT" -srcstorepass 123 -deststorepass 123
 
# Из корневого ключа генерируем Truststore
keytool -import -alias MYCERT -file my_cert_ca.crt -keystore my_cert_truststore.jks -noprompt -deststorepass 123 -deststoretype JKS

Пример файла с запросом

[req]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
prompt = no

[req_distinguished_name]
C = RU
O = MY_COMP
commonName = example.ru

[req_ext]
subjectAltName = @alt_names
keyUsage=digitalSignature, keyEncipherment
extendedKeyUsage=serverAuth

[alt_names]
DNS.1 = first.example.ru
DNS.2 = second.example.ru
DNS.3 = *.example.ru