OPENSSL-SMIME(1ssl) OpenSSL OPENSSL-SMIME(1ssl)

openssl-smime - دستور S/MIME برای مدیریت، رمزگذاری، رمزگشایی، امضا و اعتبارسنجی پیام‌ها

openssl smime [-help] [-encrypt] [-decrypt] [-sign] [-resign] [-verify] [-pk7out] [-binary] [-crlfeol] [-cipher] [-in file] [-certfile file] [-signer file] [-nointern] [-noverify] [-nochain] [-nosigs] [-nocerts] [-noattr] [-nodetach] [-nosmimecap] [-recip file] [-inform DER|PEM|SMIME] [-outform DER|PEM|SMIME] [-keyform DER|PEM|P12|ENGINE] [-passin arg] [-inkey filename|uri] [-out file] [-content file] [-to addr] [-from ad] [-subject s] [-text] [-indef] [-noindef] [-stream] [-md digest] [-CAfile file] [-no-CAfile] [-CApath dir] [-no-CApath] [-CAstore uri] [-no-CAstore] [-engine id] [-rand files] [-writerand file] [-allow_proxy_certs] [-attime timestamp] [-no_check_time] [-check_ss_sig] [-crl_check] [-crl_check_all] [-explicit_policy] [-extended_crl] [-ignore_critical] [-inhibit_any] [-inhibit_map] [-partial_chain] [-policy arg] [-policy_check] [-policy_print] [-purpose purpose] [-suiteB_128] [-suiteB_128_only] [-suiteB_192] [-trusted_first] [-no_alt_chains] [-use_deltas] [-auth_level num] [-verify_depth num] [-verify_email email] [-verify_hostname hostname] [-verify_ip ip] [-verify_name name] [-x509_strict] [-issuer_checks] [-provider name] [-provider-path path] [-provparam [name:]key=value] [-propquery propq] [-config configfile] recipcert ...

این دستور S/MIME را بر اساس RFC 2311 (سال ۱۹۹۸) بدون پشتیبانی از CMS مدیریت می‌کند. این دستور می‌تواند پیام‌های S/MIME 2.0 را رمزگذاری، رمزگشایی، امضا و اعتبارسنجی کند. برای پیام‌های جدیدتر از ابزار CMS در OpenSSL استفاده کنید.

شش گزینه عملیاتی وجود دارند که نوع عملیات قابل اجرا را تعیین می‌کنند: -encrypt، -decrypt، -sign، -resign، -verify و -pk7out. این گزینه‌ها مانعة‌الجمع هستند. مفهوم سایر گزینه‌ها بر اساس نوع عملیات متفاوت خواهد بود.

نمایش پیام راهنمای نحوه استفاده.
رمزگذاری ایمیل برای گواهی‌های گیرنده مشخص‌شده. فایل ورودی همان پیامی است که باید رمزگذاری شود. فایل خروجی، ایمیل رمزگذاری‌شده در قالب MIME است.

توجه داشته باشید که هیچ بررسی ابطالی برای گواهی گیرنده انجام نمی‌شود؛ بنابراین اگر آن کلید افشا شده باشد، ممکن است دیگران بتوانند متن را رمزگشایی کنند.

