OpenSSL и Network Security Services (NSS) — две стороны одной медали / Хабр

OpenSSL и Network Security Services (NSS) — две стороны одной медали / Хабр Электронная цифровая подпись

Astra linux орёл 2.12 криптопро 4.0.9963 госзакупки и площадки

Орёл 2.12 wiki
astralinux доступ к госзакупкам
Работа с КриптоПро CSP
Инструкция по настройке и работе с Крипто-Про для государственных порталов
Установка и настройка КриптоПро CSP в Porteus Linux
Вход с помощью электронной подписи на портал Госуслуг на Linux.

$ sudo apt update
$ sudo apt upgrade
$ sudo apt install samba ssh
$ sudo systemctl  enable ssh
$ sudo systemctl  start ssh

Два варианта либо ставим xrdp

$ sudo apt install xrdp

либо

================================== 

Установка дополнений VirtualBox $ sudo apt install gcc make perl linux-headers-generic linux-headers-`uname -r`
Подключить образ диска Дополнений гостевой ОС
$ sudo mount /dev/sr0 /mnt
mount: /dev/sr0 is write-protected, mounting read-only
$ sudo bash /mnt/VBoxLinuxAdditions.run

$ sudo reboot

Проверка:
$ sudo modinfo vboxguest
filename:       /lib/modules/4.15.3-1-generic/kernel/ubuntu/vbox/vboxguest/vboxguest.ko
version:        5.2.8_KernelUbuntu r120774
license:        GPL
description:    Oracle VM VirtualBox Guest Additions for Linux Module
author:         Oracle Corporation
srcversion:     F2E5886E3B0544500D404A1
alias:          pci:v000080EEd0000CAFEsv00000000sd00000000bc*sc*i*
depends:       
retpoline:      Y
intree:         Y
name:           vboxguest
vermagic:       4.15.3-1-generic SMP mod_unload
signat:         PKCS#7
signer:        
sig_key:       
sig_hashalgo:   md4

==================================  

$ cat /etc/astra_version
CE 2.12.8 (orel)

Загружаем  КриптоПро 4.0.9963

Устанавливаем КриптоПро 4.0.9963
$ tar -zxf linux-amd64_deb.tgz
$ cd linux-amd64_deb
$ sudo ./install_gui.sh

Ставим все галки, лицензию позднее.

Ставим
лицензию на Крипто-Про при наличии

$ sudo /opt/cprocsp/sbin/amd64/cpconfig -license -set *****-*****-*****-*****-*****

Если при установке не ввели лицензию, установится demo лицензия
$ /opt/cprocsp/sbin/amd64/cpconfig -license -view
License validity:
4040E-G0037-EK8R3-C6K4U-*****
Expires: 3 month(s) 2 day(s)
License type: Server.

Проверяем версию:
$ /opt/cprocsp/bin/amd64/csptest -keyset -verifycontext
CSP (Type:80) v4.0.9019 KC2 Release Ver:4.0.9963 OS:Linux CPU:AMD64 FastCode:READY:AVX.
AcquireContext: OK. HCRYPTPROV: 9196739
GetProvParam(PP_NAME): Crypto-Pro GOST R 34.10-2021 KC2 CSP
Total: SYS: 0,000 sec USR: 0,000 sec UTC: 0,020 sec
[ErrorCode: 0x00000000]

==================================================================================
Сертификат сайта госзакупок, кривой:

Не должно быть тут русских букв???

Реакция:

Отключаем реакцию на кривой сертификат госзакупок

Предварительная проверка:

$ sudo  /opt/cprocsp/bin/amd64/csptestf -tlsc -server zakupki.gov.ru -nosave
HSECPKG_ATTR_PACKAGE_INFO not supported.
Error 0x800b010f (CERT_E_CN_NO_MATCH) returned by CertVerifyCertificateChainPolicy!
An error occurred in running the program.
/dailybuildsbranches/CSP_4_0/CSPbuild/CSP/samples/csptest/WebClient.c:769:Error authenticating server credentials!
Error number 0x800b010f (2148204815).
CN-имя сертификата не совпадает с полученным значением.
Total: SYS: 0,060 sec USR: 0,060 sec UTC: 0,350 sec
[ErrorCode: 0x800b010f] 
Отключение:
$ sudo  /opt/cprocsp/sbin/amd64/cpconfig -ini ‘configparameters’ -add bool Rfc6125_NotStrict_ServerName_Check true

Проверка отключения:
$ sudo  /opt/cprocsp/bin/amd64/csptestf -tlsc -server zakupki.gov.ru -nosave
SECPKG_ATTR_PACKAGE_INFO not supported.
DEContext expired: OK if file is completely downloaded
Reply status: HTTP/1.1 200 OK
1 connections, 589 bytes in 1.735 seconds;
Total: SYS: 0,300 sec USR: 0,180 sec UTC: 1,780 sec
[ErrorCode: 0x00000000]

Какой результат будет?

==================================================================================

