X509V3_CONFIG(5ssl) OpenSSL X509V3_CONFIG(5ssl)

x509v3_config - قالب پیکربندی افزونه‌های گواهی X.509 V3

چندین دستور OpenSSL می‌توانند بر اساس محتوای یک فایل پیکربندی و گزینه‌های خط فرمان (CLI) مانند -addext افزونه‌هایی را به یک گواهی یا درخواست گواهی اضافه کنند. نحو فایل‌های پیکربندی در config(5) شرح داده شده است. این دستورات معمولاً گزینه‌ای برای مشخص کردن نام فایل پیکربندی و بخشی درون آن فایل دارند؛ برای جزئیات به مستندات دستور مربوطه مراجعه کنید.

این صفحه در صورت نیاز در مثال‌ها، از extensions به‌عنوان نام بخش استفاده می‌کند.

هر مدخل در بخش افزونه به شکل زیر است:

name = [critical, ]value(s)

اگر critical وجود داشته باشد، افزونه به‌عنوان حیاتی (بحرانی) علامت‌گذاری خواهد شد.

اگر چندین مدخل برای نام افزونه یکسانی پردازش شوند، مدخل‌های بعدی جایگزین مدخل‌های قبلی با همان نام می‌شوند.

قالب values به مقدار name بستگی دارد؛ بسیاری از آن‌ها دارای یک جفت نوع-مقدار هستند که در آن نوع و مقدار با دو‌نقطه از هم جدا می‌شوند. چهار نوع اصلی افزونه وجود دارد:

string
multi-valued
raw
arbitrary

هر کدام در بندهای زیر شرح داده شده‌اند.

افزونه‌های رشته‌ای (string) صرفاً دارای یک رشته هستند که یا خود مقدار یا نحوه به‌دست آوردن آن را در بر دارد.

افزونه‌های چندمقداری (multi-valued) دارای یک قالب کوتاه و یک قالب بلند هستند. قالب کوتاه فهرستی جداشده با کاما از نام‌ها و مقادیر است:

basicConstraints = critical, CA:true, pathlen:1

قالب بلند امکان قرار دادن مقادیر را در یک بخش مجزا فراهم می‌کند:

[extensions]
basicConstraints = critical, @basic_constraints
[basic_constraints]
CA = true
pathlen = 1

هر دو قالب معادل یکدیگر هستند.

اگر یک افزونه چندمقداری باشد و مقدار یک فیلد حاوی کاما باشد، باید از قالب بلند استفاده شود؛ در غیر این صورت کاما به‌اشتباه به‌عنوان جداکننده فیلد تفسیر خواهد شد. برای مثال:

subjectAltName = URI:ldap://somehost.com/CN=foo,OU=bar

خطا ایجاد خواهد کرد، اما شکل معادل آن:

[extensions]
subjectAltName = @subject_alt_section
[subject_alt_section]
subjectAltName = URI:ldap://somehost.com/CN=foo,OU=bar

معتبر است.

نرم‌افزار OpenSSL از تکرار چندباره یک فیلد درون یک بخش پشتیبانی نمی‌کند. در این مثال:

[extensions]
subjectAltName = @alt_section
[alt_section]
email = steve@example.com
email = steve@example.org

فقط آخرین مقدار شناسایی خواهد شد. برای مشخص کردن چندین مقدار، همان‌طور که در اینجا نشان داده شده است، یک شناسه عددی اضافه کنید:

[extensions]
subjectAltName = @alt_section
[alt_section]
email.1 = steve@example.com
email.2 = steve@example.org

نحو افزونه‌های خام (raw) توسط کد منبعی که افزونه را تجزیه می‌کند تعریف می‌شود، اما باید مستندسازی شود. برای نمونه‌ای از یک افزونه خام، به «سیاست‌های گواهی» (Certificate Policies) مراجعه کنید.

اگر نوع افزونه‌ای پشتیبانی نشود، باید از نحو افزونه arbitrary (دلخواه) استفاده شود؛ برای جزئیات بیشتر به بخش «افزونه‌های دلخواه (ARBITRARY EXTENSIONS)» مراجعه کنید.

