OpenSSL و Network Security Services (NSS) وجهان لعملة واحدة

صورةعن أي ميدالية يتحدث العنوان؟ نحن نتحدث عن البنية التحتية للمفتاح العام (البنية التحتية للمفتاح العام - PKI / IEC) على أساس معايير تشفير المفتاح العام (معايير تشفير المفتاح العام - PKCS). تتضمن البنية الأساسية للمفتاح العام العديد من الكائنات والآليات المختلفة للعمل معها ، بالإضافة إلى بروتوكولات تفاعل الكائنات مع بعضها البعض (على سبيل المثال ، TLS ، OCSP). تتضمن كائنات PKI / PKI شهادات x509 وأزواج المفاتيح (المفاتيح الخاصة والعامة) والمستندات الموقعة والمشفرة (pkcs # 7 ، CMS) والحاويات الآمنة لتخزين المفاتيح الخاصة (pkcs # 8) والشهادات الخاصة مع المفاتيح (pkcs # 12) ، إلخ. لا تشمل الآليات وظائف التشفير التي تسمح لك فقط بتشفير المستندات وتوقيعها باستخدام خوارزميات مختلفة ، بل تشمل أيضًا الوظائف التي تشكل كائنات PKI النهائية وفقًا للمعايير (الشهادات والطلبات والمستندات الموقعة / المشفرة وحزم البروتوكول وما إلى ذلك) . P.). نعم ، وكيفية عدم تذكر كائن PKI / PKI المركزي -مركز الاعتماد (CA).



يستخدم أي مستخدم للإنترنت ، عن غير قصد ، آليات وكائنات PKI / PKI مختلفة ، على سبيل المثال ، بروتوكول HTTPS عند الوصول إلى مواقع مختلفة ، عندما يوقع و / أو يشفر رسائل البريد الإلكتروني الخاصة به أو يستخدم التوقيع الإلكتروني في سير العمل.

الأدوات الأكثر تقدمًا لإنشاء البنية التحتية للمفتاح العام ، أدوات برامج PKI / PKI هي OpenSSL وخدمات أمان الشبكة (NSS).

OpenSSL عبارة عن مجموعة من مكتبات وأدوات التشفير مفتوحة المصدر الكاملة التي تدعم جميع خوارزميات التجزئة والتشفير والتوقيع الإلكتروني منخفضة المستوى تقريبًا ، كما تنفذ أيضًا معظم معايير التشفير الشائعة ، بما في ذلك: يسمح لك بإنشاء RSA و DH و DSA ومفاتيح EC والمشكلة شهادات X.509 ، تشفير وتوقيع البيانات وإنشاء اتصالات SSL / TLS.

وتجدر الإشارة إلى أن الكائنات التي تعمل معها أداة OpenSSL المساعدة يتم تخزينها في ملفات (شهادات ، مفاتيح). خدمات أمان الشبكة (NSS) هي



نفس مجموعة مكتبات وأدوات تشفير مفتوحة المصدر كاملة .



يتمثل الاختلاف الرئيسي بين OpenSSL و NSS في أن OpenSSL يفترض تخزين الشهادات والمفاتيح في ملفات ، بينما يستخدم NSS قواعد بيانات ورموز PKCS # 11 لتخزين الشهادات والمفاتيح .

الشيء الأكثر أهمية هو أن كلا المشروعين (OpenSSL و NSS) يلتزمان بدقة بالمعايير وبالتالي لا توجد مشاكل عند استخدامهما معًا في مشاريع مختلفة. يمكن أن يخدم مثل هذا المثال الجيد للكومنولث ، على سبيل المثال ، استخدام بروتوكول HTTPS ، عندما يتم إنشاء المواقع / البوابات على أساس Apache مع mod_ssl على أساس OpenSSL ، ويتم الوصول إليها ، على سبيل المثال ، من خلال Firefox ، الذي يدعم TLS 1.0 / TLS 1.2 و TLS 1.3 نفذت باستخدام مكتبات NSS.



سيظهر أدناه كيف يمكن استخدام الأدوات المساعدة OpenSSL و NSS لحل نفس المشكلات. في المستقبل ، يمكن للجميع استخدام المرافق حسب رغبته.

يمكن لأي شخص التعرف على وظائف المكتبة من خلال النظر في التعليمات البرمجية المصدر لهذه الأداة أو تلك.



عرض الشهادات والكيانات الأخرى المخزنة في الملفات



توجد أداة مساعدة واحدة في حزمة OpenSSL - openssl ، المعلمة الأولى منها هي الأمر نفسه (الأوامر القياسية) ، والتي يجب تنفيذها:



مساعدة $ 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              
$ 




كما ترى ، عند تنفيذ أمر المساعدة openssl ، بالإضافة إلى قائمة الأوامر نفسها ، يتم عرض قائمة بخوارزميات التجزئة المدعومة وخوارزميات التشفير (تتضمن قائمتهم وظائف الضغط و 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 على الشاشة (-لاوت).



في حزمة NSS ، تقوم الأداة المساعدة pp بنفس الشيء .



الأداة المساعدة pp هي أداة مساعدة Pretty Print لملف يحتوي على بنية ASN.1 بترميز DER أو PEM:



Usage:  pp [-t type] [-a] [-i input] [-o output] [-w] [-u],  
حيث النوع:

  • ج - شهادة ؛
  • طلب شهادة cr ؛
  • pk - مفتاح عمومي ؛
  • pk - ملف المفتاح العام ؛
  • crl - قائمة الشهادات الملغاة.


لاحظ نوعًا آخر ينطبق على الشهادات ، ci (هوية الشهادة). يسمح لك هذا النوع بالحصول على معلومات التعريف من الشهادة ، مثل الموضوع (المالك) والمُصدر (الناشر) والرقم التسلسلي (الرقم التسلسلي) والبصمة (بصمات الأصابع SHA-1 و SHA-256). الأداة المساعدة openssl لـ x509 لها معلمات مماثلة.



بشكل افتراضي ، يُفترض أن تكون جميع الكائنات مشفرة DER. إذا كانت الكائنات في ترميز PEM ، فيجب تحديد المعلمة "-a" (على غرار المعلمة "-inform PEM" لأداة openssl). ويتم تعيين معلمة أخرى "-u" إذا كان الكائن يحتوي على أحرف بترميز UTF-8. تذكر أن الأداة المساعدة openssl لها معلمة مماثلة - "-nameopt utf8".



تحتوي حزمة NSS أيضًا على أداة مساعدة لعرض بنية ASN.1 للكائن ، وهو نظير لأداة opensl المساعدة 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" رأس ومقطورة OpenSSL بمعيار PEM:



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


يمكن لكل من OpenSSL و NSS العمل مع حاويات pkcs # 12. وكلاهما لا يسمح بالإنشاء فحسب ، بل يتيح أيضًا عرض محتويات حاوية pkcs12. ولكن ، عند استخدام الأداة المساعدة openssl ، تحتاج أولاً إلى تحليل الحاوية وحفظ الشهادات من الحاوية في ملفات منفصلة. بعد ذلك ، يمكنك مشاهدتها بأمان. في NSS ، يمكن عرض محتويات الحاوية في مسار واحد. للقيام بذلك ، استخدم الأداة المساعدة pk12util من النموذج التالي:



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


على سبيل المثال:



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




الأداة مريحة ، ولكن ليس بدون ذبابة في المرهم. الذبابة في المرهم هي أن الحروف الروسية ، أو بالأحرى ترميز UTF-8 ، يتم عرضها كنقاط (.....). وإذا كانت الأداة المساعدة pp تحتوي على المعلمة -u (يوجد ترميز utf-8) ، فقد نسوا ذلك هنا (سنواجه هذا مرة أخرى عند التفكير في الأداة المساعدة certutil). ليس من الصعب إصلاح هذا: يكفي إضافة سطر واحد إلى وظيفة P12U_ListPKCS12File الموجودة في ملف 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);

.   .   .   .   .

}


