OpenSSL החיוניות: עבודה עם תעודות SSL, מפתחות פרטיים ו- CSRs

הקדמה

OpenSSL הוא כלי שורת פקודה גמיש שיכול לשמש למגוון רחב של משימות הקשורות לתשתיות מפתח ציבורי (PKI) ו-HTTPS (HTTP מעל TLS). מדריך סגנון גליון זה מספק מדריך מהיר לפקודות OpenSSL שמועילות בתרחישים נפוצים ויומיומיים. זה כולל דוגמאות OpenSSL ליצירת מפתחות פרטיים, בקשות לחתימת תעודות והמרת פורמט תעודות. הוא אינו מכסה את כל השימושים של OpenSSL.

איך להשתמש במדריך זה:

  • אם אינך מוכר עם בקשות לחתימת תעודות (CSRs), קרא את הקטע הראשון
  • במשקל לקטע הראשון, מדריך זה בפורמט של גליון רמזים: רשימה של קטעי שורת פקודה עצמאיים
  • קפוץ אל כל קטע הרלוונטי למשימה שאתה מנסה להשלים (רמז: השתמש בתפריט תוכן או בפונקצית חפש של הדפדפן שלך)
  • רוב הפקודות הן בעלות שורה אחת שהורחבו למספר שורות (על ידי הסמל \) למען הבהירות

אודות בקשות לחתימת תעודות (CSRs)

אם ברצונך לקבל תעודת SSL מרשיון מסחרי (CA), עליך ליצור בקשת חתימת תעודה (CSR). CSR מורכב בעיקר מהמפתח הציבורי של זוג המפתחות, ומידע נוסף. שני הרכיבים הללו מוכנסים לתעודה כאשר היא מוחתמת.

בכל פעם שתייצרו CSR, תתבקשו לספק מידע אודות התעודה. מידע זה ידוע כשם דומיננטי (DN). שדה חשוב ב-DN הוא השם המשותף (CN), שצריך להיות השם המלא של הדומיין (FQDN) של המארח שבו ברצונך להשתמש בתעודה. ניתן גם לדלג על העזרה האינטראקטיבית ביצירת CSR על ידי מעבר למידע דרך שורת הפקודה או מקובץ.

הפריטים האחרים ב-DN מספקים מידע נוסף אודות העסק או הארגון שלך. אם אתה רוכש תעודת SSL מרשיון, נדרש תמיד ששדות הנוספים אלו, כגון "ארגון", ישקפו את פרטי הארגון שלך בדיוק.

הנה דוגמה למה תראה פניה למידע על CSR:

---
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:Brooklyn
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company
Organizational Unit Name (eg, section) []:Technology Division
Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com
Email Address []:

אם ברצונך לענות באופן לא אינטראקטיבי על פניית המידע של CSR, תוכל לעשות זאת על ידי הוספת האפשרות -subj לכל הפקודות של OpenSSL שדורשות מידע על CSR. הנה דוגמה לשימוש באפשרות, באותו המידע שמוצג בבלוק הקוד למעלה:

-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"

עכשיו שהבנת את ה-CSR, אתה יכול לעבור לאיזור התכניות של OpenSSL שמתאים לך.

יצירת CSR

הקטע הזה מכסה פקודות OpenSSL שקשורות ליצירת CSR (ומפתחות פרטיים, אם הם עדיין לא קיימים). CSR יכולים לשמש לבקשת תעודות SSL מרשות תעודות.

שימו לב שניתן להוסיף את מידע ה-CSR לא אינטראקטיבית עם האפשרות -subj, כפי שנאמר בקטע הקודם.

יצירת מפתח פרטי ו-CSR

השתמשו בשיטה זו אם ברצונכם להשתמש ב-HTTPS (HTTP על TLS) כדי לאבטח את שרת האינטרנט שלכם ב-Apache HTTP או Nginx, וברצונכם להשתמש ברשות תעודות (CA) כדי להניב את תעודת ה-SSL. ה-CSR שיווצר יכול להישלח ל-CA כדי לבקש את הנפקת תעודת SSL מכוונת ל-CA. אם ה-CA שלכם תומך ב-SHA-2, הוסיפו את האפשרות -sha256 כדי לחתום על ה-CSR ב-SHA-2.

הפקודה הזו יוצרת מפתח פרטי בגודל 2048 ביט (domain.key) ו-CSR (domain.csr) מאפס:

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -out domain.csr

ענו על הוראות ה-CSR כדי להשלים את התהליך.