بخش‌های زیر نحو هر یک از افزونه‌های پشتیبانی‌شده را شرح می‌دهند. این بخش‌ها معناشناسی (semantics) افزونه را تعریف نمی‌کنند.

این یک افزونه چندمقداری است که مشخص می‌کند آیا یک گواهی، گواهی مرجع صدور گواهی (CA) است یا خیر. مقدار نخست CA به همراه TRUE یا FALSE است. اگر CA برابر TRUE باشد، می‌توان نام اختیاری pathlen به همراه یک مقدار غیرمنفی را نیز گنجاند.

برای مثال:

basicConstraints = CA:TRUE
basicConstraints = CA:FALSE
basicConstraints = critical, CA:TRUE, pathlen:1

یک گواهی CA باید نام basicConstraints را همراه با پارامتر CA تنظیم‌شده روی TRUE داشته باشد. یک گواهی کاربر نهایی باید مقدار CA:FALSE داشته باشد یا این افزونه را به‌طور کامل حذف کند. پارامتر pathlen حداکثر تعداد CAهایی را که می‌توانند در یک زنجیره پس از این گواهی قرار گیرند مشخص می‌کند. مقدار صفر برای pathlen به این معنی است که این CA نمی‌تواند هیچ زیر-CAای را امضا کند و فقط می‌تواند گواهی‌های نهاد نهایی (end-entity) را امضا نماید.

کاربرد کلید یک افزونه چندمقداری شامل فهرستی از نام‌های کاربردهای مجاز کلید است. مقادیر تعریف‌شده عبارتند از: "digitalSignature"، "nonRepudiation" (با نام جایگزین "contentCommitment")، "keyEncipherment"، "dataEncipherment"، "keyAgreement"، "keyCertSign"، "cRLSign"، "encipherOnly" و "decipherOnly".

مثال‌ها:

keyUsage = digitalSignature, nonRepudiation
keyUsage = digitalSignature, contentCommitment
keyUsage = critical, keyCertSign

این افزونه شامل فهرستی از مقادیر است که اهداف مجاز برای استفاده از کلید عمومی گواهی را مشخص می‌کند. هر مقدار می‌تواند یک نام متنی کوتاه یا یک OID باشد. نام‌های متنی زیر و معانی مورد نظر آن‌ها شناخته‌شده هستند:

Value                  Meaning according to RFC 5280 etc.
-----                  ----------------------------------
serverAuth             SSL/TLS WWW Server Authentication
clientAuth             SSL/TLS WWW Client Authentication
codeSigning            Code Signing
emailProtection        E-mail Protection (S/MIME)
timeStamping           Trusted Timestamping
OCSPSigning            OCSP Signing
ipsecIKE               ipsec Internet Key Exchange
msCodeInd              Microsoft Individual Code Signing (authenticode)
msCodeCom              Microsoft Commercial Code Signing (authenticode)
msCTLSign              Microsoft Trust List Signing
msEFS                  Microsoft Encrypted File System

در حالی که سند RFC 5280 کارگروه IETF بیان می‌کند که id-kp-serverAuth و id-kp-clientAuth فقط برای استفاده در وب (WWW) هستند، در عمل برای انواع کلاینت‌ها و سرورهای TLS به کار می‌روند و این همان فرضی است که OpenSSL نیز در نظر می‌گیرد.

مثال‌ها:

extendedKeyUsage = critical, codeSigning, 1.2.3.4
extendedKeyUsage = serverAuth, clientAuth

مشخصات افزونه SKID دارای مقداری با سه گزینه انتخابی است.

هیچ افزونه SKIDای گنجانده نخواهد شد.
فرایند مشخص‌شده در بخش 4.2.1.2. (1) سند RFC 5280 دنبال می‌شود: مقدار keyIdentifier از درهم‌سازی ۱۶۰ بیتی SHA-1 مقدار رشته بیتی (BIT STRING) مربوط به subjectPublicKey (به استثنای برچسب، طول و تعداد بیت‌های استفاده‌نشده) تشکیل می‌شود.
یک رشته هگزادسیمال (احتمالاً با ":" برای جداسازی بایت‌ها)
مقدار ارائه‌شده مستقیماً خروجی داده می‌شود. استفاده از این گزینه اکیداً منع شده است.