رمزگشایی ایمیل با استفاده از گواهی و کلید خصوصی ارائه‌شده. برای فایل ورودی انتظار یک پیام ایمیل رمزگذاری‌شده در قالب MIME را دارد. ایمیل رمزگشایی‌شده در فایل خروجی نوشته می‌شود.
امضای ایمیل با استفاده از گواهی و کلید خصوصی ارائه‌شده. فایل ورودی همان پیامی است که باید امضا شود. پیام امضاشده در قالب MIME در فایل خروجی نوشته می‌شود.
امضای مجدد پیام: دریافت یک پیام موجود و اعمال یک یا چند امضاکننده جدید روی آن.
اعتبارسنجی ایمیل امضاشده. در ورودی انتظار یک پیام ایمیل امضاشده را دارد و داده‌های امضاشده را در خروجی می‌نویسد. هر دو نوع امضای متن‌واضح (clear text) و مات (opaque) پشتیبانی می‌شوند.
یک پیام ورودی را دریافت کرده و یک ساختار PKCS#7 با کدگذاری PEM در خروجی می‌نویسد.
پیام ورودی که باید رمزگذاری یا امضا شود، یا پیام MIME که باید رمزگشایی یا اعتبارسنجی گردد.
متن پیامی که رمزگشایی یا اعتبارسنجی شده است، یا پیام خروجی در قالب MIME که امضا یا اعتبارسنجی شده است.
قالب ورودی ساختار PKCS#7 (یا S/MIME) در صورتی که ساختاری در حال خوانده شدن باشد؛ پیش‌فرض SMIME است. برای جزئیات بیشتر به openssl-format-options(1) مراجعه کنید.
قالب خروجی ساختار PKCS#7 (یا S/MIME) در صورتی که ساختاری در حال نوشته شدن باشد؛ پیش‌فرض SMIME است. برای جزئیات بیشتر به openssl-format-options(1) مراجعه کنید.
قالب کلید؛ به صورت پیش‌فرض مشخص نشده است. برای جزئیات بیشتر به openssl-format-options(1) مراجعه کنید.
گزینه‌های -stream و -indef معادل یکدیگرند و جریان ورودی/خروجی (streaming I/O) را برای عملیات کدگذاری فعال می‌کنند. این قابلیت امکان پردازش داده‌ها در یک دور را بدون نیاز به نگه‌داشتن کل محتوا در حافظه فراهم کرده و از فایل‌های بسیار بزرگ پشتیبانی می‌کند. جریان‌سازی داده‌ها برای امضای S/MIME با داده‌های جداشده (detached) در صورتی که قالب خروجی SMIME باشد به صورت خودکار فعال است، اما در حال حاضر برای سایر عملیات به طور پیش‌فرض غیرفعال است.
غیرفعال کردن جریان I/O در جاهایی که یک کدگذاری ساخت‌یافته با طول نامعین تولید می‌کند. این گزینه در حال حاضر هیچ تاثیری ندارد. در آینده جریان‌سازی به طور پیش‌فرض در تمام عملیات مربوطه فعال خواهد بود و این گزینه آن را غیرفعال خواهد کرد.
فایلی حاوی محتوای جداشده (detached content) را مشخص می‌کند که فقط با دستور -verify کاربرد دارد. این گزینه تنها زمانی قابل استفاده است که ساختار PKCS#7 از نوع امضای جداشده استفاده کند و محتوا درون ساختار گنجانده نشده باشد. اگر قالب ورودی S/MIME باشد و از نوع محتوای MIME به صورت multipart/signed استفاده کند، این گزینه هرگونه محتوایی را بازنویسی خواهد کرد.
این گزینه در صورت رمزگذاری یا امضا، هدرهای MIME متن ساده (text/plain) را به پیام ارائه‌شده اضافه می‌کند. در صورت رمزگشایی یا اعتبارسنجی، هدرهای متنی را حذف می‌کند: اگر پیام رمزگشایی‌شده یا اعتبارسنجی‌شده از نوع MIME به صورت text/plain نباشد، خطایی رخ می‌دهد.
الگوریتم خلاصه پیام (digest) مورد استفاده هنگام امضا یا امضای مجدد. در صورت عدم تعیین، از الگوریتم خلاصه پیش‌فرض کلید امضاکننده استفاده خواهد شد (معمولاً SHA1).
الگوریتم رمزگذاری مورد استفاده. به عنوان مثال، DES (۵۶ بیتی) - -des، الگوریتم Triple DES (۱۶۸ بیتی) - -des3، یا AES (۲۵۶ بیتی) - -aes256. هر نام الگوریتم استاندارد دیگری نیز (همان‌طور که توسط تابع EVP_get_cipherbyname() استفاده می‌شود) می‌تواند با افزودن یک خط تیره در ابتدا، به کار رود؛ مانند -aes-128-cbc. برای مشاهده فهرست رمزهای پشتیبانی‌شده توسط نسخه OpenSSL خود به openssl-enc(1) مراجعه کنید.

