مفاهیم پایهای OpenSSL: کار با گواهیهای SSL، کلیدهای خصوصی و درخواستهای امضای گواهی (CSRs)
۶ فروردین ۱۴۰۴
OpenSSL یک ابزار خط فرمان چندمنظوره است که میتواند برای انجام انواع مختلفی از کارها مرتبط با زیرساخت کلید عمومی (PKI) و HTTPS(HTTP بر روی TLS) استفاده شود. این راهنما به سبک cheat sheet مرجعی سریع از دستورات OpenSSL است که در سناریوهای معمول و روزمره مفید هستند. این شامل مثالهایی OpenSSL برای تولید کلیدهای خصوصی، درخواستهای امضای گواهی (CSR) و تبدیل فرمت گواهیها میباشد. این راهنما تمام استفادههای OpenSSL را پوشش نمیدهد.
در ادامه خواهید خواند:
- درباره درخواستهای امضای گواهی (CSRs)
- تولید درخواستهای امضای گواهی (CSRs)
- تولید گواهینامههای SSL
- مشاهده گواهینامهها
- کلیدهای خصوصی
- تبدیل فرمتهای گواهینامه
- نسخه OpenSSL
- جمع بندی
درباره درخواستهای امضای گواهی (CSRs)
اگر میخواهید یک گواهی SSL از یک مرجع گواهی تجاری دریافت کنید، باید یک درخواست امضای گواهی (CSR) ایجاد کنید. یک CSR عمدتا شامل کلید و اطلاعات اضافی است. این دو بخش در هنگام امضا به گواهی اضافه میشوند.
زمانی که یک درخواست امضای گواهی (CRS) ایجاد میکنید، باید اطلاعاتی را درباره گواهی خود وارد کنید. این اطلاعات که به آن نام متمایز (DN) گفته میشود، شامل بخشهای مختلفی است. یکی از مهمترین قسمتها، نام عمومی (Common Name) است که باید دقیقاً همان نام دامنهای باشد که قصد دارید گواهی را روی آن استفاده کنید.
همچنین، اگر نمیخواهید هنگام ایجاد CRS اطلاعات را بهصورت دستی وارد کنید، میتوانید این دادهها را مستقیماً از طریق خط فرمان یا یک فایل آماده ارسال کنید تا فرایند بهصورت خودکار انجام شود.

