openssl – نام جایگزین موضوع در درخواست امضای گواهی ظاهرا امضای امضا را نداشته است

بنابراین من توانستم یک درخواست امضای گواهی ایجاد کنم با نام موضوع زیر نام فرم subjectAltName = IP: 1.2.3.4 با دنبال کردن دستور در پاسخ قبلی (پر زرق و برق)

هنگامی که بررسی می کنم CSR با openssl req -in key.csr -text من می توانم یک بخش مربوطه را ببینم:

 Extensions Required:
  X509v3 عنوان نام جایگزین:
    آدرس IP: 1.2.3.4

من سپس به امضای CSR با کلید خود امضای خود امیدوارم مانند:

 openssl x509 -req -days 365 -CA ca.crt -CAkey ca.key -CAcreateserial 
  -in key.csr -out key.crt

گواهی حاصل (هنگام بازرسی با openssl x509 -in key.crt -text ) این بخش را هرگز شناسایی نمی کند.

آیا این فقط یک مصنوعی از پارامترهای صفحه نمایش است یا نیاز دارم که من نیز openssl x509 را آموزش دهم که در هنگام انجام امضای آن باید پسوند را شامل شود (و اگر چنین است، چگونه)؟

من از OpenSSL در MacOS High Sierra استفاده میکنم (19459003) openssl version reports LibreSSL 2.2.7 ) و تنظیمات آن را از پیش فرض تغییر نداده است. کلیدها در نهایت بین سرورهای دبیان (کشش) استفاده خواهند شد، بنابراین اگر بتوانم در این زمینه کمک کنم، می توانم نسل کلیدی را در آنجا اجرا کنم.

TLS – تولید گواهی ها با openssl – بهینه سازی

گواهی های خودم را برای یک سیستم داخلی ایجاد می کنم:

  • گواهی ریشه برای صدور گواهینامه
  • برای سرور وب،
  • گواهی نامه برای مشتریان،
  • امضای کد،
  • و غیره [19659007] معماری سرور چربی (خدمات مایکروسافت IIS WCF) و مشتریان نازک (برنامه های کاربردی دسک تاپ مایکروسافت WPF) است. سرور فقط در https قابل دسترسی است و مشتریان باید خود را با گواهی مشتری تأیید کنند.

    این اسکریپت من است:

     1. گواهی ریشه را ایجاد کنید
        openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits: 2048 -aes-256-cbc-pass pass: AbmDF5XU -out "Acme Root.key"
        openssl req -new -x509 -days 24854 -subj "/ C = US / ST = / L = آستین / O = Acme Corporation / OU = / CN = Acme Root" گذرنامه: AbmDF5XU -key "Acme Root.key" - "Acme Root.cer"
    
    2. ایجاد گواهینامه برای سرور وب (تأیید هویت سرور).
        openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits: 2048 -aes-256-cbc-pass pass: R2xEK3rT -out "Acme IIS.key"
        openssl req -new -subj "/ C = US / ST = / L = آستین / O = Acme Corporation / OU = / CN = acme" گذرنامه: R2xEK3rT -key "Acme IIS.key" -out "Acme IIS. CSR "
        openssl x509 -days 24854 -sha256 -req -in "Acme IIS.csr" -xtxtfile v3_server.ext -CA "Acme Root.cer" -CAkey "Acme Root.key" گذرنامه: AbmDF5XU -CAcreateserial -out "Acme IIS .cer "
        openssl pkcs12 -aes256 -export -inkey "Acme IIS.key" -passin pass: R2xEK3rT- در "Acme IIS.cer" گذرنامه: R2xEK3rT -out "Acme IIS.pfx"
    
    3. ایجاد گواهینامه برای مشتری (احراز هویت مشتری).
        openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits: 2048 -aes-256-cbc -pass pass: fDWnfJYq -out "Acme Client 001.key"
        openssl req -new -subj "/ C = US / ST = / L = آستین / O = Acme Corporation / OU = / CN = Acme Client 001" گذرنامه: fDWnfJYq -key "Acme Client 001.key" -out " Acme Client 001.csr "
        openssl x509 -days 24854 -sha256 -req -in "Acme Client 001.csr" -xtxt v3_client.ext -CA "Acme Root.cer" -CAkey "Acme Root.key" گذرنامه: AbmDF5XU -CAcreateserial -out "Acme مشتری 001.cer "
        openssl pkcs12 -aes256 -export -inkey "Acme Client 001.key" -passin pass: fDWnfJYq -in "Acme Client 001.cer" -password pass: fDWnfJYq -out "Acme Client 001.pfx"
    

    همانگونه که می بینید، از چهار دستور برای تولید یک فایل PFX استفاده می کنم (برای مثال برای تأیید اعتبار مشتری). این کار به خوبی انجام می شود، من فقط کنجکاو هستم اگر فقط با یک دستور برای مثال انجام شود؟

    همچنین – برای تمام کارشناسان وجود دارد، اسکریپت من خوب است یا شما آن را تغییر شکل دهید؟