$ export PATH=”$(/bin/ls -d /opt/cprocsp/{s,}bin/*|tr ‘n’ ‘:’)$PATH”

$ sudo apt install alien
$ cd ~/
Скачать плагин  в /home/user (автоматическая загрузка версии плагина, соответствующей Вашей ОС)

$ tar -zxf cades_linux_amd64.tar.gz
$  cd ~/cades_linux_amd64

Установить плагин:
$ sudo alien -dc cprocsp-pki-2.0.0-amd64-cades.rpm
$ sudo alien -dc cprocsp-pki-2.0.0-amd64-plugin.rpm
$ sudo dpkg -i cprocsp-pki-cades_2.0.0-2_amd64.deb cprocsp-pki-plugin_2.0.0-2_amd64.deb

Сертификаты которые ставит Crypto-Pro:

$ sudo /opt/cprocsp/bin/amd64/certmgr -list -store mRoot
Certmgr 1.1 (c) “Crypto-Pro”,  2007-2021.
program for managing certificates, CRLs and stores

=============================================================================
1——-
Issuer              : [email protected], C=RU, S=77 г. Москва, L=Москва,
STREET=”125375 г. Москва, ул. Тверская, д. 7″, O=Минкомсвязь России,
OGRN=1047702026701, INN=007710474375, CN=Головной удостоверяющий центр
Subject             : [email protected], C=RU, S=77 г. Москва, L=Москва,
STREET=”125375 г. Москва, ул. Тверская, д. 7″, O=Минкомсвязь России,
OGRN=1047702026701, INN=007710474375, CN=Головной удостоверяющий центр
Serial              : 0x34681E40CB41EF33A9A0B7C876929A29
SHA1 Hash           : 8cae88bbfd404a7a53630864f9033606e1dc45e2
SubjKeyID           : 8b983b891851e8ef9c0278b8eac8d420b255c95d
Signature Algorithm : ГОСТ Р 34.11/34.10-2001
PublicKey Algorithm : ГОСТ Р 34.10-2001 (512 bits)
Not valid before    : 20/07/2021  12:31:14 UTC
Not valid after     : 17/07/2027  12:31:14 UTC
PrivateKey Link     : No
2——-
Issuer              : [email protected], C=RU, S=77 Москва, L=г. Москва,
STREET=”улица Тверская, дом 7″, O=Минкомсвязь России,
OGRN=1047702026701, INN=007710474375, CN=Минкомсвязь России
Subject             : [email protected], C=RU, S=77 Москва, L=г. Москва,
STREET=”улица Тверская, дом 7″, O=Минкомсвязь России,
OGRN=1047702026701, INN=007710474375, CN=Минкомсвязь России
Serial              : 0x4E6D478B26F27D657F768E025CE3D393
SHA1 Hash           : 4bc6dc14d97010c41a26e058ad851f81c842415a
SubjKeyID           : c254f1b46bd44cb7e06d36b42390f1fec33c9b06
Signature Algorithm : ГОСТ Р 34.11-2021/34.10-2021 256 бит
PublicKey Algorithm : ГОСТ Р 34.10-2021 (512 bits)
Not valid before    : 06/07/2021  12:18:06 UTC
Not valid after     : 01/07/2036  12:18:06 UTC
PrivateKey Link     : No
3——-
Issuer              : OGRN=1037700085444, INN=007717107991, C=RU,
S=Moscow, L=Moscow, O=”LLC “”Crypto-Pro”””, CN=CryptoPro GOST Root CA
Subject             : OGRN=1037700085444, INN=007717107991, C=RU,
S=Moscow, L=Moscow, O=”LLC “”Crypto-Pro”””, CN=CryptoPro GOST Root CA
Serial              : 0x4056ED0099A9D6AF49C9FF98B9C70E70
SHA1 Hash           : 34e21fc04d3576b0ada81fd081955e2778291cc5
SubjKeyID           : c2364dcc24260a439625305b67579b2ac9439cd5
Signature Algorithm : ГОСТ Р 34.11-2021/34.10-2021 256 бит
PublicKey Algorithm : ГОСТ Р 34.10-2021 (512 bits)
Not valid before    : 15/11/2021  14:14:09 UTC
Not valid after     : 15/11/2033  14:14:09 UTC
PrivateKey Link     : No
=============================================================================

[ErrorCode: 0x00000000]

Установка личного сертификата выданного казначейством:

Копируем контейнер в
$ cd /var/opt/cprocsp/keys/user

$ /opt/cprocsp/bin/amd64/csptest -keyset -enum -verifycontext -fqcn
CSP (Type:80) v4.0.9017 KC2 Release Ver:4.0.9944 OS:Linux CPU:AMD64 FastCode:READY:AVX.
AcquireContext: OK. HCRYPTPROV: 40317331
.HDIMAGEPRIZMA1
OK.
Total: SYS: 0,000 sec USR: 0,010 sec UTC: 0,140 sec
[ErrorCode: 0x00000000]

или

$ /opt/cprocsp/bin/amd64/csptest -keyset -enum -verifycontext -fqcn
CSP (Type:80) v4.0.9019 KC2 Release Ver:4.0.9963 OS:Linux CPU:AMD64 FastCode:READY:AVX.
AcquireContext: OK. HCRYPTPROV: 10339523
.HDIMAGEtest
OK.
Total: SYS: 0,000 sec USR: 0,000 sec UTC: 0,100 sec
[ErrorCode: 0x00000000]

Установить скопированный контейнер:

$ /opt/cprocsp/bin/amd64/certmgr -inst -store uMy -cont ‘.HDIMAGEPRIZMA1’

или

$ /opt/cprocsp/bin/amd64/certmgr -inst -store uMy -cont ‘.HDIMAGEtest’

Просмотор личных сертификатов:

$ /opt/cprocsp/bin/amd64/certmgr -list -store uMy

Установить расширение firefox на страничке с проверкой плагина:

Проверка плагина

Дожаться сообщения:
Как я настраивал новые утилиты по работе с электронной подписью в Linux / Блог компании «Актив» / Хабр

Проверить подпись.

Сертификат головного удостверящего центра центра уже установлен в mRoot

Просмотр:
$ sudo /opt/cprocsp/bin/amd64/certmgr -list -store mRoot

Если случайно удалили:
Скачаем и установим в mRoot
Если нужно удалить:
#$ sudo /opt/cprocsp/bin/amd64/certmgr -delete -all -store mRoot
Сертификаты zakupki.gov.ru
Качаем:
Сертификат Минкомсвязи России (Головного удостверяющего центра) ГОСТ Р 34.102021-2021
Сертификат Удостоверяющего центра Федерального казначейства ГОСТ Р 34.102021-2021

или wget

$ cd ~

Этот сертификат уже стоит, ставить не нужно:
#$ wget http://www.roskazna.ru/upload/iblock/7e3/guts_2021.cer
#$ sudo /opt/cprocsp/bin/amd64/certmgr -inst -cert -file guts_2021.cer -store mRoot

$ wget http://www.roskazna.ru/upload/iblock/acb/fk_2021.cer
$ sudo /opt/cprocsp/bin/amd64/certmgr -inst -cert -file fk_2021.cer -store mRoot

Просмотр:
$ sudo /opt/cprocsp/bin/amd64/certmgr -list -store mRoot

~$ sudo /opt/cprocsp/bin/amd64/certmgr -list -store mRoot
Certmgr 1.1 (c) “Crypto-Pro”,  2007-2021.
program for managing certificates, CRLs and stores

=============================================================================
1——-
Issuer              : [email protected], C=RU, S=77 Москва, L=г. Москва,
STREET=”улица Тверская, дом 7″, O=Минкомсвязь России,
OGRN=1047702026701, INN=007710474375, CN=Минкомсвязь России
Subject             : [email protected], S=г. Москва,
INN=007710568760, OGRN=1047797019830, STREET=”Большой Златоустинский
переулок, д. 6, строение 1″, L=Москва, C=RU, O=Федеральное казначейство,
CN=Федеральное казначейство
Serial              : 0x00B5F132D300000000015A
SHA1 Hash           : ab0e24e9a206877ab7dc4625dfcceb9c18b0cb0d
SubjKeyID           : c0d6d60a7d6b7ec98e39bcda89faaf942c585a8d
Signature Algorithm : ГОСТ Р 34.11-2021/34.10-2021 256 бит
PublicKey Algorithm : ГОСТ Р 34.10-2021 (512 bits)
Not valid before    : 19/11/2021  15:56:01 UTC
Not valid after     : 19/11/2033  15:56:01 UTC
PrivateKey Link     : No
CA cert URL         : http://reestr-pki.ru/cdp/guc_gost12.crt
CDP                 : http://reestr-pki.ru/cdp/guc_gost12.crl
CDP                 : http://company.rt.ru/cdp/guc_gost12.crl
CDP                 : http://rostelecom.ru/cdp/guc_gost12.crl
2——-
Issuer              : [email protected], C=RU, S=77 Москва, L=г. Москва,
STREET=”улица Тверская, дом 7″, O=Минкомсвязь России,
OGRN=1047702026701, INN=007710474375, CN=Минкомсвязь России
Subject             : [email protected], C=RU, S=77 Москва, L=г. Москва,
STREET=”улица Тверская, дом 7″, O=Минкомсвязь России,
OGRN=1047702026701, INN=007710474375, CN=Минкомсвязь России
Serial              : 0x4E6D478B26F27D657F768E025CE3D393
SHA1 Hash           : 4bc6dc14d97010c41a26e058ad851f81c842415a
SubjKeyID           : c254f1b46bd44cb7e06d36b42390f1fec33c9b06
Signature Algorithm : ГОСТ Р 34.11-2021/34.10-2021 256 бит
PublicKey Algorithm : ГОСТ Р 34.10-2021 (512 bits)
Not valid before    : 06/07/2021  12:18:06 UTC
Not valid after     : 01/07/2036  12:18:06 UTC
PrivateKey Link     : No
3——-
Issuer              : [email protected], C=RU, S=77 г. Москва, L=Москва,
STREET=”125375 г. Москва, ул. Тверская, д. 7″, O=Минкомсвязь России,
OGRN=1047702026701, INN=007710474375, CN=Головной удостоверяющий центр
Subject             : [email protected], C=RU, S=77 г. Москва, L=Москва,
STREET=”125375 г. Москва, ул. Тверская, д. 7″, O=Минкомсвязь России,
OGRN=1047702026701, INN=007710474375, CN=Головной удостоверяющий центр
Serial              : 0x34681E40CB41EF33A9A0B7C876929A29
SHA1 Hash           : 8cae88bbfd404a7a53630864f9033606e1dc45e2
SubjKeyID           : 8b983b891851e8ef9c0278b8eac8d420b255c95d
Signature Algorithm : ГОСТ Р 34.11/34.10-2001
PublicKey Algorithm : ГОСТ Р 34.10-2001 (512 bits)
Not valid before    : 20/07/2021  12:31:14 UTC
Not valid after     : 17/07/2027  12:31:14 UTC
PrivateKey Link     : No
4——-
Issuer              : OGRN=1037700085444, INN=007717107991, C=RU,
S=Moscow, L=Moscow, O=”LLC “”Crypto-Pro”””, CN=CryptoPro GOST Root CA
Subject             : OGRN=1037700085444, INN=007717107991, C=RU,
S=Moscow, L=Moscow, O=”LLC “”Crypto-Pro”””, CN=CryptoPro GOST Root CA
Serial              : 0x4056ED0099A9D6AF49C9FF98B9C70E70
SHA1 Hash           : 34e21fc04d3576b0ada81fd081955e2778291cc5
SubjKeyID           : c2364dcc24260a439625305b67579b2ac9439cd5
Signature Algorithm : ГОСТ Р 34.11-2021/34.10-2021 256 бит
PublicKey Algorithm : ГОСТ Р 34.10-2021 (512 bits)
Not valid before    : 15/11/2021  14:14:09 UTC
Not valid after     : 15/11/2033  14:14:09 UTC
PrivateKey Link     : No
=============================================================================

Читайте также:  Установка SSL-сертификата от платного центра сертификации | 8HOST.COM

[ErrorCode: 0x00000000]

В принципе установивки контейнера с личным сертификтом может быть достаточно.
Проверить можно:
Проверка цепочек
$ /opt/cprocsp/bin/amd64/certmgr -list -store uMy
Смотрим: 
CN=’Фёдорова Галина Борисовна’
#$ /opt/cprocsp/bin/amd64/cryptcp -sign -dn [email protected] -errchain /tmp/test /tmp/test.sgn
$ /opt/cprocsp/bin/amd64/cryptcp -copycert -dn  [email protected] -df ~/t.cer
$ CP_PRINT_CHAIN_DETAIL=1 /opt/cprocsp/bin/amd64/cryptcp -copycert -dn CN=’Фёдорова Галина Борисовна’ -df ~/t.cer
…..
…..
…..
Цепочки сертификатов проверены.
Копирование сертификатов завершено.
[ErrorCode: 0x00000000]
Если  в CN много кавычек, можно смотреть по e-mail из сертификата
CN=”ООО “”РОМАШКА”””

$ CP_PRINT_CHAIN_DETAIL=1 /opt/cprocsp/bin/amd64/cryptcp -copycert -dn  [email protected] -df ~/t.cer
…..
…..
…..
Цепочки сертификатов проверены.
Копирование сертификатов завершено.
[ErrorCode: 0x00000000]

 
Отмеченное до крестиков можем не делать:

Установка головного сертификата удостверяющего центра (из сертификата Калуга-Астрал):

В личном сертификате есть:
CA cert URL         : http://www.dp.keydisk.ru/root/833/astral-833-2021n.cer

$ mkdir  ~/CAs
$ wget -P ~/CAs $(/opt/cprocsp/bin/amd64/certmgr -list -store uMy | awk ‘/CA cert URL/ { print $5 }’)
for cert in $(ls -1 ~/CAs/*.cer); do sudo /opt/cprocsp/bin/amd64/certmgr -inst -store mRoot -file $cert; done

или
можно посмотреть в личном сертификате
$ /opt/cprocsp/bin/amd64/certmgr -list -store uMy

CA cert URL         : http://www.dp.keydisk.ru/root/833/astral-833-2021n.cer
….
Скачать
$ wget http://www.dp.keydisk.ru/root/833/astral-833-2021n.cer
Установить.
$ sudo /opt/cprocsp/bin/amd64/certmgr -inst -cert -file astral-833-2021n.cer -store mRoot

Проверка цепочек
$ /opt/cprocsp/bin/amd64/certmgr -list -store uMy
Смотрим: 
CN=’Фёдорова Галина Борисовна’
$ /opt/cprocsp/bin/amd64/cryptcp -copycert -dn  [email protected] -df ~/t.cer
$ CP_PRINT_CHAIN_DETAIL=1 /opt/cprocsp/bin/amd64/cryptcp -copycert -dn CN=’Фёдорова Галина Борисовна’ -df ~/t.cer
…..
…..
…..
Certificate chains are checked.
Certificate’s been copied.
[ReturnCode: 0]

или

Цепочки сертификатов проверены.
Копирование сертификатов завершено.
[ErrorCode: 0x00000000]

Графическая оболочка guinsspy для пакета nss

Первый вопрос, на чем разрабатывать? Было решено на Python-е.

Второй вопрос, на чем писать графический интерфейс? Ответ — Tkinter.

Первоначально gui разрабатывалось на PAGE. Но потом от него отошли. Но контекст остался.

Функционал утилиты базируется на рассмотренных выше утилитах и командах. Помимо них была добавлена еще одна функция «Создать запрос на сертификат», которая базируется на команде «certutil -R»:

В качестве темы оформления виджетов решено было использовать тему Breeze для python3 и тему Arc для python2, поскольку для последнего отсутствует тема Breeze. Для этого надо установить пакет с темами для pythona:

$pip install ttkthemes


Еще нам потребуется

для работы с сертификатами:

$pip install fsb795

Утилиты NSS, на базе которых строится графическая оболочка guinsspy, очень часто запрашавают пароли или PIN-оды через консоль. Единственным способом взаимодействия с ними через графический интерфейс является использование пакета pexpect:

$pip install pexpect

В качестве примере использования пакета pexpect приведем код процедуры импорта контейнера PKCS#12:

importP12
def importP12(frameManager):
    global readpw
    global filename
    tokname = frameManager.STCombobox1.get()
    fp12 = frameManager.SEntry1.get()
    if (fp12 == () or fp12 == ''):
        tkMessageBox.showinfo(title="Импорт контейнера PKCS#12", message='Контейнер не выбранn')
        return (-1, "", "")
    filename = fp12
    if sys.platform != "win32":
        cmd_import_p12 = '"'   patch_win   'pk12util" -i "'   fp12   '" -h "'   tokname   '"  -d "'   NSSname   '"'
        id = pexpect.spawn(cmd_import_p12, timeout=1)
    else:
        cmd_import_p12 = '"'   patch_win   'pk12util" -i "'   fp12   '" -h "'    tokname   '"  -d "'   NSSname   '"'
        id = pexpect.popen_spawn.PopenSpawn(cmd_import_p12, timeout=10)
    while(True):
        ret = id.expect(["Enter Password or Pin", "Enter password for PKCS12 file",pexpect.EOF, pexpect.TIMEOUT])
        if (ret == 0 or ret == 1):
            root.update()
            if (ret == 0):
                password('', tokname, 0)
                pasP11 = readpw
            else:
                password('', os.path.basename(fp12), 1)
                pasP12 = readpw
            if (readpwok == 0):
                if sys.platform != "win32":
                    id.close()
                return (-3, fp12, "")
            if sys.platform != "win32":
                id.send(readpw)
                id.send("r")
            else:
                id.sendline(readpw)
            lseek = 1
        elif (ret == 2):
            break
        elif (ret == 3):
            break
            if sys.platform != "win32":
                id.close()
            return (-1, fp12, "")
    if sys.platform != "win32":
        res = id.before.decode('UTF-8')
        id.close()
    else:
        res = id.before.decode('UTF-8')
    if (res.find("PKCS12 IMPORT SUCCESSFUL") != -1):
        ret = 0
    elif (res.find("SEC_ERROR_BAD_PASSWORD") != -1):
        ret = -1
        return (ret, fp12, "")
    else:
        ret = -2
    return (ret, fp12, res)


Бесконечный цикл (while(True):) в процедуре ждет наступления одного из четырех событий:

ret = id.expect(["Enter Password or Pin", "Enter password for PKCS12 file",pexpect.EOF, pexpect.TIMEOUT])

Первое событие связано с приглашением на ввод пароля или PIN-кода («Enter Password or Pin»).

При его наступлении на экране будет отображаться окно для ввода PIN-кода (левое окно на скриншоте):

Второе событие связано с вводом пароля к контейнеру PKCS#12 («Enter password for PKCS12 file»). При его наступлении на экране будет отображаться окно для ввода пароля к файлу с контейнером PKCS#12 (правое окно на скриншоте).

Третье событие связано с завершением работы утилиты pk12util (pexpect.EOF), а четвертое событие — с завершением работы утилиты по таймауту (pexpect.TIMEOUT).

Исходный код утилиты guinsspy можно найти здесь. Дистрибутив пакета NSS для работы с токенами PKCS#11 с российской криптографией для платформы Linux x86_64 можно найти там же.

Для тестирования токенов с российской криптографией скопируйте папку NSS_GOST_3.52.1_Linux_x86_64 в свой домашний каталог. Создайте скрипт guinsspy_gost.sh:

export LD_LIBRARY_PATH=~/NSS_GOST_3.52.1_Linux_x86_64:$LD_LIBRARY_PATH
export PATH=~/NSS_GOST_3.52.1_Linux_x86_64:$PATH
python3 guinsspy.py

Теперь запустите этот скрипт и работайте с российскими токенами.


Если у вас нет под рукой токена с российской криптографией, то зайдите на вкладку «Создать SW/Cloud токен», которая вам плдскажет как создать программный токен на вашем компьютере или подключиться к

И напоследок, скриншоты создания запроса на сертификат:

Полученный запрос можно будет передать в УЦ CAFL63, выпустить там сертификат, установить на токен, на котором был создан закрытый ключ. А дальше использовать этот сертификат, например, для подписания документов.

Доступ к объектам токена pkcs#11


Для доступа к объектам (ключи, сертификаты) токенов PKCS#11 служит утилита certutil. Отметим, что по своей функциональности утилита certutil не уступает утилите openssl. Для просмотра функциональности утилиты certutil достаточно выполнить команду:

$certutil -H

Но нас сейчас интересует только

Читайте также:  Как при помощи токена сделать Windows домен безопаснее? Часть 1 / Хабр

. Напомним, что при хранении на токене PKCS#11 и тем и другим, как правило, приписываются атрибуты CKA_ID и CKA_LABEL. Для просмотра списка сертификатов на том или ином токене необходимо выполнить следующую команду:

$certutil -L [-d <хранилище NSS>] [-h <метка токена>]

В качестве метки токена может быть указана реальная метка токена или одно из ключевых слов — all или internal. В первом случае (метка токена all) перебираются все токены, подключенные к хранилищу NSS, а во втором случае (internal или «NSS Certificate DB») будет просматриваться внутренний токен хранилища «NSS Certificate DB».

Например, для получения списка сертификатов, находящихся на токене с меткой «LS11SW2022», модуль доступа к которому зарегистрирован в хранилище NSS “/home/a513/tmp/TEST_NSS” необходимо выполнить следующую команду:

$ certutil -L -d /home/a513/tmp/TEST_NSS -h "LS11SW2022"
Enter Password or Pin for "LS11SW2022":
Certificate Nickname                                  Trust Attributes
                                                      SSL,S/MIME,JAR/XPI
LS11SW2022:TestCA_P11                                 u,u,u
LS11SW2022:clientnss from CryptoArmPKCS               u,u,u
LS11SW2022:ТестШифр                                   u,u,u
LS11SW2022:Thenderbird-60.3.0 from 32                 u,u,u
LS11SW2022:Всесильный Хабр from УЦ 12_512             u,u,u
LS11SW2022:Text4Key                                   u,u,u
LS11SW2022:KmailKleopatra от GnuPG-2001               u,u,u
LS11SW2022:setvernss from CryptoArmPKCS               u,u,u
LS11SW2022:Ф И О from УЦ 12_512                       u,u,u
LS11SW2022:Test 12 512                                u,u,u
LS11SW2022:Kleopatra от GnuPG-2001                    ,,   
$

Список сертификатов, находящихся на токене, выводится в две колонки. В первой колонке дается nicknamе сертификата, а во второй — атрибуты доверия этого сертификата.

Причем, если сертификат имеет закрытый ключ на токене, где он находится, то в этой колонке будет значение «u,u,u».

Если атрибуты не устанавливались, то в колонке будет значение “,,”.

Сертификаты с атрибутами доверия «u,u,u» (у них есть закрытый ключ) могут быть использованы для аутентификации или формирования электронной подписи.

Другие значения атрибутов доверия могут быть установлены для сертификатов, находящихся на встроенном токене «NSS Certificate DB». Но об этом позже.

Что же такое nickname сертификата в NSS?

Для внутреннего токена («NSS Certificate DB») метка токена в nickname может отсутствовать.

Если рассматривать механизмы токенов PKCS#11, то мы увидим, что операции генерации ключей, импорта сертификатов и ключей сами по себе не предусматривают установку значений атрибутов CKA_ID и CKA_LABEL. Это все перекладывается на разработчика прикладного ПО. Но, если вы используете утилиты NSS для работы с токенами, то оказывается, что они берут на себя эти хлопоты.

Для просмотра списка закрытых ключей используется следующая команда:

$certutil -K [-d <хранилиже NSS>] [-h <метка токена>]

При этом распечатывается тип ключа, CKA_ID и CKA_LABEL ключа.

Но вернемся к сертификатам. Для просмотра сертификата, находящегося на токене, в текстовом виде достаточно выполнить команду:

$certutil -L [-d <хранилище NSS>] -n <nickname сертификата>

Например:

certutil -L -d ‘/home/a513/tmp/TEST_NSS’ -n ‘NSS Certificate DB:Тестовый сертификат’

$ certutil -L -d “/home/a513/tmp/TEST_NSS” -n «NSS Certificate DB: Тестовый сертификат»

Certificate:

Data:

Version: 3 (0x2)

Serial Number: 4096 (0x1000)

Signature Algorithm: PKCS #1 SHA-256 With RSA Encryption

Issuer: «[email protected],OGRN=1111111111111,INN=222222222222,CN=Удос

товеряюший Центр,OU=Отдел Удостоверя

юший Центр,O=Удостоверяюший Центр,STR

EET=»ул. Хавровская, д. 0″,L=Хабраград,ST=М

осковская область,C=RU”

Validity:

Not Before: Tue Jul 07 08:40:14 2020

Not After: Fri Aug 06 08:40:14 2021

Subject: «[email protected],CN=Тестовый сертификат»

Subject Public Key Info:

Public Key Algorithm: PKCS #1 RSA Encryption

RSA Public Key:

Modulus:

9a:9f:6c:60:94:f7:ec:f7:94:b3:51:01:e2:1a:c5:25:

28:bb:02:77:49:52:4d:99:8a:6e:26:12:55:8f:71:34:

04:da:39:24:f9:b4:6b:d0:0a:42:27:1b:b2:d7:9b:d9:

c3:76:b0:e0:1c:7c:21:ce:79:9f:d5:2b:17:63:cb:94:

5b:d9:b2:53:ff:b9:bf:4f:3d:cf:b7:8d:8a:37:ba:02:

8c:da:d2:0d:fd:46:5b:45:1d:95:64:07:6e:fa:88:0d:

a4:bd:b3:4a:ed:99:f1:fd:73:c5:b6:05:a0:e5:ee:6b:

c3:83:5b:d0:64:05:77:6a:18:d8:c8:28:a1:d0:06:41:

23:0d:bb:87:8a:77:14:fb:6c:5d:af:db:2b:0b:11:a3:

16:1b:2b:05:18:26:a9:b5:00:4a:40:da:b3:05:aa:2a:

67:c0:18:0d:03:f7:d2:b9:ba:7c:36:f9:95:2e:56:81:

a3:09:99:5e:20:10:95:38:10:c9:c1:6f:c3:6c:a6:1b:

78:51:c6:e4:4f:11:bc:c0:22:4b:ca:59:16:f2:45:95:

0d:fd:7b:46:cf:c7:ac:1c:3d:d7:26:fc:ad:80:3e:2c:

21:93:29:32:a6:79:e2:a8:c6:e9:5e:45:34:d3:38:57:

8f:cd:95:5e:91:09:84:34:21:d2:16:29:69:75:4d:a3

Exponent: 65537 (0x10001)

Signed Extensions:

Name: Certificate Basic Constraints

Critical: True

Data: Is not a CA.

Name: Certificate Key Usage
Usages: Digital Signature
Key Encipherment
Key Agreement

Name: Certificate Type
Data: <SSL Client,S/MIME>

Name: Extended Key Usage
TLS Web Client Authentication Certificate
E-Mail Protection Certificate

Name: Certificate Subject Key ID
Data:
26:a1:b3:98:1c:fe:62:ba:23:81:96:37:3f:08:bd:70:
d6:f2:b1:46

Name: Certificate Authority Key Identifier
Key ID:
0a:b6:f6:87:64:1d:8e:b3:63:08:29:9f:21:59:ad:47:
d8:ea:07:f4
Issuer:
Directory Name: «[email protected],OGRN=1111111111111,INN=22222222
2222,CN=Удостоверяюший Центр,OU=Отд
ел Удостоверяюший Центр,O=Удост
оверяюший Центр,STREET=»ул. Хавровс
кая, д. 0″,L=Хабраград,ST=Московска
я область,C=RU”
Serial Number:
00:a2:9b:22:32:3e:a7:3d:d8

Name: Certificate Subject Alt Name
RFC822 Name: «[email protected]»

Name: Certificate Issuer Alt Name
Error: Parsing extension: Certificate extension value is invalid.
Data: Sequence {
}

Signature Algorithm: PKCS #1 SHA-256 With RSA Encryption
Signature:
2f:75:7e:71:9e:15:5c:97:fe:a2:e1:2a:52:39:56:55:
e0:62:60:bc:5f:6d:c2:b6:ec:cd:8b:10:b3:b1:3f:e5:
d6:d1:5f:a5:fa:61:c1:ce:3e:db:6a:2f:b2:13:46:8d:
67:cf:18:09:61:97:01:45:bc:99:bb:0c:d6:0a:a3:03:
87:0a:8e:10:3a:d5:e3:94:6d:4a:24:fa:c3:40:0b:43:
c2:3b:00:56:06:c4:d2:fc:b2:7e:e9:00:e5:2f:4b:e2:
3a:91:49:ce:f8:c3:60:ec:01:74:d8:1a:3b:af:e6:f6:
91:db:c5:f1:d7:de:be:18:38:47:41:8a:e2:ef:80:91:
10:54:41:ae:55:22:6f:d7:8c:fa:46:b6:b6:2a:ee:6a:
0c:c9:03:18:af:4e:93:6c:61:f3:b4:78:0c:61:93:f1:
d8:1b:00:c3:e5:29:9a:08:0a:f8:31:67:88:3d:c3:88:
7a:60:c0:c4:52:94:25:56:e5:a3:df:7d:58:c5:df:9a:
c7:22:7e:2c:f6:fb:2c:bf:b7:7f:c5:ca:2b:0f:8c:20:
77:b9:1f:e0:62:5a:3d:d4:6f:12:ea:c8:51:67:a5:75:
ad:e9:ac:9e:4e:2e:2d:34:80:e7:d8:64:f6:8f:2f:33:
32:1f:8b:bc:9c:e8:77:4a:ee:7b:84:31:ec:28:e9:70
Fingerprint (SHA-256):
96:F4:A5:FA:6D:8A:F8:7E:A6:10:49:BD:43:34:C1:92:C6:7D:FF:63:41:8E:69:C0:AC:34:6B:CB:63:7B:56:31
Fingerprint (SHA1):
B6:91:9B:C6:7A:45:9C:92:FD:E7:C7:33:00:FA:91:DF:7D:5F:00:21

Mozilla-CA-Policy: false (attribute missing)
Certificate Trust Flags:
SSL Flags:
User
Email Flags:
User
Object Signing Flags:
User
$

Просмотр сертификатов и других сущностей, хранящихся в файлах

В пакете OpenSSL присутствует одна

, первым параметром в которой задается собственно команда (Standard commands), которую необходимо выполнить:


Как можно заметить, при выполнении команды openssl help, помимо собственно перечня команд, выводится список поддерживаемых хэш-алгоритмов и алгоритмов шифрования (в их перечень включены и функции сжатия и работы с base64).

Для просмотра сертификата (x509), запроса (req) или списка отозванных сертификатов (crl) достаточно выполнить команду следующего вида:

openssl x509[|req|crl] [-nameopt utf8] -inform PEM|DER -noout -in <имя файла>.

Например, команда:

$openssl x509 -text -nameopt utf8 -inform PEM -noout -in cert.pem

отобразит на экране компьютера содержимое сертификата в техтовом виде (x509 -text), хранящегося в файле cert.pem ( -in cert.pem) в кодировке PEM (base64) (-inform PEM) и содержащего символы в кодировке utf-8 (-nameopt utf8). При этом сам сертификат в кодировке PEM на экран выводиться не будет (-noout).

В пакете NSS аналогичные действия выполняет утилита pp.

Утилита pp — это утилита элегантной печати (Pretty Print) файла, содержащего ASN.1 структуру в DER или PEM-кодировке:

Usage:  pp [-t type] [-a] [-i input] [-o output] [-w] [-u],  

где type:

Отметим еще один тип, который применяется к сертификатам, ci (certificate-identity). Этот тип позволяет получить из сертификата идентифицирующую его информацию, такую как subject (владелец), issuer (издатель), serial number (серийный номер), fingerprint (отпечатки по SHA-1 и SHA-256). Аналогичные параметры есть и у утилиты openssl для x509.

По умолчанию предполагается, что все объекты находятся в DER-кодировке. Если же объекты находятся в PEM-кодировке, то необходимо задать параметр “-a” (аналог параметра “-inform PEM” для утилиты openssl). И еще один параметр “-u” задается, если в объекте содержатся символы в кодировке UTF-8. Напомним, что аналогичный параметр есть и у утилиты openssl — “-nameopt utf8”.

В пакете NSS есть и утилита для просмотра ASN.1-структыры объекта, аналог утилиты openssl asn1.parse. Это утилита derdump:

$derdump -i <просматриваемый файл> [-o <выходной файл>]

Из самого названия утилиты следует, что она работает с файлами в DER-кодировке. Но это не страшно. В состав пакета входят две утилиты, которые конвертируют файлы из PEM/BASE64-кодировки в DER-кодировку и обратно. Это утилиты atob и btoa.

Например, для конвертации сертификата из PEM-формата в DER-формат в OpenSSL надо выполнить следующую команду:

$openssl x509 -inform der -in CERT.der -out CERT.pem 

В NSS это будет выглядеть так:

$btoa -in CERT.der -out CERT.pem -w "CERTIFICATE"

Параметр “-w” указывает, какой текст включить в начало выходного файла и конец. В данном случае “-w CERTIFICATE” приведет к появлению стандартного для PEM-формата в OpenSSL заголовка и концевика:

-----BEGIN CERTIFICATE-----
<тело сертификата в кодировке BASE64>
-----END CERTIFICATE----- 

И OpenSSL и NSS могут работать с контейнерами pkcs#12. И они оба позволяют не только создавать, но и просмотривать содержимое контейнера pkcs12. Но, при использовании утилиты openssl требуется сначала разобрать контейнер и сохранить сертификаты из контейнера в отдельных файлах.

pk12util -l <файл с контейнером pkcs12> [-W <пароль к контейнеру pkcs12>] [-d <каталог хранилища NSS>] [-h <токен>]

Например:

Читайте также:  Окно «Выбор ключевого контейнера» пустое либо в нем не отображается нужный контейнер

Утилита удобная, но без ложки дегтя не обошлось. Ложка дегтя состоит в том, что русские буквы, вернее, UTF-8 кодировка отображается в виде точек (…..). И если у утилиты pp есть параметр -u (присутствует кодировка utf-8), то здесь про нее забыли (мы еще раз столкнемся с этим при рассмотрении утилиты certutil).

PRIntn
P12U_ListPKCS12File(char *in_file, PK11SlotInfo *slot,
                    secuPWData *slotPw, secuPWData *p12FilePw)
{
    SEC_PKCS12DecoderContext *p12dcx = NULL;
    SECItem uniPwitem = { 0 };
    SECStatus rv = SECFailure;
    const SEC_PKCS12DecoderItem *dip;
/*Вызов функции для отображения UTF-8*/
    SECU_EnableUtf8Display(PR_TRUE);

.   .   .   .   .

}
После этого проблем с русскими буквами не будет.