به‌طور پیش‌فرض برنامه‌های x509، req و ca طوری عمل می‌کنند که گویی hash داده شده است.

مثال:

subjectKeyIdentifier = hash

مشخصات افزونه AKID ممکن است مقدار none داشته باشد که نشان می‌دهد هیچ AKIDای نباید گنجانده شود. در غیر این صورت ممکن است مقدار keyid یا issuer یا هر دوی آن‌ها باشد که با "," از هم جدا می‌شوند. هر یک یا هر دوی آن‌ها می‌توانند گزینه always را داشته باشند که با قرار دادن دو‌نقطه ":" بین مقدار و این گزینه مشخص می‌شود. برای گواهی‌های خودامضا (self-signed)، مقدار AKID نادیده گرفته می‌شود مگر اینکه always حضور داشته باشد.

به‌طور پیش‌فرض برنامه‌های x509، req و ca برای گواهی‌های خودامضا طوری رفتار می‌کنند که گویی none داده شده است، و در غیر این صورت مانند keyid"," issuer عمل می‌کنند.

اگر keyid حضور داشته باشد، تلاشی برای کپی کردن شناسه کلید موضوع (SKID) از گواهی صادرکننده صورت می‌گیرد، مگر اینکه گواهی صادرکننده همان گواهی جاری بوده و خودامضا نباشد. اگر گواهی صادرکننده همان گواهی جاری باشد، هش کلید عمومی مربوط به کلید امضا به‌عنوان جایگزین (fallback) در نظر گرفته می‌شود. اگر always وجود داشته باشد اما هیچ مقداری حاصل نشود، یک خطا برگردانده می‌شود.

اگر issuer حضور داشته باشد و علاوه بر آن گزینه always مشخص شده باشد یا keyid وجود نداشته باشد، نام متمایز (DN) صادرکننده و شماره سریال از گواهی صادرکننده کپی می‌شوند. اگر این کار ناموفق باشد، یک خطا برگردانده می‌شود.

مثال‌ها:

authorityKeyIdentifier = keyid, issuer
authorityKeyIdentifier = keyid, issuer:always

این یک افزونه چندمقداری است که از چندین نوع شناسه نام پشتیبانی می‌کند، از جمله: email (یک نشانی ایمیل)، URI (شناسه یکنواخت منبع)، DNS (نام دامنه DNS)، RID (یک شناسه ثبت‌شده: OBJECT IDENTIFIER)، IP (یک نشانی IP)، dirName (یک نام متمایز)، و otherName نحو هر یک در بندهای زیر شرح داده شده است.

گزینه email دو مقدار ویژه دارد. "copy" به‌طور خودکار هر نشانی ایمیلی را که در نام موضوع گواهی وجود دارد در افزونه می‌گنجاند. "move" به‌طور خودکار هر نشانی ایمیلی را از نام موضوع گواهی به افزونه منتقل می‌کند.

نشانی IP مورد استفاده در گزینه IP می‌تواند در قالب IPv4 یا IPv6 باشد.

مقدار dirName بخش پیکربندی شامل نام متمایز مورد استفاده را به‌صورت مجموعه‌ای از جفت‌های نام-مقدار مشخص می‌کند. ویژگی‌های AVA چندمقداری را می‌توان با افزودن نویسه + قبل از نام تشکیل داد.

مقدار otherName می‌تواند شامل داده‌های دلخواه مرتبط با یک OID باشد؛ مقدار باید OID باشد که به دنبال آن یک نقطه‌ویرگول و محتوای مشخص‌شده با استفاده از نحو ASN1_generate_nconf(3) می‌آید.

مثال‌ها:

subjectAltName = email:copy, email:my@example.com, URI:http://my.example.com/
subjectAltName = IP:192.168.7.1
subjectAltName = IP:13::17
subjectAltName = email:my@example.com, RID:1.2.3.4
subjectAltName = otherName:1.2.3.4;UTF8:some other identifier
[extensions]
subjectAltName = dirName:dir_sect
[dir_sect]
C = UK
O = My Organization
OU = My Unit
CN = My Name