بعد ذلك لن تكون هناك مشاكل مع الحروف الروسية.
$ 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)

$



عند إنشاء حاوية PKCS # 12 باستخدام الأداة المساعدة openssl ، استخدمنا الغلاف الرسومي CAFL63 :







حان الوقت الآن للتحدث عن مستودع NSS.



تخزين NSS



مستودع NSS هو الدليل الذي يتم فيه تخزين ثلاث قواعد بيانات.



يتم تخزين شهادات cert8.db / cert9.db في قاعدة البيانات (DB). تخزن قاعدة البيانات key3.db / key4.db المفاتيح الخاصة. وأخيرًا ، تقوم قاعدة البيانات secmod.db / pkcs11.txt بتخزين المعلومات (المسار إلى المكتبة بشكل أساسي) التي تتيح لك العمل مع الرموز المميزة / البطاقات الذكية / السحب الخاصة بطرف ثالث باستخدام واجهة PKCS # 11 .



تم تصميم الأداة المساعدة modutil لإنشاء مستودع NSS بالتنسيق التالي:



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


يفترض نوع قاعدة البيانات dbm إنشاء قواعد بيانات بيركلي (cert8.db و key3.db و secmod.db). يفترض نوع sql إنشاء قواعد بيانات SQLite3 (cert9.db و key9.db وملف نصي pkcs11.txt). يتم إنشاء قواعد بيانات SQLite3 افتراضيًا. يجب إنشاء دليل مستودع NSS مسبقًا. بشكل افتراضي (ما لم يتم تحديد المعلمة -dbdir أو -d) ، يتم استخدام مخزن ".netscape" في المجلد الرئيسي للمستخدم. يتم استخدام هذا التخزين ، على سبيل المثال ، بواسطة متصفح google-chrome.