$ pk12util -l 1000.p12 -d “.” -W 01234567

Certificate(has private key):

Data:

Version: 3 (0x2)

Serial Number: 4096 (0x1000)

Signature Algorithm: PKCS #1 SHA-256 With RSA Encryption

Issuer: «[email protected],OGRN=1111111111111,INN=222222222222,CN=Удос

товеряюший Центр,OU=Отдел Удостоверя

юший Центр,O=Удостоверяюший Центр,STR

EET=»ул. Хавровская, д. 0″,L=Хабраград,ST=М

осковская область,C=RU”

Validity:

Not Before: Tue Jul 07 08:40:14 2020

Not After: Fri Aug 06 08:40:14 2021

Subject: «[email protected],CN=Тестовый сертификат»

Subject Public Key Info:

Public Key Algorithm: PKCS #1 RSA Encryption

RSA Public Key:

Modulus:

9a:9f:6c:60:94:f7:ec:f7:94:b3:51:01:e2:1a:c5:25:

28:bb:02:77:49:52:4d:99:8a:6e:26:12:55:8f:71:34:

04:da:39:24:f9:b4:6b:d0:0a:42:27:1b:b2:d7:9b:d9:

c3:76:b0:e0:1c:7c:21:ce:79:9f:d5:2b:17:63:cb:94:

5b:d9:b2:53:ff:b9:bf:4f:3d:cf:b7:8d:8a:37:ba:02:

8c:da:d2:0d:fd:46:5b:45:1d:95:64:07:6e:fa:88:0d:

a4:bd:b3:4a:ed:99:f1:fd:73:c5:b6:05:a0:e5:ee:6b:

c3:83:5b:d0:64:05:77:6a:18:d8:c8:28:a1:d0:06:41:

23:0d:bb:87:8a:77:14:fb:6c:5d:af:db:2b:0b:11:a3:

16:1b:2b:05:18:26:a9:b5:00:4a:40:da:b3:05:aa:2a:

67:c0:18:0d:03:f7:d2:b9:ba:7c:36:f9:95:2e:56:81:

a3:09:99:5e:20:10:95:38:10:c9:c1:6f:c3:6c:a6:1b:

78:51:c6:e4:4f:11:bc:c0:22:4b:ca:59:16:f2:45:95:

0d:fd:7b:46:cf:c7:ac:1c:3d:d7:26:fc:ad:80:3e:2c:

21:93:29:32:a6:79:e2:a8:c6:e9:5e:45:34:d3:38:57:

8f:cd:95:5e:91:09:84:34:21:d2:16:29:69:75:4d:a3

Exponent: 65537 (0x10001)

