OpenSSL et les services de sécurité réseau (NSS) sont les deux faces d'une même médaille

imageDe quelle médaille parle le titre? Nous parlons d' infrastructure à clé publique (Public Key Infrastructure - PKI / IEC) sur la base de normes de cryptographie à clé publique (les normes de cryptographie à clé publique - le PKCS). L'infrastructure à clé publique comprend de nombreux objets et mécanismes différents pour travailler avec eux, ainsi que des protocoles pour l'interaction des objets les uns avec les autres (par exemple, TLS, OCSP). Les objets PKI / PKI comprennent des certificats x509 et des paires de clés (clés privées et publiques), des documents signés et chiffrés (pkcs # 7, CMS), des conteneurs sécurisés pour stocker des clés privées (pkcs # 8) et des certificats privés avec des clés (pkcs # 12), etc. Les mécanismes incluent non seulement des fonctions cryptographiques qui vous permettent de crypter et signer des documents à l'aide de divers algorithmes, mais également des fonctions qui forment des objets finaux PKI conformément aux normes (certificats, demandes, documents signés / cryptés, packages de protocoles, etc., etc.) .P.). Oui, et comment ne pas se souvenir de l'objet PKI / PKI central -Centre de certification (CA).



Tout internaute, à son insu, utilise divers mécanismes et objets PKI / PKI, par exemple le protocole HTTPS lors de l'accès à divers sites, lorsqu'il signe et / ou crypte ses e-mails ou utilise une signature électronique dans le workflow.

Les outils les plus avancés pour créer une infrastructure à clé publique, les outils logiciels PKI / PKI sont OpenSSL et Network Security Services (NSS).

OpenSSL est un ensemble de bibliothèques et d'utilitaires cryptographiques open source à part entière qui prend en charge presque tous les algorithmes de hachage de bas niveau, de cryptage et de signature électronique, et implémente également la plupart des normes cryptographiques populaires, notamment: vous permet de créer des clés RSA, DH, DSA, EC, problème Certificats X.509, chiffrez et signez les données et créez des connexions SSL / TLS.

Il est à noter que les objets avec lesquels l'utilitaire OpenSSL fonctionne sont stockés dans des fichiers (certificats, clés). Les services de sécurité réseau (NSS) sont le



même ensemble de bibliothèques et d'utilitaires cryptographiques open source à part entière .



La principale différence entre OpenSSL et NSS est qu'OpenSSL suppose que les certificats et les clés sont stockés dans des fichiers, tandis que NSS utilise les bases de données et les jetons PKCS # 11 pour stocker les certificats et les clés .

Le plus important est que les deux projets (OpenSSL et NSS) respectent strictement les normes et qu'il n'y a donc aucun problème lorsqu'ils sont utilisés ensemble dans différents projets. Un tel bon exemple de leur commonwealth peut servir, par exemple, l'utilisation du protocole HTTPS, lorsque les sites / portails sont construits sur la base d'Apache avec mod_ssl basé sur OpenSSL, et que l'accès à eux se fait, par exemple, via Firefox, qui prend en charge TLS 1.0 / TLS 1.2 et TLS 1.3 réalisée à l'aide des bibliothèques NSS.



Il sera montré ci-dessous comment les utilitaires OpenSSL et NSS peuvent être utilisés pour résoudre les mêmes problèmes. À l'avenir, chacun pourra utiliser les utilitaires à son goût.

N'importe qui peut se familiariser avec les fonctions de la bibliothèque en regardant le code source de tel ou tel utilitaire.



Afficher les certificats et autres entités stockés dans des fichiers



Il existe un utilitaire dans le package OpenSSL - openssl , dont le premier paramètre est la commande elle-même (commandes standard), qui doit être exécutée:



Aide $ openssl
Standard commands
asn1parse         ca                ciphers           cms               
crl               crl2pkcs7         dgst              dhparam           
dsa               dsaparam          ec                ecparam           
enc               engine            errstr            exit              
gendsa            genpkey           genrsa            help              
list              nseq              ocsp              passwd            
pkcs12            pkcs7             pkcs8             pkey              
pkeyparam         pkeyutl           prime             rand              
rehash            req               rsa               rsautl            
s_client          s_server          s_time            sess_id           
smime             speed             spkac             srp               
ts                verify            version           x509              