من السهل أيضًا إنشاء متجر بتنسيق جديد (SQLite3) (cert9.db و key4.db و pkcs11.txt) من مخزن شهادات التنسيق القديم (DBM) (cert8.db و key3.db و secmod.db). للقيام بذلك ، ما عليك سوى تشغيل الأداة المساعدة للعمل مع الشهادات في وضع عرض المفاتيح (-K) أو الشهادات (-L) مع المعلمة -X ، على سبيل المثال:



$certutil -K -X -d ~/TEST_NSS


أو



$certutil -L -X -d ~/TEST_NSS


لاحظ أن هذه المستودعات متوفرة في جميع المشاريع المبنية على NSS ، بما في ذلك Firefox و Thunderbird و Seamonkey و GoogleChrome و LibreOffice .



بعد إنشاء تخزين NSS ، تصبح "NSS Internal PKCS # 11 Module" المدمجة مع اثنين من الرموز المميزة المدمجة متاحة تلقائيًا:



$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
-----------------------------------------------------------
$


ينفذ رمز "NSS Generic Crypto Services" وظائف وآليات التشفير ، وتم تصميم الرمز المميز "NSS Certificate DB" لتخزين الشهادات والمفاتيح وغيرها من المعلومات الإضافية (على سبيل المثال ، حول الوثوق بشهادات الجذر). يستخدم الرمز المميز "NSS Certificate DB" (رمز NSS الداخلي) قاعدة بيانات cert8.db / cert9.db لتخزين الشهادات وتخزين المفاتيح الخاصة في قاعدة البيانات key3.db / key4.db.



يمكنك الحصول على معلومات حول الرموز المميزة المضمنة لوحدة NSS Internal PKCS # 11 ، بما في ذلك آليات التشفير المدعومة افتراضيًا ، عن طريق تشغيل الأمر التالي:



modutil -list 'NSS Internal PKCS # 11 Module' -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

— $



يتم توصيل وحدة إضافية للعمل مع أجهزة PKCS # 11 الخارجية باستخدام نفس الأداة المساعدة modutil:



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