Signed Extensions:

Name: Certificate Basic Constraints

Critical: True

Data: Is not a CA.

Name: Certificate Key Usage
Usages: Digital Signature
Key Encipherment
Key Agreement

Name: Certificate Type
Data: <SSL Client,S/MIME>

Name: Extended Key Usage
TLS Web Client Authentication Certificate
E-Mail Protection Certificate

Name: Certificate Subject Key ID
Data:
26:a1:b3:98:1c:fe:62:ba:23:81:96:37:3f:08:bd:70:
d6:f2:b1:46

Name: Certificate Authority Key Identifier
Key ID:
0a:b6:f6:87:64:1d:8e:b3:63:08:29:9f:21:59:ad:47:
d8:ea:07:f4
Issuer:
Directory Name: «[email protected],OGRN=1111111111111,INN=22222222
2222,CN=Удостоверяюший Центр,OU=Отд
ел Удостоверяюший Центр,O=Удост
оверяюший Центр,STREET=»ул. Хавровс
кая, д. 0″,L=Хабраград,ST=Московска
я область,C=RU”
Serial Number:
00:a2:9b:22:32:3e:a7:3d:d8

Name: Certificate Subject Alt Name
RFC822 Name: «[email protected]»

Name: Certificate Issuer Alt Name
Error: Parsing extension: Certificate extension value is invalid.
Data: Sequence {
}

