EFIKEYGEN(1) General Commands Manual EFIKEYGEN(1)

efikeygen — ابزاری برای تولید کلیدهای امضای ایمیج PE برای UEFI Secure Boot

efikeygen ⟨-C | -k | -m⟩ ⟨-S | --signer nickname⟩ -n nickname -c common_name [-u url] [-s serial] [-d directory] [-t token]

دستور efikeygen یک ابزار خط فرمانی برای تولید کلیدها و گواهی‌ها جهت استفاده با pesign است. این‌ها گواهی‌های استاندارد X.509 هستند و می‌توان آن‌ها را با هر ابزار ساخت گواهی دیگری نیز تولید کرد. efikeygen گواهی‌ها را با گزینه‌های مناسب برای کلیدی که جهت امضای ایمیج PE در UEFI Secure Boot به کار می‌رود تولید می‌کند.

|
ایجاد یک گواهی CA
|
ایجاد یک گواهی امضای هسته (kernel)

نباید برای گواهی‌های CA استفاده شود

|
ایجاد یک گواهی امضای ماژول

نباید برای گواهی‌های CA استفاده شود

|
ایجاد یک گواهی خودامضا
nickname
استفاده از گواهی NSS ارجاع داده‌شده توسط nickname به‌عنوان گواهی صادرکننده
nickname | nickname
تنظیم نام مستعار گواهی جدید در پایگاه‌داده NSS به nickname
common_name | common_name
نام عمومی (Common Name) استاندارد X.509 برای گواهی تولیدشده. این مقدار باید در ساختار نحوی rfc2253 باشد، مانند: "CN=John Doe,OU=editing,O=New York Times,L=New York,ST=NY,C=US"
url | url
نشانی اینترنتی (URL) برای دریافت اطلاعات مربوط به این گواهی و اشیاء امضاشده با آن.
serial | serial
شماره سریال برای استفاده با این کلید. یک گواهی با صادرکننده و شماره سریالش شناخته می‌شود، بنابراین بهتر است هرگز این مقدار برای یک صادرکننده یکسان دوباره استفاده نشود. به‌طور پیش‌فرض، این مقدار به‌صورت تصادفی تولید می‌شود. استفاده از این گزینه برای بازنویسی آن توصیه نمی‌شود.
directory | directory
دایرکتوری پایگاه‌داده کلید NSS (پیش‌فرض: /etc/pki/pesign)
token | token
نام توکن NSS جهت استفاده (پیش‌فرض: pkcs11:token=NSS%20Certificate%20DB)

در اینجا نحوه ایجاد هم گواهی و جفت‌کلید CA و هم گواهی و جفت‌کلید امضای هسته، و وارد کردن آن‌ها به دستگاه‌های PIV متعلق به yubikey آمده است:

تولید کلیدها:

# ساخت یک کلید CA جدید
host:~$ efikeygen -C -n my-ca -S \
        -c "CN=CA Person,OU=My Org's CA,O=My Org" \
        -u https://myorg.example.com/ca/

# ساخت یک کلید امضای هسته
host:~$ efikeygen -n my-signer --signer my-ca -k \
        -c "CN=Secure Boot Signer,OU=My Org's CA,O=My Org" \
        -u https://myorg.example.com/ca/

ذخیره CA روی یک yubikey:

# ذخیره آن در یک بسته PKCS-12
host:~$ pk12util -d /etc/pki/pesign -o myca.pk12 -n my-ca
Enter password for PKCS12 file: <یک گذرواژه اینجا وارد کنید>
Re-enter password: <دوباره آن را اینجا وارد کنید>
pk12util: PKCS12 EXPORT SUCCESSFUL

# وارد کردن کلید به yubikey
host:~$ yubico-piv-tool -s 9c -a import-key -K PKCS12 \
        -c -i myca.pk12
Enter PEM pass phrase: <همان گذرواژه را اینجا وارد کنید>
Successfully imported a new private key.

# وارد کردن گواهی به yubikey
host:~$ yubico-piv-tool -s 9c -a import-certificate \
        -K PKCS12 -i myca.pk12
Enter PEM pass phrase: <همان گذرواژه را اینجا وارد کنید>
Successfully imported a new certificate.

# حذف گواهی CA از پایگاه‌داده NSS
host:~$ certutil -d /etc/pki/pesign -D -n my-ca

اکنون yubikeyها را جابه‌جا کرده و امضاکننده هسته را روی دستگاه دیگری وارد کنید:

# ذخیره آن در یک بسته PKCS-12
host:~$ pk12util -d /etc/pki/pesign -o mysigner.pk12 -n my-signer
Enter password for PKCS12 file: <یک گذرواژه اینجا وارد کنید>
Re-enter password: <دوباره آن را اینجا وارد کنید>
pk12util: PKCS12 EXPORT SUCCESSFUL