على سبيل المثال ، للعمل مع رموز RUToken التي تدعم التشفير الروسي ، ما عليك سوى تشغيل الأمر التالي:



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


للحصول على قائمة من الوحدات التي تدعم مستودع NSS معين ، مع معلومات حول كل وحدة (مكتبة ، قائمة بالفتحات المدعومة والرموز المميزة المتصلة بها) ، قم بتشغيل الأمر التالي:



$modutil -list [-dbdir < NSS>]


للحصول على معلومات كاملة حول الرموز المميزة المتصلة لوحدة نمطية معينة ، ستحتاج إلى تشغيل الأمر التالي:



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


لقد استخدمناها بالفعل عندما تلقينا معلومات حول رموز NSS المدمجة (الداخلية).

وإذا كان بإمكانك إضافة وحدة نمطية ، فيمكنك أيضًا إزالة الوحدة من قاعدة البيانات:



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


عادةً ما يكون الوصول إلى الرموز الخارجية محميًا برمز PIN . افتراضيًا ، لا يكون الوصول إلى رمز قاعدة بيانات شهادة NSS المميز المدمج محميًا بكلمة مرور (رمز PIN). لكن ليس من الصعب إثباته ، على سبيل المثال:



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


بنفس الطريقة ، يمكنك تغيير رمز PIN للرمز الخارجي.



حان الوقت الآن للانتقال إلى العمل مع الرموز وآلياتها وكائناتها.



الوصول إلى كائنات رمز PKCS # 11



يتم استخدام الأداة المساعدة certutil للوصول إلى الكائنات (المفاتيح والشهادات) الخاصة برموز PKCS # 11. لاحظ أن الأداة المساعدة certutil تعمل مثل الأداة المساعدة openssl. لعرض وظيفة الأداة المساعدة certutil ، ما عليك سوى تشغيل الأمر:



$certutil -H


لكننا الآن مهتمون فقط بالوصول إلى الشهادات والمفاتيح . تذكر أنه عند تخزينه على رمز PKCS # 11 ، عادةً ما يتم تعيين سمات CKA_ID و CKA_LABEL لكليهما. لعرض قائمة الشهادات على رمز معين ، قم بتشغيل الأمر التالي:



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


يمكن تحديد تسمية الرمز الحقيقي أو إحدى الكلمات الرئيسية - كلها أو داخلية - كتسمية رمزية. في الحالة الأولى (علامة الرمز المميز الكل) ، يتم البحث عن جميع الرموز المميزة المتصلة بمخزن NSS ، وفي الحالة الثانية (داخلي أو "NSS Certificate DB") سيتم عرض الرمز المميز الداخلي لمتجر "NSS Certificate DB".



على سبيل المثال ، للحصول على قائمة بالشهادات على رمز مميز باسم "LS11SW2016" ، تم تسجيل وحدة الوصول الخاصة بها في مستودع NSS "/ home / a513 / tmp / TEST_NSS" ، قم بتشغيل الأمر التالي:



$ 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                    ,,   
$


يتم عرض قائمة الشهادات على الرمز المميز في عمودين. يعطي العمود الأول لقب الشهادة ، والثاني يحتوي على سمات الثقة لتلك الشهادة.



علاوة على ذلك ، إذا كانت الشهادة تحتوي على مفتاح خاص على الرمز المميز حيث توجد ، فسيحتوي هذا العمود على القيمة "u ، u ، u" .



إذا لم يتم تعيين السمات ، فسيحتوي العمود على القيمة "،،".



الشهادات ذات سمات الثقة "u ، u ، u" (لها مفتاح خاص) يمكن استخدامها للمصادقة أو لإنشاء توقيع إلكتروني.



يمكن تعيين قيم سمات الثقة الأخرى للشهادات الموجودة على الرمز المميز "NSS Certificate DB". ولكن أكثر عن ذلك لاحقا.



ما هو لقب الشهادة في NSS؟



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