האפשרות -newkey rsa:2048 מציינת כי המפתח צריך להיות בגודל של 2048 ביט, הנוצר באמצעות אלגוריתם RSA. האפשרות -nodes מציינת כי המפתח הפרטי לא צריך להיות מוצפן עם מילת מפתח. האפשרות -new, שלא כלולה פה אך משועממת, מציינת שמספר בקשת תעודה (CSR) מיוצר.

יצירת בקשת תעודה ממפתח פרטי קיים

השתמש בשיטה זו אם כבר יש לך מפתח פרטי שברצונך להשתמש בו כדי לבקש תעודה מרשם אישורי הזהות (CA).

פקודה זו יוצרת בקשת תעודה חדשה (domain.csr) בהתבסס על מפתח פרטי קיים (domain.key):

  1. openssl req \
  2. -key domain.key \
  3. -new -out domain.csr

ענה על השאלות הנוגעות למידע של בקשת התעודה כדי להשלים את התהליך.

האפשרות -key מציינת מפתח פרטי קיים (domain.key) שישמש ליצירת בקשת תעודה חדשה. האפשרות -new מציינת שמספר בקשת תעודה (CSR) מיוצר.

יצירת בקשת תעודה מתעודה וממפתח פרטי קיים

השתמש בשיטה זו אם ברצונך לחדש תעודת זהות קיימת אך אין לך או לספק ה-C.A שלך את ה-CSR המקורי מסיבה מסוימת. בגדר יסוד, היא מצילה לך את ההתקלקלות בהזנת מידע ה-CSR מחדש, שכן היא מחלצת את המידע מתוך התעודה הקיימת.

הפקת תעודת CSR חדשה (domain.csr) מתוך תעודה קיימת (domain.crt) ומפתח פרטי (domain.key):

  1. openssl x509 \
  2. -in domain.crt \
  3. -signkey domain.key \
  4. -x509toreq -out domain.csr

האפשרות -x509toreq מציינת שאתה משתמש בתעודת X509 כדי ליצור CSR.

יצירת תעודות SSL

אם ברצונך להשתמש בתעודת SSL כדי לאבטח שירות אך אינך זקוק לתעודה מקורה מ-C.A, פתרון תקף (וחינמי) הוא לחתום על התעודות שלך.

A common type of certificate that you can issue yourself is a self-signed certificate. A self-signed certificate is a certificate that is signed with its own private key. Self-signed certificates can be used to encrypt data just as well as CA-signed certificates, but your users will be displayed a warning that says that the certificate is not trusted by their computer or browser. Therefore, self-signed certificates should only be used if you do not need to prove your service’s identity to its users (e.g. non-production or non-public servers).

מקטע זה מטפח פקודות OpenSSL הקשורות ליצירת תעודות שחתומות עצמן.

יצירת תעודה שחתומה עצמית

השתמש בשיטה זו אם ברצונך להשתמש ב-HTTPS (HTTP על TLS) כדי לאבטח את שרת האינטרנט שלך ב-Apache HTTP או ב-Nginx, ואינך זקוק לתעודה שחתומה על ידי C.A.

הפקודה הזו יוצרת מפתח פרטי בגודל של 2048 ביט (domain.key) ותעודת עצמית (domain.crt) מאפס:

  1. openssl req \
  2. -newkey rsa:2048 -nodes -keyout domain.key \
  3. -x509 -days 365 -out domain.crt

ענה על שאלות המידע הקשורות לCSR כדי להשלים את התהליך.

האפשרות -x509 מורה ל־req ליצור תעודת עצמית. האפשרות -days 365 צורפה כדי לציין שהתעודה תהיה תקפה למשך 365 ימים. CSR זמנית נוצרת כדי לאגד את המידע הנדרש לתעודה.

יצירת תעודת עצמית ממפתח פרטי קיים

השתמש בשיטה זו אם כבר יש לך מפתח פרטי שברצונך ליצור תעודת עצמית איתו.

הפקודה הזו יוצרת תעודת עצמית (domain.crt) ממפתח פרטי קיים (domain.key):

  1. openssl req \
  2. -key domain.key \
  3. -new \
  4. -x509 -days 365 -out domain.crt

ענה על שאלות המידע הקשורות לCSR כדי להשלים את התהליך.

האפשרות -x509 מורה ל־req ליצור תעודת עצמית. האפשרות -days 365 צורפה כדי לציין שהתעודה תהיה תקפה למשך 365 ימים. האפשרות -new מאפשרת את שאלות המידע הקשורות לCSR.

צור תעודה עצמית ממפתח פרטי ובקשת CSR קיימים