چرا OpenSSL و پایتون یک اثر انگشت SSL متفاوت را باز می گردانند؟

از طریق getmail، ابزاری که در پایتون نوشته شده است، برای پست الکترونیکی خود از طریق IMAP بازیابی می کند. امروز آن را به طور ناگهانی متوقف کار، زیرا در مورد عدم انطباق اثر انگشت SSL شکایت می کند. (من همیشه اثر انگشت را برای چک کردن در فایل پیکربندی getmail مشخص می کنم و این اثر انگشت را از ابزار خط فرمان OpenSSL دریافت می کنم.)

بر اساس خط فرمان openssl زیر، اثر انگشت گواهینامه SSL 393c7c58738fa6643cedd9943ffb6e951b2d3b576991d9671d86921ee79bb68a :

 openssl s_client -connect onza.mythic-beasts.com:443 < /dev/null 2> / dev / null 
| openssl x509 -fingerprint -sha256 -noout -in / dev / stdin 
| برش -f2 -d = | tr -d: | tr '[:upper:]' '[:lower:]'

با این حال، طبق گواهی نامه جی تیما و پیمان ساده انگشتی زیر (که من اساسا از کد منبع دریافتی پاره شد)، گواهی در واقع 63d1c9e28c51aebd0c26463563be30e4df6814fa5406bab1787d1b9bdd19f15e .

 #! / usr / bin / env python

import imaplib
واردات هشلیب

conn = imaplib.IMAP4_SSL ('onza.mythic-beasts.com')
sslobj = conn.ssl ()
peercert = sslobj.getpeercert (راست)
actual_hash = hashlib.sha256 (peercert) .hexdigest (). پایین ()
چاپ (actual_hash)
conn.logout ()

من نتایج مشابهی را در بسیاری از رایانه های مختلفی که توزیع های گنو / لینوکس مختلف دارند و به شبکه های مختلف متصل می شوند، مشاهده می کنم.

چرا openssl و Python گزارش های مختلف اثر انگشت را برای یک میزبان مشابه گزارش می کنند؟ چگونه می دانم کدام یک درست است؟ آیا پایتون یا OpenSSL ممکن است کپی قدیمی از گواهی را ذخیره کند؟ اگر چنین است، چگونه حافظه کش را پاک کنم؟

TLS – یک گواهی کاربر با CA.key: openssl وارد کنید

من یک گواهی کاربر ( certname.pem ) و کلید کاربر ( keyname.pem ) که من با استفاده از دستور زیر تولید کردم

 openssl req - newkey rsa: 2048 -nodes -keyout keyname.pem -x509 -days 365 -out certname.pem

همچنین من یک کلید CA ( ca.key.pem ) و گواهینامه ریشه CA ( ca.root.pem ) با استفاده از فرمان زیر ایجاد کردم.

 openssl req-x509 -days 557 -newkey rsa: 1024 -out ca.root.pem -keyout ca.key.pem

حالا میخواهم گواهی کاربر ( certname.pem ) را با کلید CA ( ca.key.pem ) امضا کنم، اما من نمیتوانم این کار را با استفاده از دستور زیر انجام دهم

 openssl ca -create_serial -config openssl.cnf -cert ca.root.pem -keyfile ca.key.pem -in certname.pem -out new-certname.pem

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

 خطا در خواندن درخواست گواهی در certname.pem
139992806578040: خطا: 0906D06C: روال PEM: PEM_read_bio: بدون خط شروع: pem_lib.c: 708: انتظار: درخواست CERTIFICATE

کجا به عنوان محتویات certname.pem من به شرح زیر است:

 ----- BEGIN CERTIFICATE -----