نشانی‌های ایمیل غیراسکی (Non-ASCII) منطبق با نحو تعریف‌شده در بخش 3.3 سند RFC 6531 به‌صورت otherName.SmtpUTF8Mailbox ارائه می‌شوند. طبق سند RFC 8398، نشانی ایمیل باید به‌صورت UTF8String ارائه گردد. برای اعمال نمایش معتبر در گواهی، SmtpUTF8Mailbox باید به‌صورت زیر ارائه شود:

subjectAltName=@alts
[alts]
otherName = 1.3.6.1.5.5.7.8.9;FORMAT:UTF8,UTF8String:nonasciiname.example.com

این افزونه از اکثر گزینه‌های نام جایگزین موضوع پشتیبانی می‌کند؛ اما از email:copy پشتیبانی نمی‌کند. همچنین issuer:copy را به‌عنوان یک مقدار مجاز اضافه می‌کند که در صورت امکان، هر نام جایگزین موضوعی را از گواهی صادرکننده کپی می‌کند.

مثال:

issuerAltName = issuer:copy

این افزونه جزئیاتی درباره نحوه بازیابی اطلاعات مربوط به گواهی که CA در دسترس قرار می‌دهد، ارائه می‌کند. نحو آن به‌صورت access_id;location است که در آن access_id یک شناسه شیء (OID) است (اگرچه فقط چند مقدار شناخته‌شده هستند) و location دارای همان نحو نام جایگزین موضوع است (به جز اینکه email:copy پشتیبانی نمی‌شود).

مقادیر ممکن برای access_id شامل OCSP (پاسخ‌دهنده OCSP)، caIssuers (صادرکنندگان CA)، ad_timestamping (برچسب‌گذاری زمانی AD)، AD_DVCS (سرویس ad dvcs) و caRepository (مخزن CA) است.

مثال‌ها:

authorityInfoAccess = OCSP;URI:http://ocsp.example.com/,caIssuers;URI:http://myca.example.com/ca.cer
authorityInfoAccess = OCSP;URI:http://ocsp.example.com/

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

هنگامی که از یک جفت نام-مقدار استفاده می‌شود، افزونه DistributionPoint با مقدار ارائه‌شده به‌عنوان فیلد fullName برای مقدار distributionPoint تنظیم می‌شود و فیلدهای reasons و cRLIssuer نادیده گرفته می‌شوند.

هنگامی که از یک گزینه منفرد استفاده می‌شود، مقدار آن بخش را مشخص می‌کند و آن بخش می‌تواند شامل موارد زیر باشد:

نام کامل نقطه توزیع، با همان قالب نام جایگزین موضوع.
مقدار به‌عنوان تکه‌ای از نام متمایز در نظر گرفته می‌شود که به‌عنوان مقدار فیلد nameRelativeToCRLIssuer تنظیم می‌گردد.
مقدار باید در همان قالب نام جایگزین موضوع باشد.
یک فیلد چندمقداری حاوی دلایل ابطال. مقادیر شناخته‌شده عبارتند از: "keyCompromise"، "CACompromise"، "affiliationChanged"، "superseded"، "cessationOfOperation"، "certificateHold"، "privilegeWithdrawn" و "AACompromise".

فقط یکی از گزینه‌های fullname یا relativename باید مشخص شود.

مثال‌های ساده:

crlDistributionPoints = URI:http://example.com/myca.crl
crlDistributionPoints = URI:http://example.com/myca.crl, URI:http://example.org/my.crl

مثال کامل نقطه توزیع:

[extensions]
crlDistributionPoints = crldp1_section
[crldp1_section]
fullname = URI:http://example.com/myca.crl
CRLissuer = dirName:issuer_sect
reasons = keyCompromise, CACompromise
[issuer_sect]
C = UK
O = Organisation
CN = Some Name