Message Digest commands (see the `dgst' command for more details)
blake2b512        blake2s256        gost              md2               
md4               md5               rmd160            sha1              
sha224            sha256            sha384            sha512            

Cipher commands (see the `enc' command for more details)
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb       
aes-256-cbc       aes-256-ecb       base64            bf                
bf-cbc            bf-cfb            bf-ecb            bf-ofb            
camellia-128-cbc  camellia-128-ecb  camellia-192-cbc  camellia-192-ecb  
camellia-256-cbc  camellia-256-ecb  cast              cast-cbc          
cast5-cbc         cast5-cfb         cast5-ecb         cast5-ofb         
des               des-cbc           des-cfb           des-ecb           
des-ede           des-ede-cbc       des-ede-cfb       des-ede-ofb       
des-ede3          des-ede3-cbc      des-ede3-cfb      des-ede3-ofb      
des-ofb           des3              desx              idea              
idea-cbc          idea-cfb          idea-ecb          idea-ofb          
rc2               rc2-40-cbc        rc2-64-cbc        rc2-cbc           
rc2-cfb           rc2-ecb           rc2-ofb           rc4               
rc4-40            rc5               rc5-cbc           rc5-cfb           
rc5-ecb           rc5-ofb           seed              seed-cbc          
seed-cfb          seed-ecb          seed-ofb          zlib              
$ 




Comme vous pouvez le voir, lorsque la commande d'aide openssl est exécutée, en plus de la liste des commandes elle-même, une liste des algorithmes de hachage et de chiffrement pris en charge s'affiche (la liste comprend également les fonctions de compression et base64).



Pour afficher le certificat (x509), la requête (req) ou la liste de révocation de certificat (crl), exécutez simplement la commande suivante:



openssl x509 [| req | crl] [-nameopt utf8] -inform PEM | DER -noout -in <nom de fichier> ...



Par exemple, la commande:



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


affichera sur l'écran de l'ordinateur le contenu du certificat sous forme technique (x509 -text) stocké dans le fichier cert.pem (-in cert.pem) encodé en PEM (base64) (-inform PEM) et contenant des caractères en encodage utf-8 (-nameopt utf8). Dans ce cas, le certificat lui-même en codage PEM ne sera pas affiché à l'écran (-noout).



Dans le package NSS, l' utilitaire pp fait de même .



L'utilitaire pp est un utilitaire Pretty Print pour un fichier contenant une structure ASN.1 en encodage DER ou PEM:



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

  • c - certificat;
  • cr - demande de certificat;
  • pk - clé publique;
  • pk - fichier de clé publique;
  • crl - liste des certificats révoqués.


Notez un autre type qui s'applique aux certificats, ci (certificat-identité). Ce type vous permet d'obtenir des informations d'identification du certificat, telles que le sujet (propriétaire), l'émetteur (éditeur), le numéro de série (numéro de série), l'empreinte digitale (empreintes digitales SHA-1 et SHA-256). L'utilitaire openssl pour x509 a des paramètres similaires.



Par défaut, tous les objets sont supposés être codés DER. Si les objets sont en codage PEM, alors le paramètre "-a" doit être spécifié (analogue au paramètre "-inform PEM" pour l'utilitaire openssl). Et un autre paramètre "-u" est défini si l'objet contient des caractères en codage UTF-8. Rappelez-vous que l'utilitaire openssl a un paramètre similaire - "-nameopt utf8".



Le package NSS contient également un utilitaire pour visualiser la structure ASN.1 d'un objet, un analogue de l'utilitaire openssl asn1.parse. Voici l'utilitaire derdump:



$derdump -i < > [-o < >]


Du nom même de l'utilitaire, il s'ensuit qu'il fonctionne avec des fichiers au format codé DER. Mais ça va. Le package comprend deux utilitaires qui convertissent les fichiers du codage PEM / BASE64 au codage DER et vice versa. Ce sont les utilitaires atob et btoa.



Par exemple, pour convertir un certificat du format PEM au format DER dans OpenSSL, exécutez la commande suivante:



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


Dans NSS, cela ressemblerait à ceci:



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


L'option "-w" spécifie le texte à inclure au début et à la fin du fichier de sortie. Dans ce cas, "-w ​​CERTIFICATE" se traduira par l'en-tête et la fin de la norme OpenSSL PEM:



-----BEGIN CERTIFICATE-----
<    BASE64>
-----END CERTIFICATE----- 


OpenSSL et NSS peuvent tous deux fonctionner avec les conteneurs pkcs # 12. Et ils permettent tous les deux non seulement de créer, mais aussi de visualiser le contenu du conteneur pkcs12. Mais, lorsque vous utilisez l'utilitaire openssl, vous devez d'abord démonter le conteneur et enregistrer les certificats du conteneur dans des fichiers séparés. Après cela, vous pouvez les afficher en toute sécurité. Dans NSS, la visualisation du contenu d'un conteneur peut être effectuée en un seul passage. Pour ce faire, utilisez l'utilitaire pk12util de la forme suivante:



pk12util -l <   pkcs12> [-W <   pkcs12>] [-d <  NSS>] [-h <>]


Par exemple:



$ pk12util -l cert_RSA.p12 -W 01234567
Certificate(has private key):
    Data:
        Version: 3 (0x2)
        Serial Number: 3 (0x3)
        Signature Algorithm: PKCS #1 SHA-1 With RSA Encryption
        Issuer: "CN=CA-RSA"
        Validity:
            Not Before: Thu May 21 09:50:00 2020
            Not After : Fri May 21 16:17:00 2021
        Subject: "CN=soft.lissi.ru"
        Subject Public Key Info:
            Public Key Algorithm: PKCS #1 RSA Encryption
            RSA Public Key:
                Modulus:
                    a2:f3:e1:63:fd:4f:60:4e:a9:de:56:37:a6:be:54:f3:
                    3d:67:9a:68:9e:f1:47:69:e3:3a:10:b0:2e:88:0c:ef:
                    7c:7f:48:47:6b:c0:75:63:c7:13:23:88:9a:ff:9a:48:
                    30:6a:a0:52:53:6f:4e:e5:84:c0:a1:b0:50:a2:ab:3d:
                    f9:62:2c:d8:30:be:19:1b:c9:f4:b8:20:57:a1:8e:5e:
                    61:8c:a7:50:91:44:61:99:71:40:bb:dc:4c:b7:7c:67:
                    be:a0:71:26:9f:af:dd:69:63:84:7d:93:3f:92:1b:fb:
                    d1:78:d7:95:75:42:8e:14:a8:63:e2:7b:7d:ef:c8:74:
                    35:7c:39:44:82:ad:92:1f:98:0e:91:95:c8:d8:bd:41:
                    fc:44:7e:4d:f5:94:d1:cc:25:ea:df:69:d7:b1:d7:86:
                    ad:4d:03:f1:35:65:03:a6:84:f8:26:6e:9b:d3:c9:67:
                    d5:a5:a4:9e:c7:82:76:28:9f:90:14:f1:16:6a:29:5d:
                    f8:df:c6:6c:e4:21:0d:6f:c5:87:61:a0:65:e3:97:0f:
                    96:42:ad:7d:96:79:ef:1d:ab:6c:e3:a0:da:3a:65:d8:
                    39:69:f3:20:e2:b1:27:fe:cb:4c:8c:0c:f5:76:f2:65:
                    a0:c7:bb:08:b0:f5:50:c0:96:8a:30:e9:75:f7:56:65
                Exponent: 65537 (0x10001)
        Signed Extensions:
            Name: Certificate Basic Constraints
            Critical: True
            Data: Is not a CA.

            Name: Certificate Key Usage
            Usages: Digital Signature
                    Non-Repudiation
                    Key Encipherment

            Name: Certificate Subject Alt Name
            DNS name: "lissi.ru"

            Name: Certificate Type
            Data: <SSL Server>

            Name: Certificate Comment
            Comment: "xca certificate"

    Signature Algorithm: PKCS #1 SHA-1 With RSA Encryption
    Signature:
        12:8c:c3:7e:e9:18:5a:d7:ee:f8:10:8b:72:55:ba:ee:
        8b:85:6c:aa:e3:de:58:26:a2:da:15:c6:3b:15:d9:82:
        6d:02:33:16:cc:0c:84:9d:96:b0:67:d4:63:10:b5:42:
        a1:c3:de:cb:40:6f:9b:9b:eb:c1:98:b6:66:55:ae:88:
        56:14:02:5c:62:8c:bc:22:97:94:cf:53:da:2e:47:c1:
        c6:83:dc:39:6f:0b:b8:39:4e:66:89:a3:9d:51:c6:e3:
        bd:fc:9e:f3:7b:02:a4:77:bc:08:4e:89:e6:57:54:5c:
        c1:cc:83:93:9e:4e:f5:41:4e:b5:13:bc:64:29:a9:8d:
        ce:13:ae:48:6c:21:fc:da:2a:a2:87:67:f8:df:23:53:
        08:a3:11:93:69:91:84:40:4b:58:c1:f3:d0:78:dc:33:
        f6:a5:a6:6f:ed:39:a9:ec:f3:48:e8:06:09:4c:c3:9f:
        9c:0f:58:80:7f:f5:09:40:2a:f1:cf:42:d7:5b:57:62:
        99:e7:dc:a5:31:f3:9d:1f:5a:88:c2:30:1b:8c:ec:69:
        8b:87:dc:4c:08:9e:70:49:3d:5e:7b:8f:6f:98:50:8b:
        0d:b9:8f:c1:7e:9b:1f:c2:76:3a:ca:c5:e3:3d:ea:93:
        81:c0:3b:e2:b7:d1:5d:e4:fd:48:d6:1b:8f:96:e2:18
    Fingerprint (SHA-256):
        D3:38:99:C9:8B:A5:49:96:BC:26:7B:10:1E:2A:7C:4B:55:15:E5:94:47:C6:D0:49:44:2E:48:58:1B:CF:83:7E
    Fingerprint (SHA1):
        D5:26:80:B7:CE:40:5B:54:85:F6:B2:31:58:C3:3E:9D:A4:3D:C1:F3

    Friendly Name: soft.lissi.ru

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
        Signature Algorithm: PKCS #1 SHA-1 With RSA Encryption
        Issuer: "CN=CA-RSA"
        Validity:
            Not Before: Wed May 20 16:12:00 2020
            Not After : Tue May 21 16:12:00 2030
        Subject: "CN=CA-RSA"
        Subject Public Key Info:
            Public Key Algorithm: PKCS #1 RSA Encryption
            RSA Public Key:
                Modulus:
                    a3:ca:c1:3b:ac:17:1b:32:69:90:8c:70:3b:95:3e:78:
                    4c:90:55:27:2a:25:05:16:54:d3:88:69:b0:43:a0:20:
                    3d:ca:0d:a2:f9:a5:2f:8c:e1:69:b6:df:79:bd:25:7d:
                    aa:71:2b:f2:9f:82:f1:e7:49:cf:fa:3c:b6:6f:80:09:
                    b2:ee:d5:18:e3:3d:96:67:38:cb:9c:e8:e5:76:c4:a8:
                    0b:b9:ad:dd:42:25:c7:da:cf:d4:15:41:bf:b0:0e:4f:
                    d1:9c:b7:d0:b1:32:a0:c7:14:67:ba:a2:9a:e7:23:26:
                    d7:7e:32:d9:5d:15:47:9e:4b:b0:b1:8b:04:38:1e:c3:
                    b2:fc:17:fe:8e:d1:cb:de:de:fd:13:17:b3:0e:5b:58:
                    e1:37:c7:12:32:b6:94:82:77:b8:4c:87:99:c6:c3:7d:
                    51:ed:3c:41:73:31:aa:13:de:26:84:e7:f7:a9:34:e9:
                    b3:9e:7d:aa:91:65:79:a7:14:9d:fc:45:42:de:e6:43:
                    9d:67:96:94:66:38:0b:2e:32:0a:4d:c3:3d:14:b9:06:
                    6b:e0:92:e2:35:0c:8f:78:7f:2c:ad:ec:dc:67:66:0b:
                    8c:47:82:c5:0e:39:a5:35:75:b5:fb:7f:2d:07:97:ef:
                    15:d8:fc:d4:72:6a:da:32:86:9e:64:ea:4a:e3:37:5b
                Exponent: 65537 (0x10001)
        Signed Extensions:
            Name: Certificate Basic Constraints
            Critical: True
            Data: Is a CA with no maximum path length.

            Name: Certificate Key Usage
            Usages: Certificate Signing
                    CRL Signing

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

            Name: Certificate Comment
            Comment: "xca certificate"

    Signature Algorithm: PKCS #1 SHA-1 With RSA Encryption
    Signature:
        24:90:ac:91:3f:13:f6:1a:d4:3c:1b:de:33:e1:4a:0c:
        d8:27:a0:00:d2:43:c8:1b:13:90:93:d3:d2:f0:fe:79:
        da:14:fd:34:2e:3a:f4:fc:c8:71:c9:4f:0d:65:c0:fd:
        40:04:92:ef:7e:72:35:09:4a:08:1e:ed:21:53:06:03:
        73:f9:13:e7:a3:9c:e2:17:9c:25:b2:a5:f9:dc:07:7d:
        32:9f:cd:82:85:6c:26:79:dd:ee:e7:31:4e:10:55:19:
        d6:ac:1e:70:39:01:d2:37:00:3b:41:de:a9:c2:bd:bf:
        b4:c1:f8:8d:bd:d4:6b:95:6d:53:f3:17:76:40:d4:05:
        a4:1e:69:e8:54:92:91:bf:89:b6:ba:45:c5:14:89:bb:
        f4:44:cf:91:ca:16:44:55:86:8f:b9:37:4e:9e:9e:04:
        cd:48:e7:57:ec:c8:e2:72:f3:df:34:49:0a:9b:3f:67:
        a4:01:dd:f3:a3:bb:ec:b5:b8:20:f5:7e:45:8e:ae:53:
        7e:b8:92:38:0a:b7:41:8e:81:15:ab:72:42:f7:37:4a:
        6d:d7:4f:aa:0a:99:ee:9b:49:16:54:03:42:d6:fe:c1:
        ee:63:71:28:b1:84:c2:e6:d4:7b:f6:10:4c:a0:7a:39:
        9d:03:30:ff:78:24:ce:5b:ac:fe:ac:6d:f6:61:77:a6
    Fingerprint (SHA-256):
        AA:1F:B9:29:D2:F9:CC:AB:3D:F7:8C:26:26:4B:51:A3:71:01:1A:94:F8:FE:47:1D:BD:E3:72:DD:63:17:FE:6C
    Fingerprint (SHA1):
        B3:7A:A1:65:01:E2:A0:09:F4:55:17:EC:40:88:5C:42:9A:45:F5:36

Key(shrouded):
    Friendly Name: soft.lissi.ru

    Encryption algorithm: PKCS #12 V2 PBE With SHA-1 And 3KEY Triple DES-CBC
        Parameters:
            Salt:
                08:0b:8d:be:fa:fc:a5:a3
            Iteration Count: 2048 (0x800)
$




L'utilité est pratique, mais pas sans une mouche dans la pommade. La mouche dans la pommade est que les lettres russes, ou plutôt l'encodage UTF-8, sont affichées sous forme de points (.....). Et si l'utilitaire pp a le paramètre -u (l'encodage utf-8 est présent), alors ils l'ont oublié ici (nous y reviendrons en considérant l'utilitaire certutil). Il n'est pas difficile de résoudre ce problème: il suffit d'ajouter une ligne à la fonction P12U_ListPKCS12File située dans le fichier pk12util.c:

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);