השתמש בשיטה זו אם כבר יש לך מפתח פרטי ובקשת CSR, וברצונך ליצור תעודה עצמית עמם.

הפקת תעודה עצמית זו (domain.crt) ממפתח פרטי קיים (domain.key) ו (domain.csr):

  1. openssl x509 \
  2. -signkey domain.key \
  3. -in domain.csr \
  4. -req -days 365 -out domain.crt

האפשרות -days 365 מציינת כי התעודה תהיה תקפה למשך 365 יום.

צפייה בתעודות

קבצי התעודות וה-CSR מוצפנים בפורמט PEM, שאינו קריא לאדם ממש.

הקטע הזה מכסה פקודות OpenSSL שתדפיס את הערכים האמיתיים של קבצי PEM שהוצפנו.

צפייה בערכים של CSR

פקודה זו מאפשרת לך לצפות ולוודא את תוכן בקשת ה-CSR (domain.csr) בטקסט פשוט:

  1. openssl req -text -noout -verify -in domain.csr

הצג רשומות תעודות

פקודה זו מאפשרת לך להציג את תוכן התעודה (domain.crt) בטקסט פשוט:

  1. openssl x509 -text -noout -in domain.crt

וודא שתעודה נחתמה על ידי CA

השתמש בפקודה זו כדי לוודא כי תעודה (domain.crt) נחתמה על ידי תעודת CA מסוימת (ca.crt):

  1. openssl verify -verbose -CAFile ca.crt domain.crt

מפתחות פרטיים

סעיף זה מכסה פקודות OpenSSL שמיועדות ליצירה ואימות של מפתחות פרטיים.

צור מפתח פרטי

השתמש בפקודה זו כדי ליצור מפתח פרטי בגודל 2048 ביט, מוגן בסיסמה (domain.key):

  1. openssl genrsa -des3 -out domain.key 2048

הזן סיסמה כאשר תתבקש להשלים את התהליך.

אימות מפתח פרטי

השתמש בפקודה זו כדי לבדוק שמפתח פרטי (domain.key) הוא מפתח תקף:

  1. openssl rsa -check -in domain.key

אם המפתח הפרטי שלך מוצפן, יתבקש ממך להזין את סיסמת הפענוח שלו. לאחר הצלחה, המפתח שאינו מוצפן ייעבר לפלט בטרמינל.

אימות כי מפתח פרטי תואם לתעודה ולבקשת חתימה

השתמש בפקודות אלו כדי לאמת אם מפתח פרטי (domain.key) תואם לתעודה (domain.crt) ולבקשת חתימה (domain.csr):

  1. openssl rsa -noout -modulus -in domain.key | openssl md5
  2. openssl x509 -noout -modulus -in domain.crt | openssl md5
  3. openssl req -noout -modulus -in domain.csr | openssl md5

אם פלט כל אחת מהפקודות זהה, קיימת סיכויות גבוהות ביותר שהמפתח הפרטי, התעודה, והבקשת חתימה קשורים.

הצפנת מפתח פרטי

פקודה זו מקבלת מפתח פרטי שאינו מוצפן (unencrypted.key) ומפלטת גרסה מוצפנת שלו (encrypted.key):

  1. openssl rsa -des3 \
  2. -in unencrypted.key \
  3. -out encrypted.key

הזן את סיסמת הפענוח הרצויה שלך, כדי להצפין את המפתח הפרטי.

פענח מפתח פרטי

זה מקבל מפתח פרטי מוצפן (encrypted.key) ומייצא גרסה מפוענחת שלו (decrypted.key):

  1. openssl rsa \
  2. -in encrypted.key \
  3. -out decrypted.key

הזן את סיסמת המפתח המוצפן כאשר מתבקש.

המרת פורמטי תעודות

כל התעודות שבהן עבדנו היו תעודות X.509 המוצפנות בפורמט ASCII PEM. ישנם מגוון של פורמטים נוספים לקידוד ואריזת תעודות; יישומים מסוימים מעדיפים פורמטים מסוימים על פני אחרים. בנוסף, רוב הפורמטים הללו יכולים להכיל פריטים מרובים, כגון מפתח פרטי, תעודה, ותעודת CA, בקובץ יחיד.

OpenSSL יכול לשמש להמרת תעודות מפורמט אחד לאחר ולהפך, ויש לו תמיכה במגוון רחב של פורמטים אלה. סעיף זה יכסה חלק מההמרות האפשריות.

המרת PEM ל- DER