# وارد کردن کلید به yubikey
host:~$ yubico-piv-tool -s 9c -a import-key -K PKCS12 \
        -i mysigner.pk12
Enter PEM pass phrase: <همان گذرواژه را اینجا وارد کنید>
Successfully imported a new private key.

# وارد کردن گواهی به yubikey
host:~$ yubico-piv-tool -s 9c -a import-certificate \
        -K PKCS12 -i mysigner.pk12
Enter PEM pass phrase: <همان گذرواژه را اینجا وارد کنید>
Successfully imported a new certificate.

# حذف امضاکننده هسته از پایگاه‌داده NSS
host:~$ certutil -d /etc/pki/pesign -D -n my-signer

پس از انجام این کار، برای امضای فایل‌های باینری آماده‌اید:

# در هر یک از این اعلان‌ها، باید PIN مربوط به
# Yubikey را وارد کنید. این موضوع و این انتخاب عجیب نام‌ها به این
# خاطر است که PKCS-11 افتضاح است. متاسفم.
host:~$ pesign -s -t 'Secure Boot Signer' \
        -c "Certificate for Digital Signature" \
        -i shimx64.efi -o shimx64.signed.efi
Enter Password or Pin for "Secure Boot Signer": <PIN را اینجا وارد کنید>
Enter passphrase for private key: <دوباره آن را اینجا وارد کنید>
Enter passphrase for private key: <دوباره آن را اینجا وارد کنید>

اکنون صحت عملکرد آن را بررسی کنید:

host:~$ pesign -i shimx64.signed.efi -l
---------------------------------------------
certificate address is 0x7fbbae061468
Content was not encrypted.
Content is detached; signature cannot be verified.
The signer's common name is Secure Boot Signer
No signer email address.
Signing time: Wed May 15, 2019
There were certs or crls included.
---------------------------------------------

هورا!.Ss OpenSC (کارت هوشمند) در اینجا نحوه ایجاد هم گواهی و جفت‌کلید CA و هم گواهی و جفت‌کلید امضای هسته، و سپس وارد کردن (import) آن‌ها به دستگاه‌های کارت هوشمند CardOS پشتیبانی‌شده توسط OpenSC آورده شده است:

در صورت تمایل، کارت را قالب‌بندی کرده و داده‌های PKCS15 آن را مقداردهی اولیه کنید:

# قالب‌بندی کارت
host:~$ cardos-tool -f
Using reader with a card: Generic Smart Card Reader Interface [Smart Card Reader Interface] (20070818000000000) 00 00
card in administrative state, ok

# مقداردهی اولیه داده‌های PKCS15 کارت، تنظیم PIN افسر امنیت (Security Officer) و کد بازگشایی.
host:~$ pkcs15-init -CT --so-pin $SOPIN --so-puk $SOPUK
Using reader with a card: Generic Smart Card Reader Interface [Smart Card Reader Interface] (20070818000000000) 00 00

# مقداردهی اولیه PIN و کد بازگشایی کاربر، و برچسب‌گذاری توکن
host:~$ pkcs15-init -P -a 1 --pin $PIN --puk $PUK \
        --so-pin $SOPIN --so-puk $SOPUK \
        --label "myorg-sb-ca"
Using reader with a card: Generic Smart Card Reader Interface [Smart Card Reader Interface] (20070818000000000) 00 00

تولید کلیدها و گواهی‌ها:

# ایجاد یک کلید و گواهی CA جدید
host:~$ efikeygen -C -n my-ca -S \
        -c "CN=My Org's Secure Boot CA,OU=My Org's CA,O=My Org" \
        -u https://myorg.example.com/ca

# ایجاد کلید و گواهی امضای هسته
host:~$ efikeygen -n my-signer --signer my-ca -k \
        -c "CN=My Org's SB Signer,OU=My Org's CA,O=My Org"\
        -u https://myorg.example.com/ca

انتقال آن‌ها به کارت هوشمند

# ذخیره کلید و گواهی CA در یک بسته PKCS-12
host:~$ pk12util -d /etc/pki/pesign -o my-ca.p12 -n my-ca
Enter password for PKCS12 file: <یک گذرواژه در اینجا وارد کنید>
Re-enter password: <آن را دوباره در اینجا وارد کنید>
pk12util: PKCS12 EXPORT SUCCESSFUL

# وارد کردن بسته PKCS-12 به درون کارت
host:~$ pkcs15-init --store-private-key my-ca.p12 \
        --format pkcs12 --auth-id 01 \
        --pin $PIN --so-pin $SOPIN --so-puk $SOPUK
