| X509V3_CONFIG(5ssl) | OpenSSL | X509V3_CONFIG(5ssl) |
نام (NAME)
x509v3_config - قالب پیکربندی افزونههای گواهی X.509 V3
توضیحات (DESCRIPTION)
چندین دستور 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)» مراجعه کنید.
افزونههای استاندارد (STANDARD EXTENSIONS)
بخشهای زیر نحو هر یک از افزونههای پشتیبانیشده را شرح میدهند. این بخشها معناشناسی (semantics) افزونه را تعریف نمیکنند.
محدودیتهای پایه (Basic Constraints)
این یک افزونه چندمقداری است که مشخص میکند آیا یک گواهی، گواهی مرجع صدور گواهی (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) را امضا نماید.
کاربرد کلید (Key Usage)
کاربرد کلید یک افزونه چندمقداری شامل فهرستی از نامهای کاربردهای مجاز کلید است. مقادیر تعریفشده عبارتند از: "digitalSignature"، "nonRepudiation" (با نام جایگزین "contentCommitment")، "keyEncipherment"، "dataEncipherment"، "keyAgreement"، "keyCertSign"، "cRLSign"، "encipherOnly" و "decipherOnly".
مثالها:
keyUsage = digitalSignature, nonRepudiation keyUsage = digitalSignature, contentCommitment keyUsage = critical, keyCertSign
کاربرد گسترشیافته کلید (Extended Key Usage)
این افزونه شامل فهرستی از مقادیر است که اهداف مجاز برای استفاده از کلید عمومی گواهی را مشخص میکند. هر مقدار میتواند یک نام متنی کوتاه یا یک 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
شناسه کلید موضوع (Subject Key Identifier)
مشخصات افزونه SKID دارای مقداری با سه گزینه انتخابی است.
- none
- هیچ افزونه SKIDای گنجانده نخواهد شد.
- hash
- فرایند مشخصشده در بخش 4.2.1.2. (1) سند RFC 5280 دنبال میشود: مقدار keyIdentifier از درهمسازی ۱۶۰ بیتی SHA-1 مقدار رشته بیتی (BIT STRING) مربوط به subjectPublicKey (به استثنای برچسب، طول و تعداد بیتهای استفادهنشده) تشکیل میشود.
- یک رشته هگزادسیمال (احتمالاً با ":" برای جداسازی بایتها)
- مقدار ارائهشده مستقیماً خروجی داده میشود. استفاده از این گزینه اکیداً منع شده است.
بهطور پیشفرض برنامههای x509، req و ca طوری عمل میکنند که گویی hash داده شده است.
مثال:
subjectKeyIdentifier = hash
شناسه کلید مرجع صدور (Authority Key Identifier)
مشخصات افزونه 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
نام جایگزین موضوع (Subject Alternative Name)
این یک افزونه چندمقداری است که از چندین نوع شناسه نام پشتیبانی میکند، از جمله: 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
نام جایگزین صادرکننده (Issuer Alternative Name)
این افزونه از اکثر گزینههای نام جایگزین موضوع پشتیبانی میکند؛ اما از email:copy پشتیبانی نمیکند. همچنین issuer:copy را بهعنوان یک مقدار مجاز اضافه میکند که در صورت امکان، هر نام جایگزین موضوعی را از گواهی صادرکننده کپی میکند.
مثال:
issuerAltName = issuer:copy
دسترسی به اطلاعات مرجع صدور (Authority Info Access)
این افزونه جزئیاتی درباره نحوه بازیابی اطلاعات مربوط به گواهی که 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/
نقاط توزیع CRL (CRL distribution points)
این یک افزونه چندمقداری است که مقادیر آن میتوانند یک جفت نام-مقدار با همان قالب نام جایگزین موضوع، یا یک مقدار منفرد باشند که نام بخش حاوی تمام مقادیر نقطه توزیع را مشخص میکند.
هنگامی که از یک جفت نام-مقدار استفاده میشود، افزونه DistributionPoint با مقدار ارائهشده بهعنوان فیلد fullName برای مقدار distributionPoint تنظیم میشود و فیلدهای reasons و cRLIssuer نادیده گرفته میشوند.
هنگامی که از یک گزینه منفرد استفاده میشود، مقدار آن بخش را مشخص میکند و آن بخش میتواند شامل موارد زیر باشد:
- fullname
- نام کامل نقطه توزیع، با همان قالب نام جایگزین موضوع.
- relativename
- مقدار بهعنوان تکهای از نام متمایز در نظر گرفته میشود که بهعنوان مقدار فیلد nameRelativeToCRLIssuer تنظیم میگردد.
- CRLIssuer
- مقدار باید در همان قالب نام جایگزین موضوع باشد.
- reasons
- یک فیلد چندمقداری حاوی دلایل ابطال. مقادیر شناختهشده عبارتند از: "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
نقطه توزیع صادرکننده (Issuing Distribution Point)
این افزونه فقط باید در CRLها ظاهر شود. این یک افزونه چندمقداری است که نحو آن شبیه به «بخشی» است که توسط افزونه نقاط توزیع CRL به آن ارجاع داده میشود. نامهای زیر دارای معنی هستند:
- fullname
- نام کامل نقطه توزیع، با همان قالب نام جایگزین موضوع.
- relativename
- مقدار بهعنوان تکهای از نام متمایز در نظر گرفته میشود که بهعنوان مقدار فیلد nameRelativeToCRLIssuer تنظیم میگردد.
- onlysomereasons
- یک فیلد چندمقداری حاوی دلایل ابطال. مقادیر شناختهشده عبارتند از: "keyCompromise"، "CACompromise"، "affiliationChanged"، "superseded"، "cessationOfOperation"، "certificateHold"، "privilegeWithdrawn" و "AACompromise".
- onlyuser, onlyCA, onlyAA, indirectCRL
- مقدار هر یک از این نامها یک مقدار بولی (boolean) است.
مثال:
[extensions] issuingDistributionPoint = critical, @idp_section [idp_section] fullname = URI:http://example.com/myca.crl indirectCRL = TRUE onlysomereasons = keyCompromise, CACompromise
سیاستهای گواهی (Certificate Policies)
این یک افزونه خام (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"
محدودیتهای سیاست (Policy Constraints)
این یک افزونه چندمقداری است که از نامهای requireExplicitPolicy یا inhibitPolicyMapping و یک مقدار عدد صحیح غیرمنفی تشکیل شده است. حداقل یک جزء باید وجود داشته باشد.
مثال:
policyConstraints = requireExplicitPolicy:3
منع هرگونه سیاست (Inhibit Any Policy)
این یک افزونه رشتهای است که مقدار آن باید یک عدد صحیح غیرمنفی باشد.
مثال:
inhibitAnyPolicy = 2
محدودیتهای نام (Name Constraints)
این یک افزونه چندمقداری است. نام باید با کلمه 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
عدم بررسی OCSP (OCSP No Check)
این یک افزونه رشتهای است. این افزونه تجزیه میشود، اما نادیده گرفته خواهد شد.
مثال:
noCheck = ignored
ویژگی TLS (یا همان Must Staple)
این یک افزونه چندمقداری شامل فهرستی از شناسههای افزونه TLS است. هر شناسه میتواند یک عدد (0..65535) یا یک نام پشتیبانیشده باشد. هنگامی که یک کلاینت TLS افزونهای از این فهرست را ارسال میکند، انتظار میرود که سرور TLS آن افزونه را در پاسخ خود بگنجاند.
نامهای پشتیبانیشده عبارتند از: status_request و status_request_v2
مثال:
tlsfeature = status_request
افزونههای منسوخشده (DEPRECATED EXTENSIONS)
افزونههای زیر غیراستاندارد، مختص نتاسکیپ (Netscape) و تا حد زیادی منسوخ هستند. استفاده از آنها در برنامههای جدید منع شده است.
افزونههای رشتهای نتاسکیپ (Netscape String extensions)
یادداشت نتاسکیپ (nsComment) یک افزونه رشتهای شامل توضیحی است که هنگام مشاهده گواهی در برخی مرورگرها نمایش داده میشود. افزونههای دیگر از این نوع عبارتند از: nsBaseUrl، nsRevocationUrl، nsCaRevocationUrl، nsRenewalUrl، nsCaPolicyUrl و nsSslServerName
نوع گواهی نتاسکیپ (Netscape Certificate Type)
این یک افزونه چندمقداری است که شامل فهرستی از پرچمها برای گنجانده شدن است. این افزونه برای مشخص کردن اهدافی که گواهی میتواند برای آنها استفاده شود به کار میرفت. امروزه افزونههای basicConstraints، keyUsage و کاربرد گسترشیافته کلید بهجای آن استفاده میشوند.
مقادیر قابل قبول برای nsCertType عبارتند از: client، server، email، objsign، reserved، sslCA، emailCA، objCA
افزونههای دلخواه (ARBITRARY EXTENSIONS)
اگر افزونهای توسط کد 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
هشدارها (WARNINGS)
هیچ تضمینی وجود ندارد که یک پیادهسازی خاص، یک افزونه معین را پردازش کند. بنابراین ممکن است گاهی بتوان از گواهیها برای اهدافی که توسط افزونههایشان منع شده است استفاده کرد، چرا که یک برنامه خاص ممکن است مقادیر افزونههای مربوطه را شناسایی نکرده یا به آنها پایبند نباشد.
گزینههای DER و ASN1 باید با احتیاط استفاده شوند. در صورت عدم استفاده دقیق، امکان ایجاد افزونههای نامعتبر وجود دارد.
همچنین ببینید (SEE ALSO)
openssl-req(1), openssl-ca(1), openssl-x509(1), ASN1_generate_nconf(3)
حق نشر (COPYRIGHT)
حق نشر 2004-2025 متعلق به پدیدآورندگان پروژه OpenSSL است. کلیه حقوق محفوظ است.
تحت مجوز آپاچی نسخه 2.0 («مجوز») منتشر شده است. شما نمیتوانید از این پرونده استفاده کنید مگر در انطباق با این مجوز. میتوانید نسخهای از مجوز را در پرونده LICENSE در توزیع کد منبع یا در https://www.openssl.org/source/license.html بهدست آورید.
| 2026-08-25 | 3.6.4 |