موارد دیگر در DN، اطلاعات اضافی درباره کسبوکار یا سازمان شما را فراهم میکند. اگر قصد خرید گواهی SSL از یک مرجع گواهی را دارید، معمولا لازم است که این فیلدهای اضافی مانند سازمان به دقت زئیات سازمان شما را منعکس کنند.
در ادامه نمونه ای از نحوه درخواست اطلاعات CRS آورده شده است.
---
Country Name (2 letter code) [AU]:IRAN
State or Province Name (full name) [Some-State]:Tehran
Locality Name (eg, city) []:Brooklyn
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Tehran Company
Organizational Unit Name (eg, section) []:Technology Division
Common Name (e.g. server FQDN or YOUR name) []:exampletehran.com
Email Address []:
اگر میخواهید بدون تعامل به درخواست اطلاعات CSR پاسخ دهید، میتوانید با افزودن گزینه -subj
به هر دستوری که درخواست اطلاعات CSR دارد این کار را انجام دهید. در اینجا نمونهای از این گزینه آورده شده است که از همان اطلاعات نمایش دادهشده در بلوک کد بالا استفاده شده است.
-subj "/C=US/ST=Tehran/L=Tehran/O=Example Tehran Company/CN=exampletehran.com"
ایجاد CRS
این بخش از دستورات OpenSSL را پوشش میدهد که مربوط به ایجاد CRS ها (و کلید خصوصی، درصورتی که از قبل وجود نداشته باشد) است. CSRها میتوانند برای درخواست گواهی SSL از یک مرجع گواهی استفاده شوند.
به خاطر داشته باشید که میتوانید اطلاعات CRS را به صورت غیر تعامل با گزینه -subj
که در بخش قبی ذکر شد اضافه کنید.
بیشتر بخوانید: نحوه دریافت SSL در Apache در سرور مجازی دبیان با Let’s Encrypt
همچنین بخوانید: نحوه ایمن سازی Apache با Let’s Encrypt در Ubuntu
تولید درخواستهای امضای گواهی (CSRs)
از این روش استفاده کنید اگر میخواهید از HTTPS (HTTP بر روی TLS) برای ایمنسازی وبسرور Apache یا Nginx خود استفاده کنید و قصد دارید از یک مرجع گواهی (CA) برای صدور گواهی SSL استفاده کنید. CSR تولید شده را میتوان به CA ارسال کرد تا گواهی SSL امضا شده توسط CA را درخواست کنید. اگر CA شما از SHA-2 پشتیبانی میکند، گزینه -sha256
را اضافه کنید تا CSR با SHA-2 امضا شود.
این دستور یک کلید خصوصی 2048 بیتی (domain.key
) و یک CSR (domain.csr
) از ابتدا ایجاد میکند.
openssl req \
-newkey rsa:2048 -nodes -keyout domain.key \
-out domain.csr
به درخواست اطلاعات CRS پاسخ دهید تا فرآیند کامل شود.
گزینه -newkey rsa:2048
مشخص میکند که کلید باید 2048 بیتی باشد و با استفاده از الگوریتم RSA تولید شود. گزینه -nodes
مشخص میکند که کلید خصوصی با یک رمز عبور محافظت نمیشود. گزینه -new
که در اینجا درج نشده است، اما مفروض است، نشان میدهد که در حال ایجاد CSR هستید.
ایجاد CSR از یک کلید خصوصی موجود
از این روش استفاده کنید اگر قبلا یک کلید خصوصی دارید که میخواهید از آن برای درخواست گواهی از یک CA استفاده کنید.
این دستور یک CRS جدید (domain.csr
) بر اساس یک کلید خصوصی موجود(domain.key
) ایجاد میکند.
openssl req \
-key domain.key \
-new -out domain.csr
گزینه -key
یک کلید خصوصی موجود (domain.key
) را مشخص میکند که برای ایجاد یک CSR جدید استفاده خواهد شد. گزینه -new
نشان میدهد که یک CSR در حال ایجاد است.
ایجاد CSR از یک گواهی و کلید خصوصی موجود
از این روش استفاده کنید اگر میخواهید گواهی موجود را تجدید کنید اما به دلایلی شما یا CA گواهی CRS اصلی را ندارید. این روش اساسا شما را از وارد کردن دوباره اطلاعات CRS راحت میکند، زیرا این اطلاعات را از گواهی موجود استخراج میکنید.
این دستور یک CSR جدید (domain.csr
) بر اساس یک گواهی موجود (domain.crt
) و کلید خصوصی (domain.key
) ایجاد میکند.
openssl x509 \
-in domain.crt \
-signkey domain.key \
-x509toreq -out domain.csr
گزینه -x509toreq
نشان میدهد که شما از یک گواهی X509 برای ایجاد CSR استفاده میکنید.
تولید گواهینامههای SSL
اگر میخواهید از یک گواهی SSL برای ایمنسازی یک سرویس استفاده کنید اما نیازی به گواهینامه امضا شده توسط یک CA ندارید، یک راهحل معتبر (رایگان) این است که گواهی های خود را امضا کنید.
یکی از انواع رایج گواهیهایی که میتوانید خودتان صادر کنید، گواهی خود امضا (self-signed certificate) است. یک گواهی خود امضا، گواهی است که با استفاده از کلید خصوصی خود امضا میشود. گواهیهای خود امضا میتوانند برای رمزنگاری دادهها به همان اندازه که گواهیهای امضاشده توسط CA میتوانند استفاده شوند، مورد استفاده قرار گیرند، اما کاربران شما هشدار خواهند دید که گواهی توسط کامپیوتر یا مرورگر آنها قابل اعتماد نیست. بنابراین، گواهیهای خود امضا تنها باید درصورتی استفاده شوند که نیازی به اثبات هویت سرویس به کاربران نداشته باشید (مثلا در سرورهای غیر تولیدی یا غیر عمومی).
این بخش دستورات OpenSSL را پوشش میدهد که مربوط به ایجاد گواهیهای خود امضا است.
ایجاد گواهی خود امضا
از این روش استفاده کنید اگر میخواهید از HTTPS برای ایمنسازی وبسرور Apache یا Nginx خود استفاده کنید و نیازی به گواهینامه امضاشده توسط CA ندارید.
این دستور یک کلید خصوصی 2048 بیتی (domain.key) و یک گواهی خود امضا (domain.crt) از ابتدا ایجاد میکند.
openssl req \
-newkey rsa:2048 -nodes -keyout domain.key \
-x509 -days 365 -out domain.crt
به درخواست اطلاعات CSR پاسخ دهید تا فرآیند کامل شود.
گزینه -x509
به req
میگوید که یک گواهی خود امضا ایجاد کند. گزینه -days 365
مشخص میکند که گواهی برای 365 روز معتبر خواهد بود. یک CSR موقت برای جمعآوری اطلاعات جهت پیوند به گواهی تولید میشود.
ایجاد گواهی خود امضا از یک کلید خصوصی موجود
از این روش استفاده کنید اگر قبلا یک کلید خصوصی دارید که میخواهید از آن برای تولید یک گواهی خود امضا استفاده کنید.
این دستور یک گواهی خود امضا (domain.crt
) از یک کلید خصوصی موجود (domain.key
) ایجاد میکند.
openssl req \
-key domain.key \
-new \
-x509 -days 365 -out domain.crt
به درخواست اطلاعات CRS پاسخ دهید تا فرآیند کامل شود.
گزینه -x509
به req
میگوید که یک گواهی خود امضا ایجاد کند. گزینه -days 365
مشخص میکند که گواهی برای 365 روز معتبر خواهد بود. گزینه -new
درخواست اطلاعات CSR را فعال میکند.
ایجاد گواهی خود امضا از یک کلید خصوصی و CRS موجود
از این روش استفاده کنید اگر قبلا یک کلید خصوصی و CRS دارید و میخواهید یک گواهی خود امضا با آنها تولید کنید.
این دستور یک گواهی خود امضا (domain.crt
) از یک کلید خصوصی موجود (domain.key
) و (domain.csr
) ایجاد میکند.
openssl x509 \
-signkey domain.key \
-in domain.csr \
-req -days 365 -out domain.crt
گزینه -days 365
مشخص میکند که گواهی برای 365 روز معتبر خواهد بود.
مشاهده گواهینامهها
فایلهای گواهی و درخواست امضای گواهی در فرمت PEM کدگذاری شدهاند، که به صورت مستقیم برای انسان قابل خواندن نیستند.
ابن بخش از دستورات OpenSSL را پوشش میدهد که خروجی آنها شامل محتوای واقعی فایلهای کدگذاری شده با PEM است.
همینطور بخوانید: SSL چیست؟
مشاهده محتوای یک CRS
این دستور به شما این امکان را میدهد که محتوای یک CSR (فایل domain.csr
) را به صورت متن ساده مشاهده و تایید کنید.
openssl req -text -noout -verify -in domain.csr
مشاهده محتوای یک گواهی نامه
این دستور به شما امکان میدهد که محتوای یک گواهینامه (فایل domain.crt
) را به صورت متن ساده مشاهده کنید.
openssl x509 -text -noout -in domain.crt
تایید امضای گواهینامه توسط CA
از این دستور برای تایید این که یک گواهی (فایل domain.crt
) توسط یک گواهی نامه CA خاص امضا شده است استفاده کنید.
openssl verify -verbose -CAFile ca.crt domain.crt
کلیدهای خصوصی
این بخش شامل دستورات OpenSSL برای ایجاد و تایید کلیدهای خصوصی است.
ایجاد یک کلید خصوصی
از این دستور برای ایجاد یک کلید خصوصی 2028 بیتی که با رمز عبور محافظت شده است (domain.key
) استفاده کنید.
openssl genrsa -des3 -out domain.key 2048
هنگام درخواست، رمزعبور را وارد کنید تا فرآیند تکمیل شود.
تایید یک کلید خصوصی
از این دستور برای بررسی صحت یک کلید خصوصی (domain.key
) استفاده کنید.
openssl rsa -check -in domain.key
اگر کلید خصوصی رمزگذاری شده باشد، از شما خواسته میشود که عبارت عبور آن را وارد کنید. در صورت موفقیت، کلید خصوصی بدون رمزگذاری روی ترمینال نمایش داده میشود.
با گواهینامه SSL لیارا، امنیت سایت خود را تضمین کنید و اعتماد کاربران را افزایش دهید.
✅ فعالسازی سریع ✅ رمزگذاری پیشرفته ✅ سازگار با همه مرورگرها
فعال سازی گواهینامه SSL
تایید تطابق کلید خصوصی با گواهی نامه و CSR
از این دستورات برای بررسی اینکه آیا یک کلید خصوصی (domain.key
) با یک گواهینامه (domain.crt
) و CSR (domain.csr
) مطابقت دارد، استفاده کنید.
openssl rsa -noout -modulus -in domain.key | openssl md5
openssl x509 -noout -modulus -in domain.crt | openssl md5
openssl req -noout -modulus -in domain.csr | openssl md5
اگر خروجی هر دستور یکسان باشد، احتمال بسیار زیادی وجود دارد که کلید خصوصی، گواهی نامه و CSR به هم مرتبط باشند.