.   .   .   .   .

}


Après cela, il n'y aura plus de problèmes avec les lettres russes.
$ 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: «E=ca@test.ru,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: «E=test@rsa.ru,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: «E=ca@test.ru,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: «test@rsa.ru»



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: «E=ca@test.ru,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: «E=ca@test.ru,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)

$



Lors de la création d'un conteneur PKCS # 12 avec l'utilitaire openssl, nous avons utilisé le shell graphique CAFL63 :







il est maintenant temps de parler du référentiel NSS.



Stockage NSS



Le référentiel NSS est le répertoire qui stocke les trois bases de données.



La base de données (DB) cert8.db / cert9.db stocke les certificats. La base de données key3.db / key4.db stocke les clés privées. Enfin, la base de données secmod.db / pkcs11.txt stocke des informations (principalement le chemin d'accès à la bibliothèque) qui vous permettent de travailler avec des jetons / cartes à puce / clouds tiers avec l'interface PKCS # 11 .



L'utilitaire modutil est conçu pour créer un référentiel NSS au format suivant:



modutil -create -force [-dbdir < NSS>] , 
< NSS> := [<  >:]<  NSS>
<  > := dbm|sql , :
$modutil -create -force -dbdir "sql:/~/TEST_NSS"


Le type de base de données dbm suppose la création de bases de données Berkeley (cert8.db, key3.db et secmod.db). Le type sql suppose la création de bases de données SQLite3 (cert9.db, key9.db et un fichier texte pkcs11.txt). Les bases de données SQLite3 sont créées par défaut. Le répertoire du référentiel NSS doit être créé à l'avance. Par défaut (sauf si le paramètre -dbdir ou -d est spécifié), le magasin ".netscape" dans le dossier personnel de l'utilisateur est utilisé. Ce stockage est utilisé, par exemple, par le navigateur google-chrome.



Il est également facile de créer un magasin dans un nouveau format (SQLite3) (cert9.db, key4.db et pkcs11.txt) à partir de l'ancien magasin de certificats (DBM) (cert8.db, key3.db et secmod.db). Pour ce faire, exécutez simplement l'utilitaire de travail avec des certificats certutil en mode d'affichage des clés (-K) ou des certificats (-L) avec le paramètre -X, par exemple:



$certutil -K -X -d ~/TEST_NSS


ou



$certutil -L -X -d ~/TEST_NSS


Notez que de tels référentiels sont disponibles dans tous les projets construits sur NSS, y compris Firefox, Thunderbird, Seamonkey, GoogleChrome, LibreOffice .



Après avoir créé le stockage NSS, le «module NSS Internal PKCS # 11» intégré avec deux jetons intégrés devient automatiquement disponible:



$modutil -list -dbdir ~/TEST_NSS
Listing of PKCS #11 Modules
-----------------------------------------------------------
  1. NSS Internal PKCS #11 Module
           uri: pkcs11:library-manufacturer=Mozilla%20Foundation;library-description=NSS%20Internal%20Crypto%20Services;library-version=3.52
         slots: 2 slots attached
        status: loaded

         slot: NSS Internal Cryptographic Services
        token: NSS Generic Crypto Services
          uri: pkcs11:token=NSS%20Generic%20Crypto%20Services;manufacturer=Mozilla%20Foundation;serial=0000000000000000;model=NSS%203

         slot: NSS User Private Key and Certificate Services
        token: NSS Certificate DB
          uri: pkcs11:token=NSS%20Certificate%20DB;manufacturer=Mozilla%20Foundation;serial=0000000000000000;model=NSS%203
-----------------------------------------------------------
$


Le jeton «NSS Generic Crypto Services» implémente des fonctions et mécanismes cryptographiques, et le jeton «NSS Certificate DB» est conçu pour stocker des certificats et des clés et d'autres informations supplémentaires (par exemple, sur la confiance des certificats racine). Le jeton «NSS Certificate DB» (jeton NSS interne) utilise la base de données cert8.db / cert9.db pour stocker les certificats et stocke les clés privées dans la base de données key3.db / key4.db.



Vous pouvez obtenir des informations sur les jetons intégrés du module NSS Internal PKCS # 11, y compris les mécanismes cryptographiques pris en charge par défaut, en exécutant la commande suivante:



$ modutil -list 'Module PKCS # 11 interne NSS' -dbdir ~ / TEST_NSS
— Name: NSS Internal PKCS #11 Module

Library file: **Internal ONLY module**

Manufacturer: Mozilla Foundation

Description: NSS Internal Crypto Services

PKCS #11 Version 3.0

Library Version: 3.52

Cipher Enable Flags: None

Default Mechanism Flags: RSA:ECC:DH:RC2:RC4:DES:AES:CAMELLIA:SEED:SHA1:SHA256:SHA512:MD5:MD2:SSL:TLS



Slot: NSS Internal Cryptographic Services

Slot Mechanism Flags: RSA:ECC:DH:RC2:RC4:DES:AES:CAMELLIA:SEED:SHA1:SHA256:SHA512:MD5:MD2:SSL:TLS

Manufacturer: Mozilla Foundation

Type: Software

Version Number: 3.52

Firmware Version: 1.0

Status: Enabled

Token Name: NSS Generic Crypto Services

Token Manufacturer: Mozilla Foundation

Token Model: NSS 3

Token Serial Number: 0000000000000000

Token Version: 4.0

Token Firmware Version: 0.0

Access: Write Protected

Login Type: Public (no login required)

User Pin: NOT Initialized



Slot: NSS User Private Key and Certificate Services

Slot Mechanism Flags: None

Manufacturer: Mozilla Foundation

Type: Software

Version Number: 3.52

Firmware Version: 1.0

Status: Enabled

Token Name: NSS Certificate DB

Token Manufacturer: Mozilla Foundation

Token Model: NSS 3

Token Serial Number: 0000000000000000

Token Version: 0.0

Token Firmware Version: 0.0

Access: NOT Write Protected

Login Type: Public (no login required)

User Pin: Initialized

— $



La connexion d'un module supplémentaire pour travailler avec des périphériques PKCS # 11 externes est effectuée par le même utilitaire modutil:



$modutil -add < > -libfile <  > [-dbdir < NSS>]


Par exemple, pour travailler avec des jetons RUToken prenant en charge la cryptographie russe, exécutez simplement la commande suivante:



$modutil -add "ruTokenECP" -libfile /usr/lib64/librtpkcs11ecp_2.0.so -dbdir $HOME/.netscape 


Pour obtenir une liste des modules prenant en charge un référentiel NSS particulier, avec des informations sur chaque module (bibliothèque, liste des emplacements pris en charge et des jetons qui y sont connectés), exécutez la commande suivante:



$modutil -list [-dbdir < NSS>]


Pour obtenir des informations complètes sur les jetons connectés pour un module spécifique, vous devrez exécuter la commande suivante:



$modutil -list < > [-dbdir < NSS>]


Nous l'avons déjà utilisé lorsque nous avons reçu des informations sur les jetons NSS intégrés (internes).

Et, si vous pouvez ajouter un module, vous pouvez également supprimer le module de la base de données:



$modutil -delete < > [-dbdir < NSS>] 


L'accès aux jetons externes est généralement protégé par code PIN . Par défaut, l'accès au jeton de base de données de certificat NSS intégré n'est pas protégé par mot de passe (code PIN). Mais il n'est pas difficile de l'établir, par exemple:



$modutil -dbdir $HOME/.netscape -changepw "NSS Certificate DB"  


De la même manière, vous pouvez modifier le code PIN du jeton externe.



Il est maintenant temps de passer au travail avec les jetons, leurs mécanismes et leurs objets.



Accès aux objets Token PKCS # 11



L'utilitaire certutil permet d'accéder aux objets (clés, certificats) des jetons PKCS # 11. Notez que l'utilitaire certutil est aussi fonctionnel que l'utilitaire openssl. Pour afficher les fonctionnalités de l'utilitaire certutil, exécutez simplement la commande:



$certutil -H


Mais maintenant, nous ne sommes intéressés que par l' accès aux certificats et aux clés . Rappelez-vous que lorsqu'ils sont stockés sur un jeton PKCS # 11, les deux sont généralement affectés aux attributs CKA_ID et CKA_LABEL. Pour afficher la liste des certificats sur un jeton particulier, exécutez la commande suivante:



$certutil -L [-d < NSS>] [-h < >]


L'étiquette de jeton réelle ou l'un des mots-clés - tous ou internes - peut être spécifiée comme étiquette de jeton. Dans le premier cas (token label all), tous les tokens connectés au stockage NSS sont recherchés, et dans le second cas (interne ou "NSS Certificate DB"), le token interne du stockage "NSS Certificate DB" sera visualisé.



Par exemple, pour obtenir une liste de certificats sur un jeton intitulé "LS11SW2016", dont le module d'accès est enregistré dans le référentiel NSS "/ home / a513 / tmp / TEST_NSS", exécutez la commande suivante:



$ certutil -L -d /home/a513/tmp/TEST_NSS -h "LS11SW2016"
Enter Password or Pin for "LS11SW2016":
Certificate Nickname                                  Trust Attributes
                                                      SSL,S/MIME,JAR/XPI
LS11SW2016:TestCA_P11                                 u,u,u
LS11SW2016:clientnss from CryptoArmPKCS               u,u,u
LS11SW2016:                                   u,u,u
LS11SW2016:Thenderbird-60.3.0 from 32                 u,u,u
LS11SW2016:  from  12_512             u,u,u
LS11SW2016:Text4Key                                   u,u,u
LS11SW2016:KmailKleopatra  GnuPG-2001               u,u,u
LS11SW2016:setvernss from CryptoArmPKCS               u,u,u
LS11SW2016:   from  12_512                       u,u,u
LS11SW2016:Test 12 512                                u,u,u
LS11SW2016:Kleopatra  GnuPG-2001                    ,,   
$


La liste des certificats sur le jeton est affichée dans deux colonnes. La première colonne donne le surnom du certificat et la seconde contient les attributs de confiance de ce certificat.



De plus, si le certificat a une clé privée sur le jeton où il se trouve, alors cette colonne contiendra la valeur "u, u, u" .



Si les attributs n'ont pas été définis, la colonne contiendra la valeur ",,".



Les certificats avec les attributs de confiance «u, u, u» (ils ont une clé privée) peuvent être utilisés pour l'authentification ou pour générer une signature électronique.



D'autres valeurs d'attribut de confiance peuvent être définies pour les certificats situés sur le jeton "NSS Certificate DB" intégré. Mais plus là-dessus plus tard.



Quel est le surnom d'un certificat dans NSS?



<nickname> := [< >:]<CKA_LABEL>


Pour un jeton interne («NSS Certificate DB»), l'étiquette de jeton dans le surnom peut être manquante.



Si nous considérons les mécanismes des jetons PKCS # 11, nous verrons que les opérations de génération de clés, d'importation de certificats et de clés, en elles-mêmes, ne permettent pas de définir les valeurs des attributs CKA_ID et CKA_LABEL. Tout cela est transféré au développeur du logiciel d'application. Mais, si vous utilisez des utilitaires NSS pour travailler avec des jetons, il s'avère qu'ils prennent le relais.



La commande suivante est utilisée pour afficher la liste des clés privées:



$certutil -K [-d < NSS>] [-h < >]


Ceci imprime le type de clé, clé CKA_ID et CKA_LABEL.



Mais revenons aux certificats. Pour afficher le certificat sur le jeton sous forme de texte, exécutez simplement la commande:



$certutil -L [-d < NSS>] -n <nickname >


Par exemple:



certutil -L -d '/ home / a513 / tmp / TEST_NSS' -n 'DB de certificat NSS: certificat de test'
$ 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: «E=ca@test.ru,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: «E=test@rsa.ru,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: «E=ca@test.ru,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: «test@rsa.ru»



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

$



Si le certificat affiché sur le même jeton a une clé privée, les indicateurs de confiance de certificat seront User:



Certificats de confiance Drapeaux:

Drapeaux SSL:

User

Flags Email:

Utilisateur

Signature objet Drapeaux: l'

utilisateur


Pour exporter un certificat d'un jeton vers la sortie standard, ajoutez simplement un paramètre supplémentaire "-a" ou "-r". L'option "-a" demande de sortir le certificat au format PEM:



$ certutil -L -d '/ home / a513 / tmp / TEST_NSS' -n 'DB de certificat NSS: certificat de test' -a
-----BEGIN CERTIFICATE-----

MIIGiTCCBXGgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwggF2MQswCQYDVQQGEwJS

VTEsMCoGA1UECAwj0JzQvtGB0LrQvtCy0YHQutCw0Y8g0L7QsdC70LDRgdGC0Ywx

GzAZBgNVBAcMEtCl0LDQsdGA0LDQs9GA0LDQtDEqMCgGA1UECQwh0YPQuy4g0KXQ

sNCy0YDQvtCy0YHQutCw0Y8sINC0LiAwMTAwLgYDVQQKDCfQo9C00L7RgdGC0L7Q

stC10YDRj9GO0YjQuNC5INCm0LXQvdGC0YAxOzA5BgNVBAsMMtCe0YLQtNC10Lsg

0KPQtNC+0YHRgtC+0LLQtdGA0Y/RjtGI0LjQuSDQptC10L3RgtGAMTAwLgYDVQQD

DCfQo9C00L7RgdGC0L7QstC10YDRj9GO0YjQuNC5INCm0LXQvdGC0YAxGjAYBggq

hQMDgQMBARIMMjIyMjIyMjIyMjIyMRgwFgYFKoUDZAESDTExMTExMTExMTExMTEx

GTAXBgkqhkiG9w0BCQEWCmNhQHRlc3QucnUwHhcNMjAwNzA3MDg0MDE0WhcNMjEw

ODA2MDg0MDE0WjBMMS4wLAYDVQQDDCXQotC10YHRgtC+0LLRi9C5INGB0LXRgNGC

0LjRhNC40LrQsNGCMRowGAYJKoZIhvcNAQkBFgt0ZXN0QHJzYS5ydTCCASIwDQYJ

KoZIhvcNAQEBBQADggEPADCCAQoCggEBAJqfbGCU9+z3lLNRAeIaxSUouwJ3SVJN

mYpuJhJVj3E0BNo5JPm0a9AKQicbsteb2cN2sOAcfCHOeZ/VKxdjy5Rb2bJT/7m/

Tz3Pt42KN7oCjNrSDf1GW0UdlWQHbvqIDaS9s0rtmfH9c8W2BaDl7mvDg1vQZAV3

ahjYyCih0AZBIw27h4p3FPtsXa/bKwsRoxYbKwUYJqm1AEpA2rMFqipnwBgNA/fS

ubp8NvmVLlaBowmZXiAQlTgQycFvw2ymG3hRxuRPEbzAIkvKWRbyRZUN/XtGz8es

HD3XJvytgD4sIZMpMqZ54qjG6V5FNNM4V4/NlV6RCYQ0IdIWKWl1TaMCAwEAAaOC

AkcwggJDMAwGA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgOoMBEGCWCGSAGG+EIBAQQE

AwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAgYIKwYBBQUHAwQwHQYDVR0OBBYEFCah

s5gc/mK6I4GWNz8IvXDW8rFGMIIBsAYDVR0jBIIBpzCCAaOAFAq29odkHY6zYwgp

nyFZrUfY6gf0oYIBfqSCAXowggF2MQswCQYDVQQGEwJSVTEsMCoGA1UECAwj0JzQ

vtGB0LrQvtCy0YHQutCw0Y8g0L7QsdC70LDRgdGC0YwxGzAZBgNVBAcMEtCl0LDQ

sdGA0LDQs9GA0LDQtDEqMCgGA1UECQwh0YPQuy4g0KXQsNCy0YDQvtCy0YHQutCw

0Y8sINC0LiAwMTAwLgYDVQQKDCfQo9C00L7RgdGC0L7QstC10YDRj9GO0YjQuNC5

INCm0LXQvdGC0YAxOzA5BgNVBAsMMtCe0YLQtNC10Lsg0KPQtNC+0YHRgtC+0LLQ

tdGA0Y/RjtGI0LjQuSDQptC10L3RgtGAMTAwLgYDVQQDDCfQo9C00L7RgdGC0L7Q

stC10YDRj9GO0YjQuNC5INCm0LXQvdGC0YAxGjAYBggqhQMDgQMBARIMMjIyMjIy

MjIyMjIyMRgwFgYFKoUDZAESDTExMTExMTExMTExMTExGTAXBgkqhkiG9w0BCQEW

CmNhQHRlc3QucnWCCQCimyIyPqc92DAWBgNVHREEDzANgQt0ZXN0QHJzYS5ydTAJ

BgNVHRIEAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQAvdX5xnhVcl/6i4SpSOVZV4GJg

vF9twrbszYsQs7E/5dbRX6X6YcHOPttqL7ITRo1nzxgJYZcBRbyZuwzWCqMDhwqO

EDrV45RtSiT6w0ALQ8I7AFYGxNL8sn7pAOUvS+I6kUnO+MNg7AF02Bo7r+b2kdvF

8dfevhg4R0GK4u+AkRBUQa5VIm/XjPpGtrYq7moMyQMYr06TbGHztHgMYZPx2BsA

w+UpmggK+DFniD3DiHpgwMRSlCVW5aPffVjF35rHIn4s9vssv7d/xcorD4wgd7kf

4GJaPdRvEurIUWelda3prJ5OLi00gOfYZPaPLzMyH4u8nOh3Su57hDHsKOlw

-----END CERTIFICATE-----



Pour la sortie DER, utilisez le paramètre "-r".



Installer un certificat pour un jeton



Supposons que vous ayez un conteneur PKCS # 12 avec un certificat personnel et une clé privée que vous avez générés à l'aide d'OpenSSL. Pour exporter un certificat personnel vers le référentiel NSS, utilisez la commande pk12util qui ressemble à ceci:



$pk12util -i < pkcs12> [-d < NSS>] [-h < >]


Si vous souhaitez importer un certificat pour un jeton spécifique, vous devez définir son étiquette. Notons une autre fonctionnalité. Si le conteneur contient des certificats racine, ils seront enregistrés sur le jeton interne "NSS Certificate DB". Cela ne définit pas les attributs de confiance par défaut. Si, pour une raison quelconque, il est nécessaire de définir des attributs de confiance pour certains certificats d'autorités d'enregistrement (certificats racine) ou certificats SSL, l'utilitaire certutil de la forme suivante est utilisé:



$certutil -M -n <nickname-> -t < > [-d < NSS>]


Pour chaque certificat, trois catégories d'approbation sont disponibles, exprimées dans l'ordre suivant: SSL, S / MIME, signature de code pour chaque paramètre d'approbation:



< > := x,y,z , 


  • x - attributs pour SSL,
  • y - attributs pour S / MIME,
  • z - attributs pour la signature de code.


Chaque position x, y et z peut être vide (utiliser ,, pas de confiance explicite) ou contenir un ou plusieurs attributs:



  • p - pair valide;
  • P - nœud de confiance (implique p)
  • c - certificat valide de l'autorité d'enregistrement (CA valide)
  • T - autorité de certification de confiance pour l'émission de certificats clients (implique c)
  • C - autorité de certification de confiance pour l'émission de certificats de serveur (SSL uniquement) (implicite c)


Notez que tous les jetons externes n'autorisent pas l'opération d'importation d'une clé privée dans un jeton.



Pour installer un certificat simple à partir d'un fichier, utilisez l'utilitaire certutil du formulaire suivant:



$certutil -A -n < > -t < > [-d < NSS>] [-h < >] [-a] [-i <  >]


Malheureusement, dans ce contexte, <label de certificat> n'est pas équivalent au surnom de certificat décrit ci-dessus. Ici, l'étiquette du certificat correspond uniquement à CKA_LABEL, uniquement aux étiquettes sans spécifier d'étiquette de jeton. Une sorte d'incohérence.



Par défaut, le certificat est supposé se trouver dans un fichier encodé DER. Si le certificat est codé PEM, le paramètre "-a" doit être spécifié. Si le paramètre "-i" n'est pas spécifié, alors le certificat sera extrait de l'entrée standard (stdin). Par défaut, les certificats sont installés sur le jeton «NSS Certificate DB», mais vous pouvez installer le certificat sur un jeton externe (paramètre «-h»). Lors de l'installation d'un certificat sur un jeton externe, le certificat sera installé à la fois sur le jeton interne («NSS Certificate DB») et sur le jeton externe. Dans ce cas, les attributs de confiance pour le jeton externe seront ignorés et un avertissement sera émis: «Impossible de modifier la confiance sur le certificat».



Un certificat en double sur un jeton interne peut être supprimé si vous le souhaitez.



Pour supprimer un certificat de n'importe quel jeton, utilisez la commande suivante:



$certutil -D [-d < NSS>] -n <nickname->


Par exemple, pour supprimer le certificat avec l'étiquette (CKA_LABEL) "User1" du jeton RuTokenECP20, exécutez simplement la commande suivante:



$certutil -D -d /home/a513/tmp/TEST_NSS -n "RuTokenECP20:1"


Lorsque vous supprimez un certificat, sa clé privée n'est pas supprimée (s'il y en a une, bien sûr). Pour supprimer une clé privée, vous devez exécuter une commande du formulaire:



$certutil -F [-k < >] [-d < NSS>] -n <nickname->, 
< > := rsa|dsa|ec


Maintenant que nous avons un référentiel NSS, des jetons avec des certificats personnels, nous pouvons travailler avec une signature électronique.



Formation et vérification de la signature électronique



Il existe trois utilitaires pour travailler avec des signatures numériques dans le package NSS.



L'utilitaire p7sign permet de générer une signature électronique:



$pksign -k <nickname  > [-d < NSS>] [-e] [-i <  >] [-o <   >], 
<nickname  > := [< >:]<CKA_LABEL>


Malheureusement, l'utilitaire génère une signature sans référence au moment de sa formation. Mais cela est facilement résolu. Il suffit d'ajouter une ligne à la fonction SignFile dans l'utilitaire p7sign.c avec un appel à la fonction pour ajouter l'heure de génération de signature:



SignFile(FILE *outFile, PRFileDesc *inFile, CERTCertificate *cert,
         PRBool encapsulated)
{  
. . . 
    /* XXX Need a better way to handle that usage stuff! */
    cinfo = SEC_PKCS7CreateSignedData(cert, certUsageEmailSigner, NULL,
                                      SEC_OID_SHA1,
                                      encapsulated ? NULL : &digest,
                                      NULL, NULL);
    if (cinfo == NULL)
        return -1;
/*   */
    SEC_PKCS7AddSigningTime(cinfo);

    if (encapsulated) {
        SEC_PKCS7SetContent(cinfo, (char *)data2sign.data, data2sign.len);
    }
 . . . 
}


