Вопрос или проблема
Я хочу сгенерировать самоподписанный сертификат с SHA256 или SHA512, но у меня возникают проблемы с этим. Я создал скрипт, который должен выполнять это автоматически:
#!/bin/bash
set -e
echo "WORKSPACE: $WORKSPACE"
SSL_DIR=$(pwd)/httpd_ssl_certs
OPENSSL_CNF=$(pwd)/openssl.cnf
if [ -d "$SSL_DIR" ]; then
rm -rvf "$SSL_DIR"
fi
mkdir -vp "$SSL_DIR"
pushd "$SSL_DIR"
# проверить, существует ли openssl.cnf
if [ ! -f "$OPENSSL_CNF" ]; then
echo "Не удалось найти $OPENSSL_CNF. Сборка будет завершена."
exit 1
fi
echo " - создание приватного ключа"
openssl genrsa -out server.key.template 2048
echo " - создание запроса на подпись"
openssl req -nodes -new -sha256 -config $OPENSSL_CNF -key server.key.template -out server.csr.template
echo " - создание сертификата"
openssl x509 -req -in server.csr.template -signkey server.key.template -out server.crt.template -extfile $OPENSSL_CNF
И у меня есть файл openssl.cnf
с конфигурацией для этого:
[ ca ]
default_ca = CA_default
[ CA_default ]
# срок действия сертификата
default_days = 365
# срок действия следующего CRL
default_crl_days = 30
# использовать алгоритм хеширования по умолчанию для публичного ключа
default_md = sha256
# сохранять порядок DN
preserve = no
policy = policy_anything
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = optional
emailAddress = optional
[ req ]
default_bits = 2048
default_keyfile = server.key.template
distinguished_name = req_distinguished_name
prompt = no
encrypt_key = no
# добавить default_md в [ req ] для создания сертификатов с SHA256
default_md = sha256
[ req_distinguished_name ]
countryName = "AB"
stateOrProvinceName = "CD"
localityName = "Некоторый город"
organizationName = "XXX Y"
organizationalUnitName = "XXX Y"
commonName = "localhost"
emailAddress = "[email protected]"
Когда я запускаю скрипт с этим openssl.cnf, я получаю сертификат, но этот сертификат всегда зашифрован с помощью SHA1. Я проверяю это с помощью этой команды: openssl x509 -in server.crt.template -text -noout | grep 'Signature
. Я всегда получаю этот вывод:
Алгоритм подписи: sha1WithRSAEncryption
Алгоритм подписи: sha1WithRSAEncryption
Может кто-нибудь подскажет, в чем здесь ошибка?
Ниже приведены мои заметки по созданию, хоть и не самих сертификатов, запроса на подпись сертификата (CSR) с помощью openssl.
Синтаксис с заполнителями выглядит следующим образом:
openssl req -new -newkey rsa:4096 -sha256 -nodes -out
{DOMAIN.TLD}.rsa.csr -keyout {DOMAIN.TLD}.rsa.pkey -subj
“/C={US}/ST={STATE||PROVENCE}/L={CITY}/O={COMPANY-NAME}/CN={DOMAIN.TLD}”
Это точная команда, которую я использовал для создания своего собственного CSR, который я предоставляю своему провайдеру SSL-сертификатов.
openssl req -new -newkey rsa:4096 -sha256 -nodes -out rustbeltrebellion.com.csr -keyout rustbeltrebellion.rsa.pkey -subj "/C=US/ST=OHIO/L=EASTLAKE/O=RUSTBELTREBELLION/CN=RUSTBELTREBELLION.COM"
Преимущество CSR заключается в том, что ваш приватный ключ остается более закрытым. Я знаю только два способа создания сертификата — пропустить ваш приватный ключ через библиотеку openssl или ваш CSR через библиотеку openssl. Оба дают функционально идентичный сертификат, когда все завершено. Один позволяет вашему приватному ключу оставаться закрытым (это делает CSR).
Ответ или решение
Создание самоподписанного сертификата с использованием алгоритма SHA256 или SHA512 может вызывать определённые сложности, особенно если при этом постоянно получается сертификат с использованием устаревшего SHA1. Разберём основные проблемы, которые могут возникать при создании сертификата, и предлагаемые решения.
Теория
Когда создаются самоподписанные сертификаты, важно определить алгоритм, который будет использоваться для цифровой подписи. На сегодняшний день алгоритмы SHA256 и SHA512 являются предпочтительными для большей безопасности, это связано с тем, что SHA1 считается устаревшим и уже не предоставляет надёжной защиты от криптографических атак.
Общий процесс создания самоподписанного сертификата включает следующие шаги:
-
Генерация приватного ключа: Это ключ, который останется в вашем распоряжении и не передаётся в открытый доступ.
-
Создание запроса на подпись сертификата (CSR): Этот запрос содержит информацию о владельце сертификата и, как правило, подписывается приватным ключом.
-
Подписывание сертификата: Это шаг, на котором создаётся сам подписывающийся сертификат. Алгоритм, указанный в этом процессе, определяет уровень безопасности сертификата.
Пример
В предоставленном вами случае используется скрипт на Bash, который автоматизирует процесс создания сертификата. Скрипт использует OpenSSL для выполнения всех необходимых команд:
-
Создание приватного ключа:
openssl genrsa -out server.key.template 2048
-
Создание запроса на подпись (CSR):
openssl req -nodes -new -sha256 -config $OPENSSL_CNF -key server.key.template -out server.csr.template
Здесь отмечено использование SHA256, однако это только при создании CSR и не гарантирует использование SHA256 в самом сертификате.
-
Создание и подпись сертификата:
openssl x509 -req -in server.csr.template -signkey server.key.template -out server.crt.template -extfile $OPENSSL_CNF
Проблема выражается в том, что в процессе создания самого сертификата всё равно используется SHA1. Посмотрим, какие изменения могут внести корректировки для получения сертификата с SHA256 или SHA512.
Применение и решение
Чтобы устранить проблему с использованием SHA1 вместо SHA256 или SHA512, необходимо выразительно указать желаемый алгоритм в процессе создания сертификата.
Рассмотрим следующее:
-
Прямое указание алгоритма при создании сертификата.
При генерации подписи сертификата можно установить алгоритм следящим аргументом:openssl x509 -req -in server.csr.template -signkey server.key.template -out server.crt.template -extfile $OPENSSL_CNF -sha256
Здесь ключевой момент – это добавление
-sha256
, что указывает OpenSSL использовать алгоритм SHA256 в процессе подписания. -
Обновление конфигурационного файла OpenSSL.
Убедитесь, что в вашемopenssl.cnf
файле параметрdefault_md
установлен в значениеsha256
как для[req]
, так и для[ca]
конфигураций (если используются). Это дополнительно сделает использование SHA256 по умолчанию. -
Проверка версии OpenSSL.
Убедитесь, что ваша версия OpenSSL обновлена до актуальной, так как более старые версии могут иметь ограничения в поддержке более современных алгоритмов.
Следуя данному руководству, возможно удастся создать сертификаты с более стойким алгоритмом хэширования. Это не только закроет описанную вами проблему, но и улучшит общую безопасность системы, которой сертификат будет обслуживать.
Применение даных шагов в вашем скрипте поможет вам улучшить процесс генерации сертификатов и обеспечить результат, соответствующий современным стандартам в области безопасности.