در صورت عدم تعیین، AES-256-CBC به عنوان پیش‌فرض استفاده می‌شود. این گزینه فقط با -encrypt به کار می‌رود.

هنگام اعتبارسنجی یک پیام، به طور معمول گواهی‌های موجود در پیام (در صورت وجود) برای یافتن گواهی امضاکننده جستجو می‌شوند. با این گزینه، تنها گواهی‌های مشخص‌شده در گزینه -certfile مورد استفاده قرار می‌گیرند. با این وجود، گواهی‌های ارائه‌شده همچنان می‌توانند به عنوان CAهای غیرقابل‌اعتماد استفاده شوند.
گواهی امضاکننده یک پیام امضاشده اعتبارسنجی نمی‌شود.
اعتبارسنجی زنجیره گواهی‌های امضاکنندگان را انجام نمی‌دهد؛ به این معنی که از گواهی‌های موجود در پیام امضاشده به عنوان CAهای غیرقابل‌اعتماد استفاده نمی‌کند.
برای اعتبارسنجی امضاهای روی پیام تلاشی نمی‌شود.
هنگام امضای یک پیام، گواهی امضاکننده معمولاً درون پیام گنجانده می‌شود. با فعال بودن این گزینه، گواهی حذف می‌گردد. این کار حجم پیام امضاشده را کاهش می‌دهد، اما اعتبارسنج باید یک نسخه از گواهی امضاکننده را به صورت محلی در دسترس داشته باشد (به عنوان مثال از طریق گزینه -certfile ارسال شود).
به طور معمول هنگام امضای یک پیام، مجموعه‌ای از ویژگی‌ها شامل زمان امضا و الگوریتم‌های متقارن پشتیبانی‌شده در پیام گنجانده می‌شوند. با این گزینه، این ویژگی‌ها اضافه نمی‌شوند.
هنگام امضای یک پیام از امضای مات (opaque) استفاده می‌کند. این حالت در برابر تغییرات ناشی از بازپخش‌کننده‌های ایمیل (mail relays) مقاوم‌تر است، اما توسط برنامه‌های ایمیلی که از S/MIME پشتیبانی نمی‌کنند قابل خواندن نیست. بدون این گزینه، از امضای متن‌واضح با نوع MIME به صورت multipart/signed استفاده می‌شود.
هنگام امضای یک پیام، ویژگی SMIMECapabilities را نگنجانید.
به طور معمول پیام ورودی به قالب استاندارد (canonical) تبدیل می‌شود که عملاً استفاده از CR و LF به عنوان پایان خط است (طبق الزامات مشخصات S/MIME). با این گزینه، هیچ تبدیلی صورت نمی‌گیرد. این قابلیت هنگام کار با داده‌های باینری که ممکن است در قالب MIME نباشند کاربرد دارد.
به طور معمول فایل خروجی از یک نویسه LF به عنوان پایان خط استفاده می‌کند. با این گزینه، به جای آن از CRLF استفاده می‌شود.
امکان مشخص کردن گواهی‌های اضافی را فراهم می‌کند. هنگام امضا، این گواهی‌ها همراه پیام گنجانده می‌شوند. هنگام اعتبارسنجی، این فایل برای یافتن گواهی‌های امضاکننده جستجو شده و برای ساخت زنجیره استفاده خواهد شد.

ورودی می‌تواند در قالب PEM، DER یا PKCS#12 باشد.