Désormais, une signature électronique sera générée au format CAdes-BES.



Il est admis dans NSS que le certificat et sa clé privée sont stockés sur le même jeton et que leurs étiquettes (CKA_LABEL), ainsi que CKA_ID, sont les mêmes. En conséquence, le surnom de la clé privée et le surnom du certificat lui-même sont identiques. Rappelons que la présence d'une clé privée dans un certificat peut être trouvée par la valeur "u, u, u" des attributs de confiance du certificat visualisé (commande certutil -L).



Par défaut, l'utilitaire p7sign génère une signature détachée. Si une signature ajoutée est requise, le paramètre "-e" doit être spécifié. Il convient de garder à l'esprit que la signature ne sera pas générée si dans le magasin NSS, sur son jeton interne, il n'y a pas de chaîne de certificat racine pour le certificat du signataire ou si leurs attributs de confiance ne sont pas définis.



L'utilitaire p7verify est utilisé pour vérifier la signature électronique:



$p7verify -c < > -s <  > [-d < NSS>] [-u < >] 


Le paramètre "-u" est intéressant. Il demande de vérifier le type du certificat du signataire et s'il ne correspond pas au type spécifié, la signature est invalidée.



La valeur <utilisation du certificat> peut avoir les valeurs suivantes:

0 - certUsageSSLClient