Signature Algorithm: PKCS #1 SHA-256 With RSA Encryption
Signature:
2f:75:7e:71:9e:15:5c:97:fe:a2:e1:2a:52:39:56:55:
e0:62:60:bc:5f:6d:c2:b6:ec:cd:8b:10:b3:b1:3f:e5:
d6:d1:5f:a5:fa:61:c1:ce:3e:db:6a:2f:b2:13:46:8d:
67:cf:18:09:61:97:01:45:bc:99:bb:0c:d6:0a:a3:03:
87:0a:8e:10:3a:d5:e3:94:6d:4a:24:fa:c3:40:0b:43:
c2:3b:00:56:06:c4:d2:fc:b2:7e:e9:00:e5:2f:4b:e2:
3a:91:49:ce:f8:c3:60:ec:01:74:d8:1a:3b:af:e6:f6:
91:db:c5:f1:d7:de:be:18:38:47:41:8a:e2:ef:80:91:
10:54:41:ae:55:22:6f:d7:8c:fa:46:b6:b6:2a:ee:6a:
0c:c9:03:18:af:4e:93:6c:61:f3:b4:78:0c:61:93:f1:
d8:1b:00:c3:e5:29:9a:08:0a:f8:31:67:88:3d:c3:88:
7a:60:c0:c4:52:94:25:56:e5:a3:df:7d:58:c5:df:9a:
c7:22:7e:2c:f6:fb:2c:bf:b7:7f:c5:ca:2b:0f:8c:20:
77:b9:1f:e0:62:5a:3d:d4:6f:12:ea:c8:51:67:a5:75:
ad:e9:ac:9e:4e:2e:2d:34:80:e7:d8:64:f6:8f:2f:33:
32:1f:8b:bc:9c:e8:77:4a:ee:7b:84:31:ec:28:e9:70
Fingerprint (SHA-256):
96:F4:A5:FA:6D:8A:F8:7E:A6:10:49:BD:43:34:C1:92:C6:7D:FF:63:41:8E:69:C0:AC:34:6B:CB:63:7B:56:31
Fingerprint (SHA1):
B6:91:9B:C6:7A:45:9C:92:FD:E7:C7:33:00:FA:91:DF:7D:5F:00:21