گواهی امضاکننده هنگام امضا یا امضای مجدد یک پیام؛ در صورتی که به بیش از یک امضاکننده نیاز باشد، این گزینه می‌تواند چندین بار استفاده شود. اگر پیامی در حال اعتبارسنجی باشد، در صورت موفقیت اعتبارسنجی گواهی‌های امضاکنندگان در این فایل نوشته خواهند شد.
گواهی گیرنده هنگام رمزگشایی پیام. این گواهی باید با یکی از گیرندگان پیام تطابق داشته باشد، در غیر این صورت خطا رخ می‌دهد.
کلید خصوصی مورد استفاده هنگام امضا یا رمزگشایی. این کلید باید با گواهی مربوطه همخوانی داشته باشد. اگر این گزینه مشخص نشود، کلید خصوصی باید در فایل گواهی تعیین‌شده با گزینه -recip یا -signer گنجانده شده باشد. هنگام امضا، این گزینه می‌تواند چندین بار برای تعیین کلیدهای متوالی به کار رود.
منبع گذرواژه کلید خصوصی. برای اطلاعات بیشتر درباره قالب arg به openssl-passphrase-options(1) مراجعه کنید.
هدرهای مرتبط ایمیل. این هدرها در خارج از بخش امضاشده پیام قرار می‌گیرند، بنابراین می‌توان آن‌ها را به صورت دستی اضافه کرد. در صورت امضا، بسیاری از کلاینت‌های ایمیل S/MIME بررسی می‌کنند که نشانی ایمیل گواهی امضاکننده با نشانی مشخص‌شده در هدر From: تطابق داشته باشد.
تنظیم گزینه‌های گوناگون برای اعتبارسنجی زنجیره گواهی. برای جزئیات بیشتر به بخش «گزینه‌های اعتبارسنجی» در openssl-verification-options(1) مراجعه کنید.

هرگونه خطای اعتبارسنجی موجب خروج دستور خواهد شد.

برای جزئیات بیشتر به بخش «گزینه‌های گواهی معتمد» در openssl-verification-options(1) مراجعه کنید.
به بخش «گزینه‌های موتور» در openssl(1) مراجعه کنید. این گزینه منسوخ شده است.
برای جزئیات بیشتر به بخش «گزینه‌های وضعیت تصادفی» در openssl(1) مراجعه کنید.
به بخش «گزینه‌های ارائه‌دهنده» در openssl(1)، provider(7) و property(7) مراجعه کنید.
به بخش «گزینه پیکربندی» در openssl(1) مراجعه کنید.
یک یا چند گواهی از گیرندگان پیام، که هنگام رمزگذاری یک پیام استفاده می‌شود.

پیام MIME باید بدون هیچ خط خالی میان هدرها و خروجی ارسال شود. برخی از برنامه‌های ایمیل به طور خودکار یک خط خالی اضافه می‌کنند. انتقال مستقیم ایمیل از طریق لوله‌کشی (pipe) به sendmail یکی از روش‌های دستیابی به قالب صحیح است.

پیام ارائه‌شده برای امضا یا رمزگذاری باید شامل هدرهای لازم MIME باشد، در غیر این صورت بسیاری از کلاینت‌های S/MIME آن را به درستی نمایش نخواهند داد (یا اصلاً نمایش نمی‌دهند). می‌توانید از گزینه -text برای افزودن خودکار هدرهای متن ساده استفاده کنید.

یک پیام «امضاشده و رمزگذاری‌شده» پیامی است که در آن یک پیام امضاشده، متعاقباً رمزگذاری می‌شود. این حالت را می‌توان با رمزگذاری پیامی که قبلاً امضا شده است تولید کرد؛ به بخش مثال‌ها مراجعه کنید.

این نسخه از برنامه فقط اجازه یک امضاکننده در هر پیام را می‌دهد، اما چندین امضاکننده را روی پیام‌های دریافتی اعتبارسنجی خواهد کرد. برخی از کلاینت‌های S/MIME در صورتی که پیام شامل چندین امضاکننده باشد دچار مشکل می‌شوند. امکان امضای پیام‌ها به صورت «موازی» از طریق امضای پیامی که قبلاً امضا شده است وجود دارد.