MIIDozCCAougAwIBAgIJALv1sRsVLIRgMA0GCSqGSIb3DQEBCwUAMGgxCzAJBgNV
BAYTAmluMQ0wCwYdvQQIDARhc2RmMQ0wCwYDVQQHDARhc2RmMQwwCgYDVQQKDANs
a2oxDDAKBgNVBAsMA2xrajEMMAoGA1UEAwwDbGtqMREwDwYJKoZIhvcNAQkBFgJs
ajAeFw0xODA3MDcxNDU1MzNaFw0xOTA3MDcxNDU1MzNaMGgxCzAJBgNVBAYTAmlu
MQ0wCwYDVQQIDARhc2RmMQ0wCwYDVQQHDARhc2RmMQwwCgYDVQQKDANsa2oxDDAK
BgNVBAsMA2xrajEMMAoGA1UEAwwDbGtqMREwDwYJKoZIhvcNAQkBFgJsajCCASIw
دیگه
PPsb7H5cUzk1b4N9tfGPoINZ68CY + HqTwXtBTtiwIvkvP / nKD5cp9PhpDB / AI4Zx
c83J72iBpMefn1KgWAUMBNnxnYkezK7SY3osotakBXAT + 4tJI1BXL / TAV74VKe9a
7rXSEqCTxcj / H0kbW + 2WR / N5yDXjJk68k1A4oQ4wSLiejC9ycqHkZluKZjJl8XNh
9QnEsTtZRiX59FbRa64A16Alv7tBSSTxyCFfQqPxSpgiORoU1vRQqWxD7IV5WXl7
fQLaxR07nmJKxYSK7fGRdcXLQBmkWA0V0pA3qreDAznSfElk3GNhtx0Erk0CAwEA
آهیچ
FGDedvJ2pbkR2wFsu60fjDPocMFsMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEL
BQADggEBAIIVz6Aiu1VwM71ecL7aNgyEuctAtfkiDfopKANtBA5yzLQZylALSkjz
سید / ویکیپدیا
aJC4klj57uf1mPzW71yycS9IKFFGardqijjlHUyhgJVBs8kZbABT7ZedYA5UYdv +
SUNnzOU2Sm / ktPF5vWp8y4WjgujYnZQqj7pI4ucwYxb8WRW2EeeGpkbA6DuU7Tnv
frliIESdu9 / UCQm7A5zxW47MKTBrVDfoRsbrbjFo9PiGCxG / 7bglykFHovWVN2ez
uqLIdDOC2lNFBOJLPhf5w9s3fEGl8m8 =
----- گواهی END -----

نحوه امضای این گواهی با ca.key.pem؟
لطفا کمک کنید.

مرجع برای گواهی تولید – https://www.ibm.com/support/knowledgecenter/en/SSWHYP_4.0.0/com.ibm.apimgmt.cmc.doc/task_apionprem_gernerate_self_signed_openSSL.html

رمزگذاری – توزیع کلید از یک سرور مرکزی

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

تمام ارتباطات باید رمزگذاری شوند و این سیستم به اینترنت متصل نیست، فقط یک دسته از رایانه ها هستند که از طریق سوئیچ های مختلف متصل می شوند.

هر کامپیوتر می تواند اتصالات متفاوتی با دیگر آن ها داشته باشد، که هر دو به عنوان سرور و / یا مشتری عمل می کنند، با استفاده از هر دو UDP و / یا TCP.

آنچه که من می خواهم انجام دهم این است که چیزی را انجام دهیم نه بزرگ و پیچیده برای یک سیستم که باید در اینترنت باقی بماند. ایده من این بود که به نحوی از AES 128 (یا 256) و حالت GCM استفاده کنم.

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

رمز عبور ایجاد شده در سرور مرکزی می تواند به صورت دستی یا به صورت خودکار هر روز تغییر یابد.

شما در مورد این طرح چه فکر میکنید؟ من قصد دارم همه چیز را در C ++ توسعه دهم، هر گونه پیشنهادی در مورد اینکه چه تکنولوژی / کتابخانه باید استفاده کنم؟

من دیده ام سطح پایین سطح libcrypto ++ وجود دارد، اما OpenSSL نیز وجود دارد که قابلیت های TLS و DTLS را فراهم می کند. آیا می توان OpenSSL را برای ایجاد یک سیستم مانند آنچه که من توصیف کرده ام و یا باید از سایر کتابخانه ها مانند libcrypto ++ استفاده کنم؟