| EFIKEYGEN(1) | General Commands Manual | EFIKEYGEN(1) |
نام (NAME)
efikeygen —
ابزاری
برای تولید
کلیدهای
امضای
ایمیج PE برای
UEFI Secure Boot
خلاصه دستور (SYNOPSIS)
efikeygen
⟨-C | -k
| -m⟩
⟨-S
| --signer nickname⟩
-n nickname
-c common_name
[-u url]
[-s serial]
[-d directory]
[-t token]
توضیحات (DESCRIPTION)
دستور
efikeygen یک
ابزار خط
فرمانی
برای تولید
کلیدها و
گواهیها
جهت
استفاده با
pesign است.
اینها
گواهیهای
استاندارد
X.509 هستند و
میتوان
آنها را با
هر ابزار
ساخت گواهی
دیگری نیز
تولید کرد.
efikeygen
گواهیها
را با
گزینههای
مناسب برای
کلیدی که
جهت امضای
ایمیج PE در UEFI Secure
Boot به کار
میرود
تولید
میکند.
گزینهها (OPTIONS)
-C|--ca- ایجاد یک گواهی CA
-k|--kernel- ایجاد یک
گواهی
امضای هسته
(kernel)
نباید برای گواهیهای CA استفاده شود
-m|--module- ایجاد یک
گواهی
امضای
ماژول
نباید برای گواهیهای CA استفاده شود
-S|--self-sign- ایجاد یک گواهی خودامضا
--signernickname- استفاده از گواهی NSS ارجاع دادهشده توسط nickname بهعنوان گواهی صادرکننده
-nnickname |-nicknamenickname- تنظیم نام مستعار گواهی جدید در پایگاهداده NSS به nickname
-ccommon_name |--common-namecommon_name- نام عمومی (Common Name) استاندارد X.509 برای گواهی تولیدشده. این مقدار باید در ساختار نحوی rfc2253 باشد، مانند: "CN=John Doe,OU=editing,O=New York Times,L=New York,ST=NY,C=US"
-uurl |--urlurl- نشانی اینترنتی (URL) برای دریافت اطلاعات مربوط به این گواهی و اشیاء امضاشده با آن.
-sserial |--serialserial- شماره سریال برای استفاده با این کلید. یک گواهی با صادرکننده و شماره سریالش شناخته میشود، بنابراین بهتر است هرگز این مقدار برای یک صادرکننده یکسان دوباره استفاده نشود. بهطور پیشفرض، این مقدار بهصورت تصادفی تولید میشود. استفاده از این گزینه برای بازنویسی آن توصیه نمیشود.
-ddirectory |--dbdirdirectory- دایرکتوری پایگاهداده کلید NSS (پیشفرض: /etc/pki/pesign)
-ttoken |--tokentoken- نام توکن NSS جهت استفاده (پیشفرض: pkcs11:token=NSS%20Certificate%20DB)
YubiKey
در اینجا نحوه ایجاد هم گواهی و جفتکلید 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.
همچنین ببینید (SEE ALSO)
certutil(1), modutil(1), opensc-tool(1), pesign(1), pk12util(1), pkcs15-init(1), yubico-piv-tool(1),
نویسندگان (AUTHORS)
Peter Jones
| June 3, 2020 | Linux |