بالنسبة للرمز المميز الداخلي ("قاعدة بيانات شهادة NSS") ، قد تكون تسمية الرمز المميز في اللقب مفقودة.



إذا أخذنا في الاعتبار آليات عملات 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: Test Certificate'
$ 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

$



إذا كانت الشهادة التي تم عرضها على نفس الرمز المميز تحتوي على مفتاح خاص ، فستكون علامة توثيق الشهادات هي المستخدم:



أعلام شهادة الثقة:

SSL أعلام:

العضو

البريد الإلكتروني أعلام:

العضو

كائن أعلام التوقيع:

العضو


لتصدير شهادة من رمز إلى مخرجات قياسية ، ما عليك سوى إضافة معلمة "-a" أو "-r" إضافية. يرشد الخيار "-a" إلى إخراج الشهادة بتنسيق PEM:



$ certutil -L -d '/ home / a513 / tmp / TEST_NSS' -n 'NSS Certificate DB: Test Certificate' -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-----



لمخرج DER ، استخدم المعلمة "-r".



قم بتثبيت شهادة على رمز مميز



لنفترض أن لديك حاوية PKCS # 12 بها شهادة شخصية ومفتاح خاص أنشأتهما باستخدام OpenSSL. لتصدير شهادة شخصية إلى متجر NSS ، استخدم الأمر pk12util التالي:



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


إذا كنت ترغب في استيراد شهادة لرمز معين ، فأنت بحاجة إلى تعيين تسميته. دعنا نلاحظ ميزة أخرى. إذا كانت الحاوية تحتوي على شهادات جذر ، فسيتم حفظها على الرمز الداخلي "NSS Certificate DB". هذا لا يعيّن سمات الثقة الافتراضية. إذا كان مطلوبًا ، لسبب ما ، تعيين سمات الثقة لشهادات معينة من سلطات التسجيل (شهادات الجذر) أو شهادات SSL ، فسيتم استخدام الأداة المساعدة للشهادة من النموذج التالي:



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


لكل شهادة ، هناك ثلاث فئات ثقة متاحة ، معبر عنها بالترتيب التالي: SSL ، S / MIME ، توقيع الرمز لكل إعداد ثقة:



< > := x,y,z , 


  • x - سمات SSL ،
  • y - سمات لـ S / MIME ،
  • ض - سمات توقيع التعليمات البرمجية.


يمكن أن يكون كل موضع x و y و z فارغًا (استخدم ، لا ثقة صريحة) أو يحتوي على سمة واحدة أو أكثر:



  • ع - نظير صالح ؛
  • P - عقدة موثوقة (تعني ص)
  • ج - شهادة صالحة من سلطة التسجيل (صالحة CA)
  • T - مرجع مصدق (CA) موثوق لإصدار شهادات العميل (ضمني أيضًا c)
  • ج - المرجع المصدق (CA) الموثوق لإصدار شهادات الخادم (SSL فقط) (ضمني ج)


لاحظ أنه ليست كل الرموز الخارجية تسمح بعملية استيراد مفتاح خاص إلى رمز مميز.



لتثبيت شهادة بسيطة من ملف ، استخدم الأداة المساعدة من النموذج التالي:



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


لسوء الحظ ، في هذا السياق ، لا تعادل <تسمية الشهادة> لقب الشهادة الذي تمت مناقشته أعلاه. هنا ، تتطابق تسمية الشهادة مع CKA_LABEL فقط ، فقط تسميات دون تحديد تسمية رمزية. نوع من التناقض.



بشكل افتراضي ، من المفترض أن تكون الشهادة في ملف مشفر DER. إذا كانت الشهادة مشفرة PEM ، فيجب تحديد المعلمة "-a". إذا لم يتم تحديد المعلمة "-i" ، فسيتم أخذ الشهادة من الإدخال القياسي (stdin). بشكل افتراضي ، يتم تثبيت الشهادات على الرمز المميز "NSS Certificate DB" ، ولكن يمكنك تثبيت الشهادة على رمز خارجي (معلمة "-h"). عند تثبيت شهادة على رمز خارجي ، سيتم تثبيت الشهادة على الرمز المميز الداخلي ("NSS Certificate DB") والرمز المميز الخارجي. في هذه الحالة ، سيتم تجاهل سمات الثقة للرمز المميز الخارجي ، وسيتم إصدار تحذير: "تعذر تغيير الثقة في الشهادة".