این افزونه فقط باید در CRLها ظاهر شود. این یک افزونه چندمقداری است که نحو آن شبیه به «بخشی» است که توسط افزونه نقاط توزیع CRL به آن ارجاع داده می‌شود. نام‌های زیر دارای معنی هستند:

نام کامل نقطه توزیع، با همان قالب نام جایگزین موضوع.
مقدار به‌عنوان تکه‌ای از نام متمایز در نظر گرفته می‌شود که به‌عنوان مقدار فیلد nameRelativeToCRLIssuer تنظیم می‌گردد.
یک فیلد چندمقداری حاوی دلایل ابطال. مقادیر شناخته‌شده عبارتند از: "keyCompromise"، "CACompromise"، "affiliationChanged"، "superseded"، "cessationOfOperation"، "certificateHold"، "privilegeWithdrawn" و "AACompromise".
مقدار هر یک از این نام‌ها یک مقدار بولی (boolean) است.

مثال:

[extensions]
issuingDistributionPoint = critical, @idp_section
[idp_section]
fullname = URI:http://example.com/myca.crl
indirectCRL = TRUE
onlysomereasons = keyCompromise, CACompromise

این یک افزونه خام (raw) است که از تمام فیلدهای تعریف‌شده افزونه گواهی پشتیبانی می‌کند.

سیاست‌های بدون توصیف‌کننده (qualifier) با مشخص کردن OID تعیین می‌شوند. چندین سیاست با کاما از هم جدا می‌شوند. برای مثال:

certificatePolicies = 1.2.4.5, 1.1.3.4

برای گنجاندن توصیف‌کننده‌های سیاست، از نحو «‎@section‎» برای ارجاع به بخشی که تمام اطلاعات را مشخص می‌کند استفاده کنید.

بخش مورد ارجاع باید شامل OID سیاست با استفاده از نام policyIdentifier باشد. توصیف‌کننده‌های cPSuri را می‌توان با استفاده از نحو زیر گنجاند:

CPS.nnn = value

که در آن "nnn" یک عدد است.

توصیف‌کننده‌های userNotice را می‌توان با استفاده از نحو زیر تنظیم کرد:

userNotice.nnn = @notice

مقدار توصیف‌کننده userNotice در بخش مربوطه مشخص می‌شود. این بخش می‌تواند شامل گزینه‌های explicitText، organization و noticeNumbers باشد. گزینه‌های explicitText و organization رشته‌های متنی هستند، و noticeNumbers فهرستی جداشده با کاما از اعداد است. گزینه‌های organization و noticeNumbers (در صورت گنجانده شدن) باید هر دو با هم وجود داشته باشند. برخی نرم‌افزارها ممکن است به گزینه ia5org در سطح بالا نیاز داشته باشند؛ این گزینه نوع کدگذاری را از Displaytext به IA5String تغییر می‌دهد.

مثال:

[extensions]
certificatePolicies = ia5org, 1.2.3.4, 1.5.6.7.8, @polsect
[polsect]
policyIdentifier = 1.3.5.8
CPS.1 = "http://my.host.example.com"
CPS.2 = "http://my.your.example.com"
userNotice.1 = @notice
[notice]
explicitText = "Explicit Text Here"
organization = "Organisation Name"
noticeNumbers = 1, 2, 3, 4

کدگذاری نویسه‌های explicitText را می‌توان با افزودن پیشوند UTF8، BMP یا VISIBLE به همراه دو‌نقطه قبل از مقدار مشخص کرد. برای مثال:

[notice]
explicitText = "UTF8:Explicit Text Here"

این یک افزونه چندمقداری است که از نام‌های requireExplicitPolicy یا inhibitPolicyMapping و یک مقدار عدد صحیح غیرمنفی تشکیل شده است. حداقل یک جزء باید وجود داشته باشد.

مثال:

policyConstraints = requireExplicitPolicy:3

این یک افزونه رشته‌ای است که مقدار آن باید یک عدد صحیح غیرمنفی باشد.

مثال:

inhibitAnyPolicy = 2