Friendly Name: Тестовый сертификат

Certificate:
Data:
Version: 3 (0x2)
Serial Number:
00:a2:9b:22:32:3e:a7:3d:d8
Signature Algorithm: PKCS #1 SHA-256 With RSA Encryption
Issuer: «[email protected],OGRN=1111111111111,INN=222222222222,CN=Удос
товеряюший Центр,OU=Отдел Удостоверя
юший Центр,O=Удостоверяюший Центр,STR
EET=»ул. Хавровская, д. 0″,L=Хабраград,ST=М
осковская область,C=RU”
Validity:
Not Before: Tue Jul 07 08:08:11 2020
Not After: Fri Jul 05 08:08:11 2030
Subject: «[email protected],OGRN=1111111111111,INN=222222222222,CN=Удос
товеряюший Центр,OU=Отдел Удостоверя
юший Центр,O=Удостоверяюший Центр,STR
EET=»ул. Хавровская, д. 0″,L=Хабраград,ST=М
осковская область,C=RU”
Subject Public Key Info:
Public Key Algorithm: PKCS #1 RSA Encryption
RSA Public Key:
Modulus:
e7:08:ed:83:08:10:7b:48:56:37:8b:e2:4a:31:1a:7b:
0d:4e:d2:a2:67:d7:04:60:a0:09:db:06:64:21:01:4e:
0d:41:d8:61:15:c6:58:83:66:7e:6b:65:72:0d:2b:c3:
50:26:11:04:82:4b:1a:12:d0:dc:e1:13:1c:76:69:0f:
c2:59:e2:5d:60:6d:fe:8a:48:fa:8b:1e:05:07:34:6d:
8a:e3:76:23:42:9e:7b:64:0b:6a:fb:36:63:31:96:df:
ed:d3:e8:7c:6e:39:d4:7d:da:b8:f4:ec:53:57:60:f1:
d8:a4:3a:3f:3b:4a:63:6c:2a:55:90:21:15:23:4a:37:
21:31:a0:c4:bb:84:0d:96:18:3c:3b:ba:92:e3:e2:17:
56:e5:d9:8c:58:24:8a:a3:53:b6:4f:02:4d:30:a6:0f:
34:ad:20:cf:6f:03:ca:23:1e:d3:15:bc:80:09:d8:1e:
90:07:da:90:a9:34:9e:6e:ed:6b:10:b7:a1:a4:a9:b4:
04:ac:6a:40:d8:00:52:d6:6a:28:f2:8c:c6:84:81:8a:
cd:63:a6:53:82:d2:4e:11:ec:94:81:d7:9c:79:8a:30:
9c:40:75:4d:d9:88:0b:cc:a4:0c:5d:6d:23:a6:ac:56:
8c:49:d9:1f:2b:63:cb:50:fc:a3:e0:3e:35:4e:f4:03
Exponent: 65537 (0x10001)
Signed Extensions:
Name: Certificate Basic Constraints
Critical: True
Data: Is a CA with no maximum path length.