گزینه‌های -encrypt و -decrypt بازتابی از کاربردهای رایج در کلاینت‌های S/MIME هستند. از نظر فنی دقیق، این گزینه‌ها داده‌های محصورشده (enveloped data) در PKCS#7 را پردازش می‌کنند؛ داده‌های رمزگذاری‌شده PKCS#7 برای اهداف دیگری استفاده می‌شوند.

گزینه -resign هنگام افزودن امضاکننده جدید، از خلاصه پیام موجود استفاده می‌کند. این بدان معنی است که ویژگی‌ها باید حداقل در یکی از امضاکنندگان موجود با همان خلاصه پیام وجود داشته باشند، در غیر این صورت این عملیات ناموفق خواهد بود.

گزینه‌های -stream و -indef پشتیبانی از جریان ورودی/خروجی (streaming I/O) را فعال می‌کنند. در نتیجه، کدگذاری به روش BER با استفاده از کدگذاری ساخت‌یافته با طول نامعین انجام می‌شود و دیگر DER نخواهد بود. قابلیت جریان‌سازی برای عملیات -encrypt و همچنین عملیات -sign در صورتی که محتوا جدا نشده باشد پشتیبانی می‌شود.

جریان‌سازی همیشه برای عملیات -sign همراه با داده‌های جداشده استفاده می‌شود، اما از آن‌جا که محتوا دیگر بخشی از ساختار PKCS#7 نیست، کدگذاری به صورت DER باقی می‌ماند.

0
عملیات با موفقیت کامل انجام شد.
1
خطایی هنگام تجزیه گزینه‌های دستور رخ داد.
2
یکی از فایل‌های ورودی قابل خواندن نبود.
3
خطایی هنگام ایجاد فایل PKCS#7 یا خواندن پیام MIME رخ داد.
4
خطایی هنگام رمزگشایی یا اعتبارسنجی پیام رخ داد.
5
پیام به درستی اعتبارسنجی شد، اما هنگام نوشتن گواهی‌های امضاکنندگان خطایی رخ داد.

ایجاد یک پیام امضاشده با متن‌واضح:

openssl smime -sign -in message.txt -text -out mail.msg \
       -signer mycert.pem

ایجاد یک پیام امضاشده مات (opaque):

openssl smime -sign -in message.txt -text -out mail.msg -nodetach \
       -signer mycert.pem

ایجاد یک پیام امضاشده به همراه چند گواهی اضافی و خواندن کلید خصوصی از فایلی دیگر:

openssl smime -sign -in in.txt -text -out mail.msg \
       -signer mycert.pem -inkey mykey.pem -certfile mycerts.pem

ایجاد یک پیام امضاشده با دو امضاکننده:

openssl smime -sign -in message.txt -text -out mail.msg \
       -signer mycert.pem -signer othercert.pem

ارسال مستقیم یک پیام امضاشده در یونیکس به sendmail به همراه هدرها:

openssl smime -sign -in in.txt -text -signer mycert.pem \
       -from steve@openssl.org -to someone@somewhere \
       -subject "Signed message" | sendmail someone@somewhere

اعتبارسنجی یک پیام و استخراج گواهی امضاکننده در صورت موفقیت‌آمیز بودن:

openssl smime -verify -in mail.msg -signer user.pem -out signedtext.txt

ارسال ایمیل رمزگذاری‌شده با استفاده از Triple DES:

openssl smime -encrypt -in in.txt -out mail.msg -from steve@openssl.org \
       -to someone@somewhere -subject "Encrypted message" \
       -des3 user.pem

امضا و سپس رمزگذاری ایمیل:

openssl smime -sign -in ml.txt -signer my.pem -text \
       | openssl smime -encrypt -out mail.msg \
       -from steve@openssl.org -to someone@somewhere \
       -subject "Signed and Encrypted message" -des3 user.pem