این یک افزونه چندمقداری است. نام باید با کلمه permitted یا excluded به همراه یک ; آغاز شود. ادامه نام و مقدار از نحو subjectAltName پیروی می‌کند، به جز اینکه email:copy پشتیبانی نمی‌شود و قالب IP باید شامل یک نشانی IP و ماسک زیرشبکه باشد که با یک / از هم جدا شده‌اند.

مثال‌ها:

nameConstraints = permitted;IP:192.168.0.0/255.255.0.0
nameConstraints = permitted;email:.example.com
nameConstraints = excluded;email:.com

این یک افزونه رشته‌ای است. این افزونه تجزیه می‌شود، اما نادیده گرفته خواهد شد.

مثال:

noCheck = ignored

این یک افزونه چندمقداری شامل فهرستی از شناسه‌های افزونه TLS است. هر شناسه می‌تواند یک عدد (0..65535) یا یک نام پشتیبانی‌شده باشد. هنگامی که یک کلاینت TLS افزونه‌ای از این فهرست را ارسال می‌کند، انتظار می‌رود که سرور TLS آن افزونه را در پاسخ خود بگنجاند.

نام‌های پشتیبانی‌شده عبارتند از: status_request و status_request_v2

مثال:

tlsfeature = status_request

افزونه‌های زیر غیراستاندارد، مختص نت‌اسکیپ (Netscape) و تا حد زیادی منسوخ هستند. استفاده از آن‌ها در برنامه‌های جدید منع شده است.

یادداشت نت‌اسکیپ (nsComment) یک افزونه رشته‌ای شامل توضیحی است که هنگام مشاهده گواهی در برخی مرورگرها نمایش داده می‌شود. افزونه‌های دیگر از این نوع عبارتند از: nsBaseUrl، nsRevocationUrl، nsCaRevocationUrl، nsRenewalUrl، nsCaPolicyUrl و nsSslServerName

این یک افزونه چندمقداری است که شامل فهرستی از پرچم‌ها برای گنجانده شدن است. این افزونه برای مشخص کردن اهدافی که گواهی می‌تواند برای آن‌ها استفاده شود به کار می‌رفت. امروزه افزونه‌های basicConstraints، keyUsage و کاربرد گسترش‌یافته کلید به‌جای آن استفاده می‌شوند.

مقادیر قابل قبول برای nsCertType عبارتند از: client، server، email، objsign، reserved، sslCA، emailCA، objCA

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

دو راه برای کدگذاری افزونه‌های دلخواه وجود دارد.

روش اول استفاده از کلمه ASN1 و به دنبال آن محتوای افزونه با استفاده از همان نحو ASN1_generate_nconf(3) است. برای مثال:

[extensions]
1.2.3.4 = critical, ASN1:UTF8String:Some random data
1.2.3.4.1 = ASN1:SEQUENCE:seq_sect
[seq_sect]
field1 = UTF8:field1
field2 = UTF8:field2

همچنین می‌توان از کلمه DER برای گنجاندن داده‌های کدگذاری‌شده خام در هر افزونه‌ای استفاده کرد.

1.2.3.4 = critical, DER:01:02:03:04
1.2.3.4.1 = DER:01020304

مقدار پس از DER یک تخلیه هگزادسیمال (hex dump) از کدگذاری DER افزونه است. هر افزونه‌ای را می‌توان در این قالب قرار داد تا رفتار پیش‌فرض بازنویسی شود. برای مثال:

basicConstraints = critical, DER:00:01:02:03

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

گزینه‌های DER و ASN1 باید با احتیاط استفاده شوند. در صورت عدم استفاده دقیق، امکان ایجاد افزونه‌های نامعتبر وجود دارد.

openssl-req(1), openssl-ca(1), openssl-x509(1), ASN1_generate_nconf(3)

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

تحت مجوز آپاچی نسخه 2.0 («مجوز») منتشر شده است. شما نمی‌توانید از این پرونده استفاده کنید مگر در انطباق با این مجوز. می‌توانید نسخه‌ای از مجوز را در پرونده LICENSE در توزیع کد منبع یا در https://www.openssl.org/source/license.html به‌دست آورید.

2026-08-25 3.6.4