يمكن حذف شهادة مكررة على رمز داخلي إذا رغبت في ذلك.



لإزالة شهادة من أي رمز مميز ، استخدم الأمر التالي:



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


على سبيل المثال ، لإزالة الشهادة التي تحمل التصنيف (CKA_LABEL) "User1" من الرمز المميز RuTokenECP20 ، ما عليك سوى تشغيل الأمر التالي:



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


عند حذف شهادة ، لا يتم حذف مفتاحها الخاص (إذا كان هناك واحد بالطبع). لحذف مفتاح خاص ، تحتاج إلى تشغيل أمر بالنموذج:



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


الآن بعد أن أصبح لدينا مستودع NSS ، الرموز المميزة بشهادات شخصية ، يمكننا العمل بالتوقيع الإلكتروني.



تكوين والتحقق من التوقيع الإلكتروني



هناك ثلاث أدوات مساعدة للعمل بالتوقيعات الإلكترونية في حزمة NSS.



تُستخدم الأداة المساعدة p7sign لإنشاء توقيع إلكتروني:



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


لسوء الحظ ، تقوم الأداة بإنشاء توقيع دون الرجوع إلى وقت تكوينها. لكن هذا تم إصلاحه بسهولة. يكفي إضافة سطر إلى وظيفة SignFile في الأداة المساعدة p7sign.c مع استدعاء الوظيفة لإضافة وقت إنشاء التوقيع:



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


سيتم الآن إنشاء توقيع إلكتروني بتنسيق CAdes-BES.



من المقبول في NSS تخزين الشهادة ومفتاحها الخاص على نفس الرمز المميز وتسمياتهما (CKA_LABEL) ، وكذلك CKA_ID ، هي نفسها. وفقًا لذلك ، فإن لقب المفتاح الخاص ولقب الشهادة نفسها هما نفس الاسم. تذكر أنه يمكن العثور على وجود مفتاح خاص في الشهادة من خلال القيمة "u ، u ، u" لسمات الثقة للشهادة المعروضة (الأمر certutil -L).



بشكل افتراضي ، تقوم الأداة المساعدة p7sign بإنشاء توقيع منفصل. إذا كان التوقيع المُلحق مطلوبًا ، فيجب تحديد المعلمة "-e". يجب ألا يغيب عن الأذهان أنه لن يتم إنشاء التوقيع إذا لم تكن هناك سلسلة شهادات جذرية لشهادة الموقّع في متجر NSS على رمزها الداخلي أو لم يتم تعيين سمات الثقة الخاصة بها.



تُستخدم الأداة المساعدة p7verify للتحقق من التوقيع الإلكتروني:



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


تعتبر المعلمة "-u" ذات أهمية. يوجه إلى التحقق من نوع شهادة الموقّع وإذا كانت لا تتطابق مع النوع المحدد ، فإن التوقيع غير صالح.



يمكن أن تحتوي القيمة <استخدام الشهادة> على القيم التالية:

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


الافتراضي هو certUsageEmailSigner (4).

تتيح لك الأداة المساعدة p7content الحصول على معلومات حول وقت توقيع المستند ، ومن قام بالتوقيع عليه وعنوان البريد الإلكتروني للموقِّع. إذا تم إرفاق التوقيع ، فسيتم أيضًا استرداد المحتوى نفسه الذي تم توقيعه.



الأداة المساعدة p7content لها التنسيق التالي:



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


على سبيل المثال:



$ 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.
$


