Статус: Новичок
Группы: Участники
Зарегистрирован: 13.08.2025(UTC) Сообщений: 4  Откуда: Могилев
|
Добрый день. Развернул на centOS 9 КриптоПро CSP 5.0, а так же подключил библиотеку phpcades. В процессе формирования подписи тестовым скриптом столкнулся с ошибкой A certificate chain could not be built to a trusted root authority. Список импортированных сертификатов из pfx: Код:1-------
Issuer : CN=Root CA, O=My Organization, C=RU, E=admin@example.com
Subject : CN=Root CA, O=My Organization, C=RU, E=admin@example.com
Serial : 0x3DD45948598679F0B8497059506F3EBC874B6707
SHA1 Thumbprint : 1c6c86fc85c086ffc8450d96b45dd167ad3f522e
SubjectKeyID : 1506955525d391021e68cfafee2a7885f8640505
Signature Algorithm : sha256RSA
PublicKey Algorithm : RSA (2048 bits)
Not valid before : 22/08/2025 11:37:18 UTC
Not valid after : 20/08/2035 11:37:18 UTC
PrivateKey Link : No
2-------
Issuer : CN=Root CA, O=My Organization, C=RU, E=admin@example.com
Subject : CN=Intermediate CA, O=My Organization, C=RU, E=intermediate@example.com
Serial : 0x20D438486944D01ACBDAE4DFE53A559F2FB6DBF2
SHA1 Thumbprint : 2ad50db69120d2e36d4a48bac999697669b8e365
SubjectKeyID : ef07a3bbd84ab779719d81281c4547a215c0f118
Signature Algorithm : sha256RSA
PublicKey Algorithm : RSA (2048 bits)
Not valid before : 22/08/2025 11:37:19 UTC
Not valid after : 21/08/2030 11:37:19 UTC
PrivateKey Link : No
3-------
Issuer : CN=Intermediate CA, O=My Organization, C=RU, E=intermediate@example.com
Subject : CN=user@example.com, O=My Organization, C=RU, E=user@example.com
Serial : 0x0EABD2455AD35FA7CBC9B171894485F2958A637E
SHA1 Thumbprint : 1d72770f8cda92c4490d4156026a719f149882c1
SubjectKeyID : cf199eee945587baecf77633696f019d7deef46f
Signature Algorithm : sha256RSA
PublicKey Algorithm : RSA (2048 bits)
Not valid before : 22/08/2025 11:37:21 UTC
Not valid after : 22/08/2026 11:37:21 UTC
PrivateKey Link : Yes
Container : HDIMAGE\\pfx-0712.000\8535
Provider Name : Crypto-Pro Enhanced RSA and AES KC1 CSP
Provider Info : Provider Type: 24, Key Spec: 1, Flags: 0x0
Extended Key Usage : 1.3.6.1.5.5.7.3.2 Проверка подлинности клиента
1.3.6.1.5.5.7.3.4 Защищенная электронная почта
4-------
Issuer : CN=Intermediate CA, O=My Organization, C=RU, E=intermediate@example.com
Subject : CN=user@example.com, O=My Organization, C=RU, E=user@example.com
Serial : 0x0EABD2455AD35FA7CBC9B171894485F2958A637E
SHA1 Thumbprint : 1d72770f8cda92c4490d4156026a719f149882c1
SubjectKeyID : cf199eee945587baecf77633696f019d7deef46f
Signature Algorithm : sha256RSA
PublicKey Algorithm : RSA (2048 bits)
Not valid before : 22/08/2025 11:37:21 UTC
Not valid after : 22/08/2026 11:37:21 UTC
PrivateKey Link : Yes
Container : HDIMAGE\\pfx-0712.000\8535
Provider Name : Crypto-Pro Enhanced RSA and AES KC1 CSP
Provider Info : Provider Type: 24, Key Spec: 1, Flags: 0x0
Extended Key Usage : 1.3.6.1.5.5.7.3.2 Проверка подлинности клиента
1.3.6.1.5.5.7.3.4 Защищенная электронная почта
=============================================================================
сертификаты формирую тестовые с помощью скрипта Код:#!/bin/bash
# Скрипт для генерации цепочки сертификатов для КриптоПРО
set -e
# Цвета для вывода
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Конфигурация
ROOT_CA_DAYS=3650
INTERMEDIATE_DAYS=1825
USER_DAYS=365
KEY_SIZE=2048
DIGEST="sha256"
# Директории
CERTS_DIR="/home/bitrix/cryptopro_certs"
BACKUP_DIR="/home/bitrix/cryptopro_backup"
# Функции
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
exit 1
}
# Создание директорий
create_directories() {
mkdir -p "$CERTS_DIR"
mkdir -p "$BACKUP_DIR"
}
# Резервное копирование
backup_existing() {
if [ -d "$CERTS_DIR" ] && [ "$(ls -A $CERTS_DIR)" ]; then
timestamp=$(date +%Y%m%d_%H%M%S)
backup_path="$BACKUP_DIR/certs_$timestamp"
mkdir -p "$backup_path"
cp -r "$CERTS_DIR"/* "$backup_path/"
log_info "Существующие сертификаты сохранены в: $backup_path"
fi
}
# Генерация корневого УЦ
generate_root_ca() {
log_info "Генерация корневого УЦ..."
cat > "$CERTS_DIR/root_ca.cnf" << EOF
[ req ]
default_bits = $KEY_SIZE
prompt = no
default_md = $DIGEST
distinguished_name = dn
x509_extensions = v3_ca
[ dn ]
CN = Root CA
O = My Organization
C = RU
emailAddress = admin@example.com
[ v3_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:TRUE
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
EOF
openssl req -newkey rsa:$KEY_SIZE -keyout "$CERTS_DIR/root_ca.key" \
-out "$CERTS_DIR/root_ca.csr" -config "$CERTS_DIR/root_ca.cnf" \
|| log_error "Ошибка генерации запроса корневого УЦ"
openssl x509 -req -days $ROOT_CA_DAYS -in "$CERTS_DIR/root_ca.csr" \
-signkey "$CERTS_DIR/root_ca.key" -out "$CERTS_DIR/root_ca.crt" \
-extfile "$CERTS_DIR/root_ca.cnf" -extensions v3_ca \
|| log_error "Ошибка подписания корневого сертификата"
log_info "Корневой УЦ создан: $CERTS_DIR/root_ca.crt"
}
# Генерация промежуточного УЦ
generate_intermediate_ca() {
log_info "Генерация промежуточного УЦ..."
cat > "$CERTS_DIR/intermediate.cnf" << EOF
[ req ]
default_bits = $KEY_SIZE
prompt = no
default_md = $DIGEST
distinguished_name = dn
x509_extensions = v3_ca
[ dn ]
CN = Intermediate CA
O = My Organization
C = RU
emailAddress = intermediate@example.com
[ v3_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:TRUE, pathlen:0
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
EOF
openssl req -newkey rsa:$KEY_SIZE -keyout "$CERTS_DIR/intermediate.key" \
-out "$CERTS_DIR/intermediate.csr" -config "$CERTS_DIR/intermediate.cnf" \
|| log_error "Ошибка генерации запроса промежуточного УЦ"
openssl x509 -req -days $INTERMEDIATE_DAYS -in "$CERTS_DIR/intermediate.csr" \
-CA "$CERTS_DIR/root_ca.crt" -CAkey "$CERTS_DIR/root_ca.key" -CAcreateserial \
-out "$CERTS_DIR/intermediate.crt" -extfile "$CERTS_DIR/intermediate.cnf" -extensions v3_ca \
|| log_error "Ошибка подписания промежуточного сертификата"
log_info "Промежуточный УЦ создан: $CERTS_DIR/intermediate.crt"
}
# Генерация пользовательского сертификата
generate_user_certificate() {
local common_name=${1:-"user@example.com"}
local cert_name=${2:-"user"}
log_info "Генерация сертификата для: $common_name"
cat > "$CERTS_DIR/$cert_name.cnf" << EOF
[ req ]
default_bits = $KEY_SIZE
prompt = no
default_md = $DIGEST
distinguished_name = dn
req_extensions = req_ext
[ dn ]
CN = $common_name
O = My Organization
C = RU
emailAddress = $common_name
[ req_ext ]
subjectAltName = email:$common_name
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth, emailProtection
EOF
# Генерация запроса
openssl req -newkey rsa:$KEY_SIZE -keyout "$CERTS_DIR/$cert_name.key" \
-out "$CERTS_DIR/$cert_name.csr" -config "$CERTS_DIR/$cert_name.cnf" \
|| log_error "Ошибка генерации запроса пользовательского сертификата"
# Подписание промежуточным УЦ
openssl x509 -req -days $USER_DAYS -in "$CERTS_DIR/$cert_name.csr" \
-CA "$CERTS_DIR/intermediate.crt" -CAkey "$CERTS_DIR/intermediate.key" -CAcreateserial \
-out "$CERTS_DIR/$cert_name.crt" -extfile "$CERTS_DIR/$cert_name.cnf" -extensions req_ext \
|| log_error "Ошибка подписания пользовательского сертификата"
log_info "Пользовательский сертификат создан: $CERTS_DIR/$cert_name.crt"
}
# Создание цепочки сертификатов
create_certificate_chain() {
local cert_name=${1:-"user"}
log_info "Создание цепочки сертификатов..."
# PEM цепочка
cat "$CERTS_DIR/$cert_name.crt" "$CERTS_DIR/intermediate.crt" "$CERTS_DIR/root_ca.crt" > "$CERTS_DIR/chain.pem"
# PKCS#7 цепочка
openssl crl2pkcs7 -nocrl -certfile "$CERTS_DIR/$cert_name.crt" \
-certfile "$CERTS_DIR/intermediate.crt" -certfile "$CERTS_DIR/root_ca.crt" \
-out "$CERTS_DIR/chain.p7b" 2>/dev/null || \
log_warn "PKCS#7 создан без дополнительных атрибутов"
# PFX архив
openssl pkcs12 -export -out "$CERTS_DIR/$cert_name.pfx" \
-inkey "$CERTS_DIR/$cert_name.key" -in "$CERTS_DIR/$cert_name.crt" \
-certfile "$CERTS_DIR/chain.pem" -password pass:"" \
|| log_error "Ошибка создания PFX архива"
log_info "Цепочка сертификатов создана:"
log_info " - PEM: $CERTS_DIR/chain.pem"
log_info " - PKCS#7: $CERTS_DIR/chain.p7b"
log_info " - PFX: $CERTS_DIR/$cert_name.pfx"
}
# Проверка цепочки
verify_chain() {
local cert_name=${1:-"user"}
log_info "Проверка цепочки сертификатов..."
# Создание временного файла с доверенными сертификатами
cat "$CERTS_DIR/root_ca.crt" "$CERTS_DIR/intermediate.crt" > "$CERTS_DIR/trusted.crt"
# Проверка цепочки
openssl verify -CAfile "$CERTS_DIR/trusted.crt" "$CERTS_DIR/$cert_name.crt" \
&& log_info "Проверка цепочки успешно завершена" \
|| log_error "Ошибка проверки цепочки сертификатов"
rm -f "$CERTS_DIR/trusted.crt"
}
# Отображение информации о сертификате
show_certificate_info() {
local cert_file="$1"
local cert_name="$2"
echo -e "\n${YELLOW}=== Информация о $cert_name ===${NC}"
openssl x509 -in "$cert_file" -noout -subject -issuer -dates
echo ""
}
# Основная функция
main() {
local common_name=""
local cert_name="user"
# Парсинг аргументов
while [[ $# -gt 0 ]]; do
case $1 in
-n|--name)
common_name="$2"
shift 2
;;
-c|--cert-name)
cert_name="$2"
shift 2
;;
-h|--help)
echo "Использование: $0 [--name email] [--cert-name name]"
echo " --name Email для сертификата (по умолчанию: user@example.com)"
echo " --cert-name Имя файлов сертификата (по умолчанию: user)"
exit 0
;;
*)
echo "Неизвестный аргумент: $1"
exit 1
;;
esac
done
common_name=${common_name:-"user@example.com"}
log_info "Начало генерации цепочки сертификатов"
log_info "Пользователь: $common_name"
log_info "Имя сертификата: $cert_name"
create_directories
backup_existing
generate_root_ca
generate_intermediate_ca
generate_user_certificate "$common_name" "$cert_name"
create_certificate_chain "$cert_name"
verify_chain "$cert_name"
# Показ информации о сертификатах
show_certificate_info "$CERTS_DIR/root_ca.crt" "Root CA"
show_certificate_info "$CERTS_DIR/intermediate.crt" "Intermediate CA"
show_certificate_info "$CERTS_DIR/$cert_name.crt" "User Certificate"
log_info "Генерация завершена успешно!"
log_info "Все файлы сохранены в директории: $CERTS_DIR"
echo -e "${YELLOW}Важные файлы:${NC}"
echo -e " • Закрытые ключи: .key файлы"
echo -e " • Сертификаты: .crt файлы"
echo -e " • Цепочка: chain.pem, chain.p7b"
echo -e " • PFX архив: $cert_name.pfx"
echo -e "${YELLOW}Внимание: сохраните закрытые ключи в безопасном месте!${NC}"
}
# Запуск скрипта
main "$@"
Буду благодарен любой помощи
|