Гайд по настройке Рутокен ЭЦП в Red OS 8: pam_pkcs11 «No matching certificate found» - Часть 2
5. Достаньте сертификат и проверьте его вручную
Сначала посмотрите список сертификатов:
pkcs11-tool --module "$RUTOKEN_MOD" --login --list-objects --type cert
Найдите ID сертификата, например 01, затем сохраните его:
pkcs11-tool --module "$RUTOKEN_MOD" --login --read-object --type cert --id 01 --output-file /tmp/rutoken-cert.der
Если ID другой, замените 01.
Преобразуйте в PEM:
openssl x509 -inform DER -in /tmp/rutoken-cert.der -out /tmp/rutoken-cert.pem
Посмотрите данные сертификата:
openssl x509 -in /tmp/rutoken-cert.pem -noout -text | less
Проверьте срок действия:
openssl x509 -in /tmp/rutoken-cert.pem -noout -dates
date
Если системное время неверное, сертификат может казаться недействительным:
timedatectl
sudo timedatectl set-ntp true
Проверьте расширения:
openssl x509 -in /tmp/rutoken-cert.pem -noout -text | grep -A3 -iE 'Key Usage|Extended Key Usage|Basic Constraints'
Для входа по смарт-карте обычно желательно наличие:
X509v3 Key Usage:
Digital Signature
X509v3 Extended Key Usage:
TLS Web Client Authentication
Иногда может использоваться также Smart Card Logon или другие клиентские EKU. Если сертификат выдан только для подписи документов и не имеет клиентской аутентификации, pam_pkcs11 может его отвергнуть.
Если openssl не может нормально прочитать сертификат и ругается на неизвестные алгоритмы, вероятно, сертификат ГОСТ. Об этом отдельно ниже.
6. Проверьте цепочку доверия
pam_pkcs11 может требовать, чтобы сертификат был подписан доверенным УЦ.
Создайте каталог для корневых и промежуточных сертификатов:
sudo mkdir -p /etc/pam_pkcs11/cacertificates
sudo mkdir -p /etc/pam_pkcs11/crl
Положите туда сертификаты УЦ в формате PEM.
Если у вас файлы .cer или .crt в DER, конвертируйте:
openssl x509 -inform DER -in root_ca.cer -out root_ca.pem
openssl x509 -inform DER -in intermediate_ca.cer -out intermediate_ca.pem
Скопируйте в каталог:
sudo cp root_ca.pem /etc/pam_pkcs11/cacertificates/
sudo cp intermediate_ca.pem /etc/pam_pkcs11/cacertificates/
sudo chmod 644 /etc/pam_pkcs11/cacertificates/*.pem
Сделайте хэшированные ссылки:
sudo openssl rehash /etc/pam_pkcs11/cacertificates
или:
sudo c_rehash /etc/pam_pkcs11/cacertificates
Проверьте, что появились ссылки вида *.0:
ls -l /etc/pam_pkcs11/cacertificates
Проверьте цепочку вручную:
openssl verify -CApath /etc/pam_pkcs11/cacertificates /tmp/rutoken-cert.pem
Если есть промежуточный УЦ, он тоже должен быть добавлен. Если цепочка не собирается, pam_pkcs11 может выдать именно no valid certificate.
Если используется CRL, положите CRL в /etc/pam_pkcs11/crl в PEM и выполните:
sudo openssl rehash /etc/pam_pkcs11/crl
Если CRL нет или он недоступен, проверка отзыва может мешать. Для диагностики можно временно отключить verify, но об этом ниже.
7. Настройте /etc/pam_pkcs11/pam_pkcs11.conf
Сделайте резервную копию старого конфига:
sudo cp -a /etc/pam_pkcs11/pam_pkcs11.conf /root/pam_pkcs11.conf.backup 2>/dev/null || true
Пример рабочего конфига для Рутокен ЭЦП:
sudo tee /etc/pam_pkcs11/pam_pkcs11.conf > /dev/null <<'EOF'
pam_pkcs11 {
use_pkcs11_module = "rutoken";
pkcs11_module rutoken {
module = /usr/lib64/librtpkcs11ecp.so;
description = "Rutoken ECP";
# Если слотов несколько, можно указать нужный.
# Обычно лучше сначала оставить без slot_num.
# slot_num = 0;
}
# Оставим пока только subject-маппинг, чтобы исключить лишние мапперы.
use_mappers = "subject";
mapper subject {
mapfile = /etc/pam_pkcs11/subject_mapping;
}
# ВНИМАНИЕ: для диагностики сначала можно поставить verify = false.
# После успешного входа нужно вернуть verify = true и настроить УЦ.
verify = false;
ca_dir = /etc/pam_pkcs11/cacertificates;
crl_dir = /etc/pam_pkcs11/crl;
}
EOF
Если у вас библиотека лежит не в /usr/lib64/librtpkcs11ecp.so, исправьте строку:
module = /usr/lib64/librtpkcs11ecp.so;
на реальный путь, например:
module = /usr/lib/librtpkcs11ecp.so;
Проверьте права:
sudo chown root:root /etc/pam_pkcs11/pam_pkcs11.conf
sudo chmod 644 /etc/pam_pkcs11/pam_pkcs11.conf
8. Сопоставьте сертификат локальному пользователю
Ошибка No matching certificate found очень часто возникает именно потому, что сертификат не привязан к пользователю.
Создайте файл маппинга:
sudo touch /etc/pam_pkcs11/subject_mapping
sudo chown root:root /etc/pam_pkcs11/subject_mapping
sudo chmod 644 /etc/pam_pkcs11/subject_mapping
Формат обычно такой:
<точный subject сертификата> = <локальный пользователь>
Получите subject:
openssl x509 -in /tmp/rutoken-cert.pem -noout -subject
Пример вывода:
subject=C = RU, O = Example, CN = Ivan Petrov
Но для pam_pkcs11 важен именно тот формат, который ожидает и логирует модуль.
Поэтому лучше всего брать строку из отладочного лога pam_pkcs11, но для первого шага можно добавить так:
SUBJECT=$(openssl x509 -in /tmp/rutoken-cert.pem -noout -subject | sed 's/^subject=//')
echo "$SUBJECT = ivan" | sudo tee -a /etc/pam_pkcs11/subject_mapping
Замените ivan на нужного пользователя.
Проверьте содержимое:
cat /etc/pam_pkcs11/subject_mapping
Пример:
C = RU, O = Example, CN = Ivan Petrov = ivan
Если subject в старом формате может выглядеть так:
/C=RU/O=Example/CN=Ivan Petrov = ivan
Если subject содержит русские буквы, пробелы, запятые, специальные символы — важно скопировать его максимально точно. Лучший источник — отладочный вывод pam_pkcs11.
Если файл редактировался в Windows-редакторе, уберите CRLF:
sudo dos2unix /etc/pam_pkcs11/subject_mapping 2>/dev/null || true
или проверьте:
cat -A /etc/pam_pkcs11/subject_mapping
В конце строк не должно быть ^M.
Информация предоставлена в ознакомительных целях. Применение описанных настроек в системах, должно осуществляться только после согласования с ответственными за информационную безопасность и в соответствии с требованиями ФСТЭК, ФСБ и иных уполномоченных органов.