هذه ليست سوى عدد قليل من الأدوات المساعدة المضمنة في حزمة NSS. بطبيعة الحال ، يحتوي كل من OpenSSL و NSS على أدوات مساعدة (أو أوامر) تسمح لك بإنشاء طلبات الشهادات وإصدار الشهادات ، أي من الممكن نشر CA وظيفي بالكامل كما يتم باستخدام openssl. يمكنك رفع خادم tls باستخدام الأداة المساعدة selfserv (التناظرية لـ openssl s_server) واستخدام tls-client tstclnt (تماثلي من openssl s-client) وغير ذلك الكثير.



بالمناسبة ، يمكن الحصول على قائمة ciphersuites في NSS باستخدام الأداة المساعدة listsuites. في OpenSSL ، يخدم الأمر openssl ciphers هذا الغرض. يمكن العثور هنا على تعيين أسماء مجموعة تشفير OpenSSL لأسماء مجموعات تشفير IANA .



في الواقع ، OpenSSL و NSS وجهان (نوعان من الواجهات لنفس البروتوكولات والمعايير) لنفس العملة - البنية التحتية للمفتاح العام.



إذا كان هناك اهتمام بهذا الموضوع ، فستستمر القصة.



في الختام ، أود أيضًا أن أسهب في الحديث عن الغلاف الرسومي لـ NSS. هناك العديد من الأصداف الرسومية لـ OpenSSL. نلاحظ اثنين منهم فقط - XCA و CAFL63 .



Guinsspy GUI لحزمة NSS



السؤال الأول هو ما الذي يجب تطويره؟ تقرر في بايثون.



السؤال الثاني هو ماذا تكتب واجهة رسومية؟ الجواب هو تكينتر.



تم تطوير واجهة المستخدم الرسومية في الأصل على PAGE . لكن بعد ذلك ابتعدوا عنه. لكن بقي السياق.



تعتمد وظيفة الأداة على الأدوات المساعدة والأوامر التي تمت مناقشتها أعلاه. بالإضافة إلى ذلك ، تمت إضافة وظيفة أخرى "إنشاء طلب شهادة" ، والتي تستند إلى الأمر "certutil -R":







تقرر استخدام سمة Breeze لـ python3 وموضوع Arc لـ python2 كموضوع للأدوات ، نظرًا لأن الأخير يفتقر إلى سمة Breeze. للقيام بذلك ، تحتاج إلى تثبيت حزمة ذات سمات لبيثونا:



$pip install ttkthemes


نحتاج أيضًا إلى حزمة fsb795 للعمل مع الشهادات:



$pip install fsb795


غالبًا ما تطلب أدوات NSS المساعدة التي يستند إليها guinsspy كلمات مرور أو أرقام PIN من خلال وحدة التحكم. الطريقة الوحيدة للتفاعل معهم من خلال واجهة المستخدم الرسومية هي استخدام حزمة pexpect:



$pip install pexpect


كمثال على استخدام حزمة pexpect ، إليك الكود الخاص باستيراد حاوية PKCS # 12:



استيراد
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)




حلقة لا نهاية لها (بينما (صواب) :) في الإجراء تنتظر حدوث واحد من أربعة أحداث:



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


يرتبط الحدث الأول بدعوة لإدخال كلمة مرور أو رمز PIN ("أدخل كلمة المرور أو رقم التعريف الشخصي").

عند حدوث ذلك ، سيتم عرض نافذة لإدخال رمز PIN على الشاشة (النافذة اليسرى في لقطة الشاشة):







يرتبط الحدث الثاني بإدخال كلمة المرور لحاوية PKCS # 12 ("أدخل كلمة المرور لملف PKCS12"). عند حدوث ذلك ، سيتم عرض نافذة لإدخال كلمة المرور للملف مع حاوية 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 ، حيث يتم إصدار شهادة مثبتة على الرمز المميز الذي تم إنشاء المفتاح الخاص عليه. ثم استخدم هذه الشهادة ، على سبيل المثال ، لتوقيع المستندات.



All Articles