رمزگذاری یک کلید خصوصی
این دستور یک کلید خصوصی بدون رمزگذاری (unencrypted.key
) را دریافت کرده و نسخه رمزگذاری شده آن را (encrypted.key
) ایجاد میکند.
openssl rsa -des3 \
-in unencrypted.key \
-out encrypted.key
عبارت عبور دلخواه خود را وارد کنید تا کلید خصوصی رمزگذاری شود.
رمزگشایی کلید خصوصی
این دستور یک کلید خصوصی رمزگذاری شده (encrypted.key
) را دریافت کرده و نسخه رمزگشایی شده آن را (encrypted.key
) ایجاد میکند.
openssl rsa \
-in encrypted.key \
-out decrypted.key
عبارت عبور مربوط به کلید رمزگذاری شده را هنگام درخواست وارد کنید.
تبدیل فرمتهای گواهینامه
تمام گواهیهایی که تاکنون با آنها کار شده است، گواهی های X.509 هستند که با فرمت ASCII PEM کدگذاری شدهاند. انواع مختلفی از فرمتهای کدگذاری و بستهبندی گواهیها وجود دارد؛ برخی از برنامهها فرمتهای خاصی را به دیگر فرمتها ترجیح میدهند. همچنین، بسیاری از این فرمتها میتوانند شامل چندین مورد مانند کلید خصوصی، گواهی و گواهی CA در یک فایل باشند.
OpenSSL میتواند برای تبدیل گواهیها بین طیف گستردهای از فرمتها استفاده شود. این بخش برخی از تبدیلهای ممکن را پوشش میدهد.
تبدیل PEM به DER
از این دستور استفاده کنید اگر میخواهید یک گواهی با فرمت (PEM (domain.crt
را به یک گواهی با فرمت (DER (domain.der
که یک فرمت باینری است، تبدیل کنید.
openssl x509 \
-in domain.crt \
-outform der -out domain.der
فرمت DER معمولا در Java استفاده میشوند.
تبدیل DER به PEM
از این دستور استفاده کنید اگر میخواهید یک گواهی با فرمت (DER (domain.der
را به یک گواهی با فرمت (PEM (domain.crt
تبدیل کنید.
openssl x509 \
-inform der -in domain.der \
-out domain.crt
تبدیل PEM به PKCS7
از این دستور استفاده کنید اگر میخواهید گواهیهای PEM (domain.crt
و ca-chain.crt
) را به یک فایل PKCS7 (domain.p7b
) اضافه کنید.
openssl crl2pkcs7 -nocrl \
-certfile domain.crt \
-certfile ca-chain.crt \
-out domain.p7b
توجه داشته باشید که میتوانید از یک یا چند گزینه -certfile
برای مشخص کردن گواهیهایی که باید به فایل PKCS7 اضافه شوند، استفاده کنید.
فایلهای PKCS7 که با نام P7B نیز شناخته میشوند، معمولاً در Java Keystores و Microsoft IIS (ویندوز) استفاده میشوند. این فایلها بهصورت ASCII هستند و میتوانند شامل گواهینامهها و گواهیهای CA باشند.
تبدیل PKCS7 به PEM
از این دستور استفاده کنید اگر میخواهید یک فایل PKCS7 (domain.p7b
) را به یک فایل PEM تبدیل کنید.
openssl pkcs7 \
-in domain.p7b \
-print_certs -out domain.crt
توجه داشته باشید که اگر فایل PKCS7 شما شامل چندین مورد باشد (مثلاً یک گواهی و یک گواهی میانی CA)، فایل PEM ایجاد شده شامل تمام این موارد خواهد بود.
تبدیل PEM به PKCS12
از این دستور استفاده کنید اگر میخواهید یک کلید خصوصی (domain.key
) و یک گواهی (domain.crt
) را ترکیب کرده و یک فایل PKCS12 (domain.pfx
) ایجاد کنید.
openssl pkcs12 \
-inkey domain.key \
-in domain.crt \
-export -out domain.pfx
در هنگام انجام این کار، از شما خواسته میشود که رمز عبور خروجی را وارد کنید که میتوانید آن را حالی بگذارید. توجه داشته باشید که میتوانید زنجیرهای از گواهیها را به فایل PKCS12 اضافه کنید، در این صورت باید تمام گواهیها را در یک فایل (PEM (domain.crt
ترکیب کنید.
فایلهای PKCS12 که با نام PFX نیز شناخته میشوند، معمولاً برای وارد کردن و صادر کردن زنجیره گواهیها در Microsoft IIS (ویندوز) استفاده میشوند.
تبدیل 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 کاربردهای بسیار دیگری نیز دارد که در اینجا به آنها پرداخته نشده است، بنابراین در صورت نیاز، میتوانید درباره سایر کاربردها سؤال کنید یا پیشنهاد دهید.
اگر در اجرای هر یک از دستورات با مشکلی مواجه شدید، حتماً نظر بگذارید (و خروجی نسخه OpenSSL خود را نیز ضمیمه کنید).