Name: Certificate Subject Key ID
Data:
0a:b6:f6:87:64:1d:8e:b3:63:08:29:9f:21:59:ad:47:
d8:ea:07:f4

Signature Algorithm: PKCS #1 SHA-256 With RSA Encryption
Signature:
17:7d:29:dc:4d:6e:4c:99:7a:bc:b2:2a:a5:80:f9:5f:
0c:60:00:2b:f3:f4:ef:19:d7:ed:56:07:5d:24:e1:b3:
f6:43:e2:05:9b:75:ce:cd:cf:27:1e:1c:cd:d8:cc:43:
77:16:04:7e:8a:dd:89:c4:b2:75:ae:f4:84:23:53:18:
fe:be:c5:1d:40:55:aa:91:9f:f5:96:06:5d:07:22:a8:
1c:b9:29:c4:49:2e:75:10:75:22:95:36:16:58:2f:77:
f5:fa:6d:de:c4:67:ca:f3:e1:98:51:b4:ba:b7:2a:7f:
06:db:33:5a:a6:bb:53:57:f4:18:93:16:9c:0e:43:d0:
46:e6:84:55:bb:ff:68:fe:fa:32:d5:23:2a:d5:65:9b:
d9:63:45:6b:53:71:64:dd:da:e1:40:fa:89:30:b1:73:
8b:f8:7c:3c:2f:72:24:ad:e8:5c:07:89:2f:3a:0d:37:
48:29:1f:0d:5f:9e:11:73:56:b8:d9:24:eb:2d:2e:18:
c7:9b:90:62:09:20:61:75:b9:a1:9a:3f:99:34:8e:06:
30:ce:7d:60:42:7d:e0:14:f2:88:f2:41:a0:46:4d:55:
17:d4:c2:15:64:c9:3e:f5:cc:0a:41:f7:c0:d0:94:96:
ea:64:e0:45:3a:e0:a3:d6:22:a9:d1:e3:c4:51:e8:96
Fingerprint (SHA-256):
F5:DF:15:79:5E:1E:41:84:96:8C:8C:CA:37:0C:A6:BB:C3:21:AE:3D:32:42:8C:63:C2:64:BA:0A:74:DC:37:F8
Fingerprint (SHA1):
CF:C6:B9:D4:3C:16:6F:31:91:2A:09:2F:FE:4C:57:89:0F:5A:F1:DB

Friendly Name: Удостоверяюший Центр

Key(shrouded):
Friendly Name: Тестовый сертификат

Encryption algorithm: PKCS #12 V2 PBE With SHA-1 And 3KEY Triple DES-CBC
Parameters:
Salt:
c4:fa:4a:6a:4f:54:a1:7a
Iteration Count: 2048 (0x800)
$

При создании контейнера PKCS#12 утилитой openssl мы воспользовались графической оболочной

Теперь самое время поговорить о хранилище NSS.

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

Предположим у вас есть контейнер PKCS#12 с личным сертификатом и закрытым ключом, который вы сформировали средствами OpenSSL. Для экспорта личного сертификата в хранилище NSS используется команда pk12util следующего вида:

$pk12util -i <контейнер pkcs12> [-d <хранилище NSS>] [-h <метка токена>]

Если вы хотите импортировать сертификат на конкретный токен, то необходимо задать его метку. Отметим еще одну особенность. Если контейнер содержит в своем составе корневые сертификаты, то они будут сохранены на внутреннем токене «NSS Certificate DB».

При этом атрибуты доверия по умолчанию не устанавливаются. Если по каким-либо причинам требуется установка атрибутов доверия к тем или иным сертификатам центров регистрации (корневым сертификатам) или SSL-сертификатам, то используется утилита certutil следующего вида:

$certutil -M -n <nickname-сертификата> -t <аттрибуты доверия> [-d <хранилище NSS>]


Для каждого сертификата есть три доступные категории доверия, выраженные в следующем порядке: SSL, S/MIME, подпись кода для каждого параметра доверия:

Каждая позиция x, y и z может быть пустой (используйте ,, без явного доверия) или содержать один или несколько атрибутов:

Отметим, что

не все внешние токены допускают операцию импорта закрытого ключа на токен.

Для установки просто сертификата из файла используется утилита certutil следующего вида:

$certutil -A -n <метка сертификата> -t <аттрибуты доверия> [-d <хранилище NSS>] [-h <метка токена>] [-a] [-i <файл с сертификатом>]

К сожалению, в данном контексте не эквивалентна nickname сертификата, рассмотренному выше. Здесь метка сертификата соответствует просто CKA_LABEL, просто метки без указания метки токена. Какой-то разнобой.

По умолчанию предполагается, что сертификат находится в файле в DER-кодировке. Если сертификат в PEM-кодировке, то необходимо задавать параметр “-a”. Если параметр “-i” не задан, то сертификат будет браться из стандартного ввода (stdin). По умолчанию сертификаты устанавливаются в токен «NSS Certificate DB», но можно установить сертификат и на внешний токен (параметр “-h”).

При установке сертификата на внешний токен сертификат будет установлен как на внутренний токен («NSS Certificate DB»), так и внешний токен. При этом атрибуты доверия для внешнего токена будут проигнорированы, будет выдано предупреждение: «could not change trust on certificate».

Дубликат сертификата на внутреннем токене при желании можно удалить.

Для удаления сертификата с любого токена используется следующая команда:

$certutil -D [-d <хранилище NSS>] -n <nickname-сертификата>

Например, для удаления с токена RuTokenECP20 сертификата с меткой (CKA_LABEL) «Пользователь1» достаточно выполнить следующую команду:

$certutil -D -d /home/a513/tmp/TEST_NSS -n "RuTokenECP20:Пользователь1"


При удалении сертификата его закрытый ключ не удаляется (если он есть, конечно). Для удаления закрытого ключа надо выполнить команду вида:

$certutil -F [-k <тип ключа>] [-d <хранилище NSS>] -n <nickname-сертификата>, где
<тип ключа> := rsa|dsa|ec

Теперь, когда у нас имеется хранилище NSS, токены с личными сертификатами, можно поработать и с электронной подписью.

Оцените статью
ЭЦП Эксперт
Добавить комментарий