1 - certUsageSSLServer

2 - certUsageSSLServerWithStepUp

3 - certUsageSSLCA

4 - certUsageEmailSigner

5 - certUsageEmailRecipient

6 - certUsageObjectSigner

7 - certUsageUserCertImport

8 - certUsageVerifyCA

9 - certUsageProtectedObjectSigner

10 - certUsageStatusResponder

11 - certUsageAnyCA

12 - certUsageIPsec


La valeur par défaut est certUsageEmailSigner (4).

L'utilitaire p7content vous permet d'obtenir des informations sur l'heure de signature du document, qui l'a signé et l'adresse e-mail du signataire. Si la signature était jointe, le contenu lui-même qui a été signé est également récupéré.



L'utilitaire p7content a le format suivant:



$p7content [-d < NSS>] [-i <  >] [-o < >]


Par exemple:



$ p7content -d "sql:/home/a513/tmp/TEST_NSS" -i "/home/a513/DATE_NSS.txt.p7s"
Content printed between bars (newline added before second bar):

#     ,    "-" ()
#     
---------------------------------------------
  NSS

---------------------------------------------
Content was not encrypted.
Signature is valid.
The signer's common name is  1
The signer's email address is user1@mail.ru
Signing time: Fri Jul 17 10:00:45 2020
There were certs or crls included.
$