Using reader with a card: Generic Smart Card Reader Interface [Smart Card Reader Interface] (20070818000000000) 00 00
Importing 1 certificates:
   0: /CN=My Org's Secure Boot CA

# فهرست کردن محتویات:
host:~$ pkcs11-tool --module opensc-pkcs11.so -l --pin $PIN -O
Using slot 1 with a present token (0x1)
Private Key Object; RSA
  label:      Private Key
  ID:         de61fac87e0315352e7b9a487377ace2f6354d9b
  Usage:      sign
Certificate Object, type = X.509 cert
  label:      /CN=My Org's Secure Boot CA
  ID:         de61fac87e0315352e7b9a487377ace2f6354d9b
Public Key Object; RSA 2048 bits
  label:      /CN=My Org's Secure Boot CA
  ID:         de61fac87e0315352e7b9a487377ace2f6354d9b
  Usage:      encrypt, verify

# بررسی و اطمینان از اینکه nss می‌تواند کارت را ببیند
host:~$ modutil -dbdir /etc/pki/pesign/ -list
Listing of PKCS #11 Modules
-----------------------------------------------------------
  1. NSS Internal PKCS #11 Module
     slots: 2 slots attached
    status: loaded

     slot: NSS Internal Cryptographic Services
    token: NSS Generic Crypto Services

     slot: NSS User Private Key and Certificate Services
    token: NSS Certificate DB

  2. opensc-pkcs11
    library name: /usr/lib64/pkcs11/opensc-pkcs11.so
     slots: 2 slots attached
    status: loaded

     slot: Virtual hotplug slot
    token:

     slot: Generic Smart Card Reader Interface [Smart Card Read...
    token: OpenSC Card (myorg-sb-ca)
-----------------------------------------------------------

# بررسی و اطمینان از اینکه NSS می‌تواند گواهی را ببیند:
host:~$ certutil -d /etc/pki/pesign -L \
        -h "OpenSC Card (myorg-sb-ca)"
Certificate Nickname                             Trust Attributes
                                                 SSL,S/MIME,JAR/XPI

Enter Password or Pin for "OpenSC Card (myorg-sb-ca)": <PIN را در اینجا وارد کنید>
OpenSC Card (myorg-sb-ca):/CN=My Org's Secure Boot CA    u,u,u

# حذف CA از پایگاه‌داده NSS
host:~$ certutil -d /etc/pki/pesign -D -n my-ca

به یاد داشته باشید که کارت‌ها را جابه‌جا کرده و همین مراحل را برای امضاکننده (signer) نیز انجام دهید، درست مانند مثال YubiKey؛ سپس یک فایل باینری را با کلید امضا روی یک کارت هوشمند امضا کرده و درستی عملکرد آن را تأیید کنید:

# امضای فایل باینری. در هر یک از این اعلان‌ها، باید PIN
# کارت هوشمند را وارد کنید. این مورد و این انتخاب عجیب
# نام‌ها به خاطر نامناسب بودن PKCS-11 است. پوزش می‌خواهم.
host:~$ pesign -s -t "OpenSC Card(myorg-sb-signer)" \
        -c "OpenSC Card (myorg-sb-signer):/CN=My Org's SB Signer"\
        -i shimx64.efi -o shimx64.signed.efi
Enter Password or Pin for "My Org's SB Signer": <PIN را در اینجا وارد کنید>
Enter passphrase for private key: <PIN را در اینجا وارد کنید>
Enter passphrase for private key: <PIN را در اینجا وارد کنید>

# تأیید اینکه کار کرده است:
host:~$ pesign -i shimx64.signed.efi -l
---------------------------------------------
certificate address is 0x7fbbae061468
Content was not encrypted.
Content is detached; signature cannot be verified.
The signer's common name is My Org's SB Signer
No signer email address.
Signing time: Wed Jun 2, 2020
There were certs or crls included.
---------------------------------------------

بسیار عالی!.Sh "استانداردها (STANDARDS)" B. Kaliski, PKCS #7: Cryptographic Message Syntax v1.5, Internet Engineering Task Force, RFC 2315, https://tools.ietf.org/html/rfc2315 , مارس ۱۹۹۸.

K. Moriarty, M. Nyström, S. Parkinson, A. Rusch, and M. Scott, PKCS #12: Personal Information Exchange Syntax v1.1, Internet Engineering Task Force, RFC 7292, https://tools.ietf.org/html/rfc7292 , ژوئیه ۲۰۱۴.

PKCS11 Technical Committee, PKCS#11: Cryptographic Token Interface Standard, OASIS, https://www.cryptsoft.com/pkcs11doc.

certutil(1), modutil(1), opensc-tool(1), pesign(1), pk12util(1), pkcs15-init(1), yubico-piv-tool(1),

Peter Jones

June 3, 2020 Linux