openssl - ابزار متن باز برای پیاده سازی پروتکل ssl

openssl یکی از متنوع ترین ابزارهای ssl می باشد که برای پیاده سازی پروتکل های ssl استفاده می شود و نسخه های مختلفی برای platform (سکو ها) وجود دارد از جمله لینوکس،ویندوز و مک.

شکل کلی دستور:

$ openssl command [ command_opts ] [ command_args ]

$ openssl [ list-standard-commands | list-message-digest-commands | list-cipher-commands | list-cipher-algorithms | list-message-digest-algorithms | list-public-key-algorithms]

$ openssl no-XXX [ arbitrary options ]

نکته مهم:حتماً برای تسلط و آشنایی دقیق با این مفاهیم ذکر شده ابتدا باید به لینک های مفید داده شده در پایین مراجعه کنید و سپس این صفحه را مطالعه کنید که به علت طولانی بودن مطالب مذکور در حوصله این صفحه نمی گنجید.

openssl یکی از متنوع ترین ابزارهای ssl می باشد که برای پیاده سازی پروتکل های ssl استفاده می شود و نسخه های مختلفی برای platform (سکو ها) وجود دارد از جمله لینوکس،ویندوز و مک.

نکته:در اصل OpenSSL یک ابزار برای پیاده سازی پروتکل های شبکه ای (Secure Sockets Layer (SSL v2/v3 و (Transport Layer Security (TLS v1 می باشد

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

  • دستور OpenSSL معمولا برای تولید Certificate Signing Request) csr) و private key (کلید خصوصی) برای سکو های محتلفی از جمله آپاچی به کار برود.
  • امکان دیدن جزئیات CSR یا گواهینامه (certificate)
  • مقایسه کلید خصوصی و MD5 hash یک گواهینامه به منظور اینکه ببینیم آیا یکسان هستند یا خیر؟
  • امکان اینکه ایا یک گواهینامه به درستی در وبسایت نصب شده است.
  • تبدیل گواهینامه به یک فرمت دیگر.
  • تولید و مدیریت private keys و  public keys و parameters
  • رمزنگاری کلید عمومی-Public key cryptographic

نکته:برای اطلاعات بیشتر  و آشنایی در مورد عملکرد فوق بهتر است به لینک متناظر داده شده در پایین مراجعه کنید.

  • تولید گواهینامه های X.509 و CSR و CRL 
  • رمز نگاری و رمز گشایی به کمک Ciphers
  • امکان آزمودن SSL/TLS در کلاینت و سرور
  • رسیدگی امضای S/MIME یا رمز نگاری ایمیل
  • تولید و بررسی Timestamp request
  • محاسبه MD5

چند نکته:

  • استاندارد S/MIME در پاسخ به معرفی استاندارد PGP معرفی شده است و با S/MIME امکان اعتبارسنجی،احراز هویت نامه ها،رمزنگاری و غیر قابل انکار رفتن هر نامه تضمین شده است
  • استاندارد S/MIME بر خلاف PGP فشرده سازی پیام ها را انجام نمی دهد و از وظایف خود نمی داند ولی PGP این کار را انجام می دهد
  • استاندارد PGP برای استفاده شخصی بسیار رایج و محبوب است ولی استاندارد S/MIME عموما برای کاربردهای سازمانی مورد استفاده قرار می گیرد و انعطاف پذیری بیشتری دارد.

پارامترها:

version:نمایش نسخه جاری و موجود بروی سیستم

$ openssl version

a-:اگر قصد دارید تا اطلاعات بیشتری را پیدا کنید

< pre class="screen"> $ openssl version -a

help:نمایش لیست دستورات موجود

نکته:دستورات به کمک پارامتر helpدر 3 بخش به نام های Standard commands,Message Digest commands ,Cipher commands تقسیم بندی می شوند.

نکته:در ادامه پس از اجرای دستور فوق در جلوی 2 دسته بندی دستورات ما را راهنمایی کرده که برای اطلاعات بیشتر از دستورات  پیشتهادی (dgst و enc) استفاده کنیم.

پس برای کسب اطلاعات بیشتر در مورد Message Digest commands باید dgst را به کار ببریم و برای کسب اطلاعات بیشتر در مورد Cipher commands باید enc را به کار ببریم.

نکته:پارامتر h-وجود خارجی ندارد و ما عمداً به کار می بریم تا به کمک این حقه پارامتر های واقعی دستور  را ببینیم:

dotnet@dotnet-V:~$ openssl dgst -h
unknown option '-h'
options are
-c              to output the digest with separating colons
-r              to output the digest in coreutils format
-d              to output debug info
-hex            output as hex dump
-binary         output in binary form

به اولین خط پس از اجرای دستور نگاه کنید.(خروجی به صورت محدود قرار داده شده است)

دقیقاً همانند بالا این بار برای Cipher commands استفاده می کنیم.

dotnet@dotnet-V:~$ openssl enc -h
unknown option '-h'
options are
-in <file>     input file
-out <file>    output file
-pass <arg>    pass phrase source
-e             encrypt
-d             decrypt

ciphers:نمایش تمام ciphersهای موجود

dotnet@dotnet-V:~$ openssl ciphers -v
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA384

نکته:خروجی دستور بصورت محدود می باشد.

اگر قصد پالایش نوع خاصی را دارید نام آن را جلوی دستور بنویسید

$ openssl ciphers -v -tls1

اگر قصد دارید لیست  ciphersبا قدرت رمزنگاری بالا (پیچیده تر) را ببینید

dotnet@dotnet-V:~$ openssl ciphers -v 'HIGH'
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA384
ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA384
ECDHE-RSA-AES256-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA1
ECDHE-ECDSA-AES256-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA1

نکته:خروجی فقط برای الگوریتم هایی است که key انها بیشتر از 128بیت باشد.

می توانیم به صورت ترکیبی هم از دستور استفاده کنیم مثلا برای پیدا کردن ciphersهایی با رمزنگاری پیچیده تر که از الگوریتم  AES استفاده می کنند

dotnet@dotnet-V:~$ openssl ciphers -v 'AES+HIGH'
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA384
ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA384
ECDHE-RSA-AES256-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA1
ECDHE-ECDSA-AES256-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA1
SRP-DSS-AES-256-CBC-SHA SSLv3 Kx=SRP      Au=DSS  Enc=AES(256)  Mac=SHA1
SRP-RSA-AES-256-CBC-SHA SSLv3 Kx=SRP      Au=RSA  Enc=AES(256)  Mac=SHA1
DHE-DSS-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=DSS  Enc=AESGCM(256) Mac=AEAD

speed:این پارامتر محکی- benchmark برای اندازه گیری کارایی سیستم شما فراهم می کند.

نکته:عمل benchmark بیانگر تعداد عملیات قابل اجرا در یک زمان بخصوص/تعیین شده است نه اینکه یک تعداد عملیات داده شده در چه زمانی طول می کشد!

dotnet@dotnet-V:~$ openssl speed
Doing md4 for 3s on 16 size blocks: 6718893 md4's in 2.95s
Doing md4 for 3s on 64 size blocks: 5893107 md4's in 2.99s
Doing md4 for 3s on 256 size blocks: 3801768 md4's in 2.98s
dotnet@dotnet-V:~$ openssl speed rsa
Doing 512 bit private rsa's for 10s: 34608 512 bit private RSA's in 9.90s
Doing 512 bit public rsa's for 10s: 433885 512 bit public RSA's in 9.97s
Doing 1024 bit private rsa's for 10s: 7037 1024 bit private RSA's in 9.96s
Doing 1024 bit public rsa's for 10s: 133288 1024 bit public RSA's in 9.97s

دستور اول برای محک کارایی سیستم است و دستور دوم برای محک اگوریتم rsa می باشد.

مثال:تولید یک درخواست گواهی امضا-Certificate Signing Request یا CSR

اگر قصد دریافت گواهینامه SSL و key (جهت استفاده در سرور httpd) را دارید ابتدا باید یک CSR را تولید کنید و ان را به یک Certificate Authority -CA تجاری ارسال کنید که متناسب و در پاسخ به CSR ارسال شده شما،گواهینامه SSL مناسب را به شما ارسال می کنند.

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

dotnet@dotnet-V:~$ openssl req -new -newkey rsa:1024 -keyout hostkey.pem -nodes -out hostcsr.pem
Generating a 1024 bit RSA private key
.......................................++++++
...............................................................................................................++++++
writing new private key to 'hostkey.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:ir
State or Province Name (full name) [Some-State]:Quom
Locality Name (eg, city) []:Quom
Organization Name (eg, company) [Internet Widgits Pty Ltd]:irani
Organizational Unit Name (eg, section) []:tester
Common Name (e.g. server FQDN or YOUR name) []:www.30li.ir
Email Address []:youremail@mailserver.ir  

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:passwords
An optional company name []:web1

پارمترهای دستور فوق عبارتند از:

new-:تولید یک CSR جدید

newkey rsa:1024-:تولید یک private key برای الگوریتم رمز نگاری RSA بطول 1024 بایت

نکته:طول کلید قابل تغییر است و حداقل512 است ولی اکثر مردم علاقه دارند به منظور امنیت بیشتر از طول2048 استفاده کنند.

keyout hostkey.pem-:کلیدخصوصی-private key  جدید الگوریتم RSA را در این فایل ذخیره میکند.

nodes-:یک پارامتر اختیاری است که باعث جلوگیری از رمزنگاری کلید خصوصی می شود.

نکته:در صورت حذف این پارامتر کلید خصوصی رمز نگاری می شود لازم است در هر بار راه اندازی مجدد وب سرور نیاز به وارد کردن پسورد داشته باشیم لذا برای جلوگیری از این دردسر آپشن موردنظر را به کار میبرند.

out hostcsr.pem-:این دستور CSR تولیدی را در فایل hostcsr.pem می نویسد.

در ادامه چند سوال ساده از شما پرسیده می شود که باید به آن جواب بدهید و در نهایت فایل ساخته می شود.

نکته مهم:اگر به بخش آبی دقت کنید در واقع این فایل حاوی private key یا کلید خصوصی است.

چند نکته:

  • این همان فایلی است که شما باید به ارایه دهنده SSL (شرکت های Certificate Authority -CA ) ارسال کنید.در ادامه لیست بعضی از شرکت های مشهور CA که وظیفه صدور گواهینامه ها را بر عهده دارند عبارتند از:1-verisign  و 2-Comodo-3   Entrust و ...
  • اگر قصد استفاده از CSR را برای تولید گواهینامه توسط خودتان دارید در وارد کردن بخش fully qualified domain name-FQDN  دقت کنید مثلا در مثال فوق من هیچ زیر دامنه ای ندارم لذا FQDN برای من همان www.30li.ir خواهد بود و اگر برای یک زیر دامنه قصد انجام چنین کاری داشته باشم FQDN مثلا چیزی مانند login.30li.ir خواهد بود در صورتی که این بخش کامل نباشد کلاینت ها در ارتباط با سرور دچار مشکل خواهند شد. آشنایی با FQDN
  • دقت کنید در انتهای نشست تولید CSR یک بخش اختیاری وجود دارد که اگر قصد دارید CSR را برای شرکت های CA ارسال کنید برای بعضی از این شرکت ها این بخش لازم خواهد بود.

مثال:ساخت self-signed certificate با داشتن یک Certificate Signing Request یا CSR

دقت کنید در این مثال ما CSR را در اختیار داریم یعنی در یک فایل به نام hostcsr.pem ذخیره شده (به مثال قبل دقت کنید) و خودمان (به self-signed  دقت کنید) از طریق این فایل  قصد تهیه گواهینامه یا certificate رو داریم.یعنی به جای این که فایل hostcsr.pem را به بعضی از شرکت های CA که در بالا ذکر شد ارائه دهیم خودمان این کار را انجام می دهیم.طبیعتا گواهینامه ای که ما تولید می کنیم امنیت تضمین شده و بالایی همانند گواهینامه های شرکت های CA تجاری نمی دهد و از لحاظ امنیت در سطح پایین تری قرار دارد اما حداقل اجازه فراهم کردن یک کانکشن https را برای شما فراهم می کند!

نکته:پس راه اندازی این گونه گواهینامه ها سیستم های کلاینت با پیامی روبرو می شوند که بیان می کنند شناسه گواهینامه سایت موردنظر تایید نمی شود و امن نیست که برای این موارد کلاینت ها دارای گزینه اختیاری هستند که گواهینامه نشست مربوطه را قبول می کند و تمام زیر دامنه های //:https امن خواهند بود.

openssl req -x509 -days 365 -in hostcsr.pem -key hostkey.pem -out hostcert.pem

پس از اجرای دستور فوق بلافاصله فایل موردنظر ساخته می شود.

x509-:باعث تولید یک گواهینامه

days 365- :تاریخ اعتبار برای گواهینامه ای که قرار است ایجاد شود 365 روز یا یک سال خواهد بود.

in hostcsr.pem-:باعث خواندن CSR از درون فایل hostcsr.pem می شود

key hostkey.pem-:باعث خواندن private key از فایل hostkey.pem می شود

out hostcert.pem-:نوشتن گواهینامه در درون فایل hostcert.pem

بنابراین فایل hostcert.pem حاوی گواهینامه ای است که ما خودمان به کمک دنیای گنو/لینوکس و دستور قدرتمند openssl تولید کردیم اگر چه به اندازه گواهینامه های شرکت های CA تجاری دارای امنیت تضمین شده نیست (سطح امنیتی کمتر) ولی برای راه اندازی سرویس های https محلی کاملا کارا می باشد و در سرویس های امن https از آن ها استفاده نمی شود  اگر چه با مطالعه در این زمینه می توان تا حدودی در افزایش امنیت آن کوشش کرد.

اما در بعضی موارد می توان از این گواهینامه ها استفاده کرد:

  • فرم های دارای یوزرنیم و پسورد
  • در جاهای محدود که بین ما و مشتریان مشخصی رابطه برقرار می شود.

نکته:تفاوت بین Self Signed SSL و Certificate Authority در این است که امنیت گواهینامه هایی Self Signed بسیار کمتر از گواهینامه های شرکت های CA می باشد و در واقع وقتی از گواهینامه های Self Signed استفاده می کنیم شما جمله "trust me - I am who I say I am" را برای کلاینت ها پیاده سازی می کنید لذا براحتی سرور در معرض حمله قرار میگیرد اما وقتی از گواهینامه های صادر شده از شرکت های CA استفاده می کنیم مثلا Verisign شما به کلاینت ها جمله "Trust me - Verisign agrees I am who I say I am" را بیان می کنید.

مثال:نمایش محتویات یک Certificate Signing Request یا CSR
اگر  قصد دارید محتویات فایل hostcsr.pem را مطالعه کنید آن را در یک ویرایشگر متن باز کنید چیزی شبیه متن رمزنگاری شده ی زیر می بینید.

-----BEGIN CERTIFICATE REQUEST-----
MIIB+jCCAWMCAQAwgYoxCzAJBgNVBAYTAmlyMQ0wCwYDVQQIDARRdW9tMQ0wCwYD
VQQHDARRdW9tMQ4wDAYDVQQKDAVpcmFuaTEPMA0GA1UECwwGdGVzdGVyMRQwEgYD
VQQDDAt3d3cuMzBsaS5pcjEmMCQGCSqGSIb3DQEJARYXeW91cmVtYWlsQG1haWxz
ZXJ2ZXIuaXIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALPvM2MJ/dAj3bwW
u7yHSQ77b/eIIowxC1W6H8njPt64RX0/27LOTi2ZRYFMfrsXX6w0M9zU/JDvcpDK
OMHfK9lhI0TpnUthSwKa6cNeph9M2QO/2BzxL4+VDGHd7L4j527MXdjpqp0k9qE8
vFkS9k5yauWM6pG6SX/aCTBGtwOfAgMBAAGgLzATBgkqhkiG9w0BCQIxBgwEd2Vi
MTAYBgkqhkiG9w0BCQcxCwwJcGFzc3dvcmRzMA0GCSqGSIb3DQEBBQUAA4GBACu0
DURxlEOsuxu1kaqr6bnaqv+PLw6KWmwQR6n/qE+xSKcQv43tIT6qa4gBBgoEer7a
bEsbVgQv1dzjHJoa5u8mHr40Ha85z6OMlotB+JP1EhMLbMuNEDfcKuYWPEUZ1vnT
s4A8Wf3qo2wA+VW7OOK4YbeoRoGJYgOVmSmx5kpg
-----END CERTIFICATE REQUEST-----

لذا برای دیدن محتویات فایل hostcsr.pem را از طریق خط فرمان از دستور openssl استفاده می کنیم.

dotnet@dotnet-V:~$ openssl req -text -noout -in hostcsr.pem
Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=ir, ST=Quom, L=Quom, O=irani, OU=tester, CN=www.30li.ir/emailAddress=youremail@mailserver.ir
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (1024 bit)
                Modulus:
                    00:b3:ef:33:63:09:fd:d0:23:dd:bc:16:bb:bc:87:
                    49:0e:fb:6f:f7:88:22:8c:31:0b:55:ba:1f:c9:e3:
                    3e:de:b8:45:7d:3f:db:b2:ce:4e:2d:99:45:81:4c:
                    7e:bb:17:5f:ac:34:33:dc:d4:fc:90:ef:72:90:ca:
                    38:c1:df:2b:d9:61:23:44:e9:9d:4b:61:4b:02:9a:
                    e9:c3:5e:a6:1f:4c:d9:03:bf:d8:1c:f1:2f:8f:95:
                    0c:61:dd:ec:be:23:e7:6e:cc:5d:d8:e9:aa:9d:24:
                    f6:a1:3c:bc:59:12:f6:4e:72:6a:e5:8c:ea:91:ba:
                    49:7f:da:09:30:46:b7:03:9f
                Exponent: 65537 (0x10001)
        Attributes:
            unstructuredName         :unable to print attribute
            challengePassword        :unable to print attribute
    Signature Algorithm: sha1WithRSAEncryption
         2b:b4:0d:44:71:94:43:ac:bb:1b:b5:91:aa:ab:e9:b9:da:aa:
         ff:8f:2f:0e:8a:5a:6c:10:47:a9:ff:a8:4f:b1:48:a7:10:bf:
         8d:ed:21:3e:aa:6b:88:01:06:0a:04:7a:be:da:6c:4b:1b:56:
         04:2f:d5:dc:e3:1c:9a:1a:e6:ef:26:1e:be:34:1d:af:39:cf:
         a3:8c:96:8b:41:f8:93:f5:12:13:0b:6c:cb:8d:10:37:dc:2a:
         e6:16:3c:45:19:d6:f9:d3:b3:80:3c:59:fd:ea:a3:6c:00:f9:
         55:bb:38:e2:b8:61:b7:a8:46:81:89:62:03:95:99:29:b1:e6:
         4a:60

text-:نمایش محتویات فایل CSR بصورت متن

noout-:عدم نمایش نسخه PEM-encoded فایل CSR

in hostcsr.pem-:خواندن CSR از فایل مقصد (در اینجا hostcsr.pem )

مثال:نمایش محتویات یک گواهینامه-Certificate

همانند مثال قبل اگر  بخواهیم به کمک ویرایشگر متن اقدام به باز کردن فایل حاوی گواهینامه کنیم چیزی چز اطلاعات رمز نگاری شده بدست نمی آوریم.

-----BEGIN CERTIFICATE-----
MIIC5DCCAk2gAwIBAgIJAPe4xnSnGf5PMA0GCSqGSIb3DQEBBQUAMIGKMQswCQYD
VQQGEwJpcjENMAsGA1UECAwEUXVvbTENMAsGA1UEBwwEUXVvbTEOMAwGA1UECgwF
aXJhbmkxDzANBgNVBAsMBnRlc3RlcjEUMBIGA1UEAwwLd3d3LjMwbGkuaXIxJjAk
BgkqhkiG9w0BCQEWF3lvdXJlbWFpbEBtYWlsc2VydmVyLmlyMB4XDTEzMDcxODIx
MzExMVoXDTE0MDcxODIxMzExMVowgYoxCzAJBgNVBAYTAmlyMQ0wCwYDVQQIDARR
dW9tMQ0wCwYDVQQHDARRdW9tMQ4wDAYDVQQKDAVpcmFuaTEPMA0GA1UECwwGdGVz
dGVyMRQwEgYDVQQDDAt3d3cuMzBsaS5pcjEmMCQGCSqGSIb3DQEJARYXeW91cmVt
YWlsQG1haWxzZXJ2ZXIuaXIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALPv
M2MJ/dAj3bwWu7yHSQ77b/eIIowxC1W6H8njPt64RX0/27LOTi2ZRYFMfrsXX6w0
M9zU/JDvcpDKOMHfK9lhI0TpnUthSwKa6cNeph9M2QO/2BzxL4+VDGHd7L4j527M
Xdjpqp0k9qE8vFkS9k5yauWM6pG6SX/aCTBGtwOfAgMBAAGjUDBOMB0GA1UdDgQW
BBS3vHI2je0+aaPGIQP9fymcko+ZQTAfBgNVHSMEGDAWgBS3vHI2je0+aaPGIQP9
fymcko+ZQTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBADBGrKfEWNwd
MAB1XNdnLL8sLmxZ7Vqz2PyFiCw3PHmeiJhv2VmSMFjApTEArQUa48vWBsoStz40
sl4qv7iierEm2qbeM69e9P+6HUaLXht0am4aMkoV8Amo61o5UnThm/ObpVSsebsl
/okoqVtN+NdrDWodHuqEX8Hk8g6+f/Qb
-----END CERTIFICATE-----

لذا برای دیدن محتویات گواهینامه باید از دستور زیر استفاده کنیم

dotnet@dotnet-V:~$ openssl x509 -text -noout -in hostcert.pem
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            f7:b8:c6:74:a7:19:fe:4f
    Signature Algorithm: sha1WithRSAEncryption
        Issuer: C=ir, ST=Quom, L=Quom, O=irani, OU=tester, CN=www.30li.ir/emailAddress=youremail@mailserver.ir
        Validity
            Not Before: Jul 18 21:31:11 2013 GMT
            Not After : Jul 18 21:31:11 2014 GMT
        Subject: C=ir, ST=Quom, L=Quom, O=irani, OU=tester, CN=www.30li.ir/emailAddress=youremail@mailserver.ir
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (1024 bit)
                Modulus:
                    00:b3:ef:33:63:09:fd:d0:23:dd:bc:16:bb:bc:87:
                    49:0e:fb:6f:f7:88:22:8c:31:0b:55:ba:1f:c9:e3:
                    3e:de:b8:45:7d:3f:db:b2:ce:4e:2d:99:45:81:4c:
                    7e:bb:17:5f:ac:34:33:dc:d4:fc:90:ef:72:90:ca:
                    38:c1:df:2b:d9:61:23:44:e9:9d:4b:61:4b:02:9a:
                    e9:c3:5e:a6:1f:4c:d9:03:bf:d8:1c:f1:2f:8f:95:
                    0c:61:dd:ec:be:23:e7:6e:cc:5d:d8:e9:aa:9d:24:
                    f6:a1:3c:bc:59:12:f6:4e:72:6a:e5:8c:ea:91:ba:
                    49:7f:da:09:30:46:b7:03:9f
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                B7:BC:72:36:8D:ED:3E:69:A3:C6:21:03:FD:7F:29:9C:92:8F:99:41
            X509v3 Authority Key Identifier:
                keyid:B7:BC:72:36:8D:ED:3E:69:A3:C6:21:03:FD:7F:29:9C:92:8F:99:41

            X509v3 Basic Constraints:
                CA:TRUE
    Signature Algorithm: sha1WithRSAEncryption
         30:46:ac:a7:c4:58:dc:1d:30:00:75:5c:d7:67:2c:bf:2c:2e:
         6c:59:ed:5a:b3:d8:fc:85:88:2c:37:3c:79:9e:88:98:6f:d9:
         59:92:30:58:c0:a5:31:00:ad:05:1a:e3:cb:d6:06:ca:12:b7:
         3e:34:b2:5e:2a:bf:b8:a2:7a:b1:26:da:a6:de:33:af:5e:f4:
         ff:ba:1d:46:8b:5e:1b:74:6a:6e:1a:32:4a:15:f0:09:a8:eb:
         5a:39:52:74:e1:9b:f3:9b:a5:54:ac:79:bb:25:fe:89:28:a9:
         5b:4d:f8:d7:6b:0d:6a:1d:1e:ea:84:5f:c1:e4:f2:0e:be:7f:
         f4:1b

مثال:مشاهده امضاء کننده یک گواهینامه

dotnet@dotnet-V:~$ openssl x509 -in  hostcert.pem  -noout -issuer -issuer_hash
issuer= /C=ir/ST=Quom/L=Quom/O=irani/OU=tester/CN=www.30li.ir/emailAddress=youremail@mailserver.ir
7eae493e

دقت کنید در اینجا گواهینامه در یک فایل با پسوند hostcert.pem قرار دارد.

in cert.pem-:خواندن گواهینامه از فایل موردنظر

issuer-:نمایش صادر کننده Distinguished Name-DN

issuer_hash-:نام صادر کننده گواهینامه را به صورت رمز شده به بیرون میدهد

مثال:نمایش محتویات رمزنگاری شده ی یک گواهینامه!

dotnet@dotnet-V:~$  openssl x509 -noout -hash -in  hostcert.pem
7eae493e

مثال:پیاده سازی تابع md5sum

به کمک دستور زیر می توانیم تابع md5sum را پیاده سازی کنیم.

dotnet@dotnet-V:~$ openssl dgst -md5 /home/dotnet/Desktop/test.php
MD5(/home/akbar/Desktop/test.php)= d41d8cd98f00b204e9800998ecf8427e

که معادل است با:

dotnet@dotnet-V:~$ md5sum /home/dotnet/Desktop/test.php
d41d8cd98f00b204e9800998ecf8427e  /home/akbar/Desktop/test.php

مثال:پیاده سازی تابع sha1sum

dotnet@dotnet-V:~$ openssl dgst -sha1 /home/dotnet/Desktop/test.php
SHA1(/home/akbar/Desktop/test.php)= da39a3ee5e6b4b0d3255bfef95601890afd80709
dotnet@dotnet-V:~$ sha1sum  /home/dotnet/Desktop/test.php
da39a3ee5e6b4b0d3255bfef95601890afd80709  /home/akbar/Desktop/test.php

خروجی هر 2 دستور یکسان هستند.

مثال:رمزنگاری فایل

$ openssl enc -base64 -in file.txt -out file.txt.enc

این دستور فایل file.txt را رمز می کند و به فایلی به  file.txt.enc  تغییر میدهد  . پارامتر out-  را برای تولید خروجی استفاده می کنیم.

مثال:رمزنگاری پیام ها

dotnet@dotnet-V:~$ echo "Polymath." | openssl enc -base64
UG9seW1hdGguCg==

رشته (در اینجا کلمه .Polymath ) را از طریق پایپ لاین به دستور openssl می فرستد و به کمک پارامتر encالگوریتم رمزنگاری base64-را فراخوانی میکند و رشته [کلمه] دریافتی را رمزنگاری میکند.

$ echo "Welcome to LinuxCareer.com" | openssl enc -base64
V2VsY29tZSB0byBMaW51eENhcmVlci5jb20K

در 2 مثال بالایی اگر چه عمل رمزنگاری انجام می شد ولی فاقد پسورد است در مثال پایینی با مثال بهتری آشنا می شویم.

dotnet@dotnet-V:~$ echo "iran-bsd.ir" | openssl enc -aes-256-cbc -a
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
U2FsdGVkX19z3HlC+5ge2OYIDvcORt9j8j3ocrVKBNo=

در اینجا رشته iran-bsd.ir را به کمک دستور فوق رمزنگاری کرده ایم و کلمه pass هم به عنوان پسورد انتخاب شده بود

مثال:شکستن(باز گشایی) جملات رمز شده

2 راه برای این کار داریم:یکی استفاده از وب گاههای تحت وب هست و دیگری هم به کمک دستور موجود

dotnet@dotnet-V:~$  echo "UG9seW1hdGguCg==" | openssl enc -base64 -d
Polymath.

خروجی در زیر آن نوشته شده است.

dotnet@dotnet-V:~$ echo "V2VsY29tZSB0byBMaW51eENhcmVlci5jb20K" | openssl enc -base64 -d
Welcome to LinuxCareer.com

نکته:برای رمزگشایی از  پارامتر d-استفاده می شود.

dotnet@dotnet-V:~$ echo "U2FsdGVkX181xscMhkpIA6J0qd76N/nSjjTc9NrDUC0CBSLpZQxQ2Db7ipd7kexj" | openssl  enc -aes-256-cbc  -d  -a
enter aes-256-cbc decryption password:
LinuxCareer.com

علاوه بر رمزنگاری بروی رشته موردنظر پسورد نیز قرار می دهد و برای رمزگشایی اگر کسی به نوع cipher (در اینجا aes-256-cbc- ) دسترسی داشته باشد باید حتما پسورد را نیز بداند!

در این مثال کلمه pass به عنوان رمز عبور مثال فوق انتخاب شده است.

مثال:تشخیص اعداد اول

dotnet@dotnet-V:~$ openssl prime 119054759245460753
1A6F7AC39A53511 is not prime
dotnet@dotnet-V:~$ openssl prime 5
5 is prime
dotnet@dotnet-V:~$ openssl prime 6
6 is not prime

تشخیص اول بودن به کمک پارامتر primeصورت می گیرد

مثال:تولید اعداد تصادفی

چاپ 128 بایت کارکتر تصادفی  بر پایه الگوریتم base64

dotnet@dotnet-V:~$ openssl rand -base64 128
0Uqo1kaMJdeB+ZL48hfxwq/DIq+Dy69jWB0MrZWKlXrI6wKOPI/uB19VyzxzmU5C
7Yc27VYFp38TAbqsPSF8rldN8J0E8O1Ad8TZz53+MyOfqAHi9MX/8wA38OIzLzcY
YuCBzPoL+i9JG6x9k19IneFBCm/BE/pHJHcGRWvh2i8=

مثال:رمزنگاری فایل ها

dotnet@dotnet-V:~$ openssl enc -aes-256-cbc -salt -in /home/test.php -out file.enc
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:

فایل test.php را به کمک الگوریتم AES بطول 256-bit و با مد CBC رمزنگاری میکند و در ادامه نیز با یک پسورد باید از آن محافظت کنید و خروجی فایل file.enc خواهد بود.

در مقصد برای رمزگشایی فایل file.enc به 2 پارامتر پسورد و نوع cipher (در اینجا -aes-256-cbc ) نیاز داریم که به کمک این دو فایل رو باز کنیم.یعنی دستوری مانند زیر:

$ openssl enc -d -aes-256-cbc -in file.enc

که طبیعتاً از شما پسورد را نیز میخواهد.

مثال:رمزنگاری پوشه ها

dotnet@dotnet-V:~$ tar cz /home/akbari/Desktop/TXT/  | openssl enc -aes-256-cbc -out etc.tar.gz.dat
tar: Removing leading `/' from member names
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:

در این نوع مثال ها ابتدا باید کل پوشه مورد نظر با دستور tar فشرده سازی کنیم سپس به کمک پایپ لاین آن را به دستور موردنظر بفرستیم تا عملیات رمز نگاری طبق cipher تعیین شده صورت بگیرد با پارامتر out-خروجی در فایلی با پسوند dat ذخیره می شود.

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

dotnet@dotnet-V:~$ openssl list-cipher-commands
aes-128-cbc
aes-128-ecb
aes-192-cbc
aes-192-ecb
aes-256-cbc
aes-256-ecb
base64
bf
bf-cbc
bf-cfb
bf-ecb
bf-ofb
camellia-128-cbc
camellia-128-ecb
camellia-192-cbc
camellia-192-ecb
camellia-256-cbc
camellia-256-ecb
cast
cast-cbc
cast5-cbc
cast5-cfb
cast5-ecb
cast5-ofb
des
des-cbc
des-cfb
des-ecb
des-ede
des-ede-cbc
des-ede-cfb
des-ede-ofb
des-ede3
des-ede3-cbc
des-ede3-cfb
des-ede3-ofb
des-ofb
des3
desx
rc2
rc2-40-cbc
rc2-64-cbc
rc2-cbc
rc2-cfb
rc2-ecb
rc2-ofb
rc4
rc4-40
seed
seed-cbc
seed-cfb
seed-ecb
seed-ofb
zlib

در اینجا با بخش اندکی از دستور قدرتمند openssl آشنا شدیم که بصورت جسته گریخته صرفا جهت ایجاد انگیزه و آشنایی با دنیای قدرتمند خط فرمان گنو/لینوکس و ایجاد انگیزه برای کاربران بیان شده و برای بیان تمام توابع و پارامترهای آن شاید نیازمند به بیان چندین صفحه باشیم.در صورت هر گونه اشتباه لطفا جهت مکاتبه به آدرس http://30li.ir/contact با مدیریت سایت تماس بگیرید.

--------------------

منابع :

  • برای آشنایی با مفاهیم SSL و CSR و  ... به ادرس های زیر بروید:

http://http://www.sslshopper.com/why-ssl-the-purpose-of-using-ssl-certificates.html

http://www.sslshopper.com/ssl-details.html

  • رمزنگاری کلید عمومی-Public key cryptographic

http://en.wikipedia.org/wiki/Cryptography#Public-key_cryptography

  • اطلاعات بیشتر در موردciphers  

http://www.openssl.org/docs/apps/ciphers.html

  • لیست بعضی از شرکت های Certification Authority

http://www.sos.ca.gov/digsig/

  • Self-signed certificate

http://en.wikipedia.org/wiki/Self-signed_certificate

  • استاندارد X.509

http://en.wikipedia.org/wiki/X.509

  • آشنایی با public-key infrastructure-PKI

http://en.wikipedia.org/wiki/Public-key_infrastructure

  • Difference between Self Signed SSL & Certificate Authority

http://social.technet.microsoft.com/wiki/contents/articles/15189.difference-between-self-signed-ssl-certificate-authority.aspx

  • کتاب "امنیت داده ها"-احسان ملکیان و علی ذاکر الحسینی (نشر نص)

نکته:اگر حوصله قبول دردسر کار با openssl در خط فرمان ندارید می توانید از ابزارهای SSL Certificate یا SSL Certificate Tools در ادرس زیر استفاده کنید:

http://www.sslshopper.com/ssl-certificate-tools.html