Ce ne sont là que quelques-uns des utilitaires inclus dans le package NSS. Naturellement, OpenSSL et NSS ont des utilitaires (ou des commandes) qui vous permettent de créer des demandes de certificat et d'émettre des certificats, c'est-à-dire vous pouvez déployer une autorité de certification entièrement fonctionnelle comme vous le faites avec openssl. Vous pouvez élever le serveur tls avec l'utilitaire selfserv (analogue à openssl s_server) et utiliser le tls-client tstclnt (analogue à openssl s-client) et bien plus encore.



Au fait, vous pouvez obtenir une liste des suites de chiffrement dans NSS avec l'utilitaire de suites de listes. Dans OpenSSL, la commande openssl ciphers sert cet objectif. Le mappage des noms des suites de chiffrement OpenSSL aux noms des combinaisons de chiffrement IANA peut être trouvé ici .



En effet, OpenSSL et NSS sont les deux faces (deux types d'interfaces pour les mêmes protocoles et standards) d'une même médaille - l'infrastructure à clé publique.



S'il y a de l'intérêt pour ce sujet, l'histoire continuera.



En conclusion, je voudrais également m'attarder sur le shell graphique pour NSS. Il existe différents shells graphiques pour OpenSSL. Nous n'en notons que deux - XCA et CAFL63 .



GUI Guinsspy pour le package NSS



La première question est sur quoi développer? Cela a été décidé en Python.



La deuxième question est sur quoi écrire une interface graphique? La réponse est Tkinter.



L'interface graphique a été initialement développée sur PAGE . Mais ensuite, ils se sont éloignés de lui. Mais le contexte est resté.



La fonctionnalité de l'utilitaire est basée sur les utilitaires et les commandes décrits ci-dessus. En plus d'eux, une autre fonction "Créer une demande de certificat" a été ajoutée, basée sur la commande "certutil -R":







il a été décidé d'utiliser le thème Breeze pour python3 et le thème Arc pour python2 comme thème pour les widgets, car ce dernier n'a pas le thème Breeze. Pour ce faire, vous devez installer un package avec des thèmes pour pythona:



$pip install ttkthemes


Nous avons également besoin du package fsb795 pour fonctionner avec les certificats:



$pip install fsb795


Les utilitaires NSS sur lesquels guinsspy est basé demandent très souvent des mots de passe ou des codes PIN via la console. La seule façon d'interagir avec eux via l'interface graphique est d'utiliser le package pexpect:



$pip install pexpect


Comme exemple d'utilisation du package pexpect, voici le code pour importer un conteneur 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)




Une boucle sans fin (while (True) :) dans la procédure attend que l'un des quatre événements se produise:



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


Le premier événement est associé à une invitation à saisir un mot de passe ou un code PIN («Enter Password or Pin»).

Lorsqu'il se produit, une fenêtre de saisie d'un code PIN s'affiche à l'écran (fenêtre de gauche sur la capture d'écran):







Le deuxième événement est associé à la saisie du mot de passe du conteneur PKCS # 12 ("Saisir le mot de passe du fichier PKCS12"). Quand cela se produit, l'écran affiche une fenêtre pour saisir le mot de passe du fichier avec le conteneur PKCS # 12 (fenêtre de droite sur la capture d'écran).



Le troisième événement est associé à la fin de l'utilitaire pk12util (pexpect.EOF), et le quatrième événement est associé à la fin de l'utilitaire par timeout (pexpect.TIMEOUT).



Le code source de guinsspy peut être trouvé ici . Le kit de distribution du package NSS pour travailler avec les jetons PKCS # 11 avec cryptographie russe pour la plate-forme Linux x86_64 peut être trouvé ici.



Pour tester les jetons de cryptage russes, copiez le dossier NSS_GOST_3.52.1_Linux_x86_64 dans votre répertoire de base. Créez un script 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


Maintenant, exécutez ce script et travaillez avec des jetons russes.

Si vous n'avez pas de jeton avec la cryptographie russe à portée de main, accédez à l'onglet "Créer un jeton SW / Cloud", qui vous indiquera comment créer un jeton logiciel sur votre ordinateur ou vous connecter à un jeton cloud :







Et enfin, des captures d'écran de la création d'une







demande de certificat: Demande reçue peut être transféré vers CAFL63 , émis là un certificat, installé sur le jeton sur lequel la clé privée a été créée. Et puis utilisez ce certificat, par exemple, pour signer des documents.



All Articles