השתמש בפקודה זו אם ברצונך להמיר תעודה בפורמט PEM (domain.crt) לתעודה בפורמט DER (domain.der), המפוקד בינארי:

  1. openssl x509 \
  2. -in domain.crt \
  3. -outform der -out domain.der

פורמט DER בדרך כלל משמש עם Java.

המרת DER ל- PEM

השתמש בפקודה זו אם ברצונך להמיר תעודת מפתח בפורמט DER (domain.der) לתעודת מפתח בפורמט PEM (domain.crt):

  1. openssl x509 \
  2. -inform der -in domain.der \
  3. -out domain.crt

המרת PEM ל- PKCS7

השתמש בפקודה זו אם ברצונך להוסיף תעודות PEM (domain.crt ו־ca-chain.crt) לקובץ PKCS7 (domain.p7b):

  1. openssl crl2pkcs7 -nocrl \
  2. -certfile domain.crt \
  3. -certfile ca-chain.crt \
  4. -out domain.p7b

שים לב שאפשר להשתמש באפשרות -certfile אחת או יותר כדי לציין אילו תעודות להוסיף לקובץ PKCS7.

קבצי PKCS7, נכונים גם כ־P7B, משמשים בדרך כלל באחסון מפתחות של Java וב-Microsoft IIS (Windows). זהם קבצי ASCII שיכולים לכלול תעודות ותעודות CA.

המרת PKCS7 ל- PEM

השתמש בפקודה זו אם ברצונך להמיר קובץ PKCS7 (domain.p7b) לקובץ PEM:

  1. openssl pkcs7 \
  2. -in domain.p7b \
  3. -print_certs -out domain.crt

שים לב שאם יש לך קובץ PKCS7 עם מספר פריטים בתוכו (לדוגמה, תעודת אישור ותעודת CA אינטרמדיאטית), הקובץ PEM שינוף יכיל את כל הפריטים בו.

המרת PEM ל-PKCS12

השתמש בפקודה זו אם ברצונך לקחת מפתח פרטי (domain.key) ותעודה (domain.crt), ולשלב אותם לתוך קובץ PKCS12 (domain.pfx):

  1. openssl pkcs12 \
  2. -inkey domain.key \
  3. -in domain.crt \
  4. -export -out domain.pfx

תתבקש להזין סיסמת ייצוא, שאפשר להשאיר ריקה. שים לב שתוכל להוסיף שרשרת של תעודות לקובץ PKCS12 על ידי חיבור התעודות יחד בקובץ PEM יחיד (domain.crt) במקרה זה.

קבצי PKCS12, שנכונים גם כקבצי PFX, בדרך כלל משמשים לייבוא וייצוא שרשרות תעודות ב-Microsoft IIS (Windows).

המרת PKCS12 ל-PEM

השתמש בפקודה זו אם ברצונך להמיר קובץ PKCS12 (domain.pfx) ולהמיר אותו לפורמט PEM (domain.combined.crt):

openssl pkcs12 \
       -in domain.pfx \
       -nodes -out domain.combined.crt

שים לב שאם יש לך קובץ PKCS12 עם מספר פריטים בתוכו (לדוגמה, תעודה ומפתח פרטי), הקובץ PEM שינוף יכיל את כל הפריטים בו.

גרסת OpenSSL

הפקודה openssl version ניתן להשתמש בה כדי לבדוק איזו גרסה אתה מפעיל. הגרסה של OpenSSL שאתה מפעיל, והאפשרויות שהוא נקלט איתן, משפיעות על היכולות (ולפעמים גם על האפשרויות בקו הפקודה) שזמינות לך.

הפקודה הבאה מציגה את גרסת OpenSSL שאתה מפעיל, ואת כל האפשרויות שהוא נקלט איתן:

openssl version -a

מדריך זה נכתב באמצעות תוכנית OpenSSL עם הפרטים הבאים (הפלט של הפקודה הקודמת):

OpenSSL 1.1.1  11 Sep 2018
built on: Mon Aug 23 17:02:39 2021 UTC
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-Flav1L/openssl-1.1.1=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"
Seeding source: os-specific

מסקנה

זה צריך לכסות איך רוב האנשים משתמשים ב- OpenSSL כדי לעבוד עם אישורי SSL. יש לו הרבה שימושים אחרים שלא נכללו כאן, אז תרגישו חופשי לשאול או להציע שימושים אחרים בתגובות.

אם יש לך בעיות עם אחת מהפקודות, הקפד להעיר (ולכלול את פלט גרסת OpenSSL שלך).

Source:
https://www.digitalocean.com/community/tutorials/openssl-essentials-working-with-ssl-certificates-private-keys-and-csrs