نکته: دستور رمزگذاری شامل گزینه -text نیست زیرا پیامی که رمزگذاری می‌شود از قبل دارای هدرهای MIME است.

رمزگشایی ایمیل:

openssl smime -decrypt -in mail.msg -recip mycert.pem -inkey key.pem

خروجی حاصل از امضای فرم در نت‌اسکیپ (Netscape) یک ساختار PKCS#7 با قالب امضای جداشده (detached) است. شما می‌توانید با شکستن خطوط ساختار کدگذاری‌شده با Base64 و قرار دادن آن میان خطوط زیر، از این برنامه برای اعتبارسنجی امضا استفاده کنید:

-----BEGIN PKCS7-----
-----END PKCS7-----

و اجرای دستور:

openssl smime -verify -inform PEM -in signature.pem -content content.txt

یا می‌توانید امضا را از Base64 رمزگشایی کرده و از این دستور استفاده کنید:

openssl smime -verify -inform DER -in signature.der -content content.txt

ایجاد یک پیام رمزگذاری‌شده با استفاده از الگوریتم Camellia ۱۲۸ بیتی:

openssl smime -encrypt -in plain.txt -camellia128 -out mail.msg cert.pem

افزودن یک امضاکننده به پیامی موجود:

openssl smime -resign -in mail.msg -signer newsign.pem -out mail2.msg

تجزیه‌گر MIME چندان هوشمند نیست: به نظر می‌رسد بیشتر پیام‌هایی را که به آن داده شده مدیریت می‌کند، اما ممکن است در مواجهه با برخی دیگر دچار مشکل شود.

کد در حال حاضر فقط گواهی امضاکننده را در یک فایل می‌نویسد: اگر امضاکننده گواهی رمزگذاری جداگانه‌ای داشته باشد، باید به صورت دستی استخراج شود. باید نوعی روش اکتشافی (heuristic) وجود داشته باشد که گواهی رمزگذاری صحیح را تعیین کند.

در حالت ایده‌آل باید پایگاه‌داده‌ای از گواهی‌ها برای هر نشانی ایمیل نگهداری شود.

کد در حال حاضر به الگوریتم‌های رمزگذاری متقارن مجاز که در صفت امضاشده SMIMECapabilities ارائه شده‌اند توجهی نمی‌کند. این بدان معناست که کاربر باید الگوریتم رمزگذاری صحیح را به صورت دستی وارد نماید. باید فهرست رمزهای مجاز در یک پایگاه‌داده ذخیره شود و فقط از آن‌ها استفاده گردد.

هیچ‌گونه بررسی ابطالی روی گواهی امضاکننده انجام نمی‌شود.

کد فعلی فقط می‌تواند پیام‌های S/MIME نسخه ۲ را مدیریت کند؛ ساختارهای پیچیده‌تر S/MIME نسخه ۳ ممکن است باعث خطاهای تجزیه شوند.

ossl_store-file(7)

رمز پیش‌فرض رمزگذاری در OpenSSL 3.5 از 3DES به AES-256 تغییر یافت.

امکان استفاده از چندین گزینه -signer و دستور -resign برای نخستین بار در OpenSSL 1.0.0 اضافه شدند.

گزینه -no_alt_chains در OpenSSL 1.1.0 اضافه شد.

گزینه -engine در OpenSSL 3.0 منسوخ شد.

حق نشر ۲۰۰۰-۲۰۲۶ متعلق به نویسندگان پروژه OpenSSL است. کلیه حقوق محفوظ است.

تحت مجوز آپاچی، نسخه ۲.۰ ("مجوز") ارائه شده است. شما نمی‌توانید از این فایل استفاده کنید مگر در انطباق با این مجوز. می‌توانید نسخه‌ای از مجوز را در فایل LICENSE در توزیع مبدأ یا در نشانی زیر بیابید: https://www.openssl.org/source/license.html

2026-08-25 3.6.4