ओपनएसएसएल के साथ स्व-हस्ताक्षरित प्रमाण पत्र कैसे बनाएं


1291

मैं एक एम्बेडेड लिनक्स डिवाइस में HTTPS सपोर्ट जोड़ रहा हूं। मैंने इन चरणों के साथ एक स्व-हस्ताक्षरित प्रमाणपत्र बनाने की कोशिश की है:

openssl req -new > cert.csr
openssl rsa -in privkey.pem -out key.pem
openssl x509 -in cert.csr -out cert.pem -req -signkey key.pem -days 1001
cat key.pem>>cert.pem

यह काम करता है, लेकिन मुझे Google Chrome के साथ कुछ त्रुटियाँ हैं:

यह शायद वह स्थल नहीं है जिसे आप खोज रहे हैं!
साइट का सुरक्षा प्रमाणपत्र विश्वसनीय नहीं है!

क्या मैं कुछ भूल रहा हूँ? क्या यह स्व-हस्ताक्षरित प्रमाण पत्र बनाने का सही तरीका है?


40
स्व-हस्ताक्षरित प्रमाण पत्र को इंटरनेट के लिए असुरक्षित माना जाता है। फ़ायरफ़ॉक्स साइट को एक अवैध प्रमाणपत्र के रूप में मानेगा, जबकि क्रोम ऐसा कार्य करेगा जैसे कि कनेक्शन सादे HTTP था। अधिक जानकारी: gerv.net/security/self-signed-certs
user1202136

34
आपको अपने CA प्रमाणपत्र को अपने ब्राउज़रों में आयात करना होगा और उन ब्राउज़रों को बताना होगा जिन पर आप प्रमाण-पत्र पर भरोसा करते हैं- पिछला वो। मुझे खुद आखिरी विकल्प पसंद है।
ट्रोजनफॉ

12
आपको उस तरह "स्टॉक" ओपनएसएसएल सेटिंग्स का उपयोग नहीं करना चाहिए। ऐसा इसलिए है क्योंकि आप DNS नामों को विषय वैकल्पिक नाम (SAN) में नहीं रख सकते हैं। आपको एक alternate_namesअनुभाग के साथ एक कॉन्फ़िगरेशन फ़ाइल प्रदान करने और इसे -configविकल्प के साथ पास करने की आवश्यकता है। इसके अलावा, कॉमन नेम (CN) में DNS नाम रखने से IETF और CA / Browser फोरम दोनों द्वारा अपदस्थ (लेकिन निषिद्ध नहीं) किया जाता है। CN में कोई DNS नाम भी SAN में मौजूद होना चाहिए। वहाँ से बचने का कोई तरीका नहीं है SAN। नीचे उत्तर देखें।
jww

5
@Jww की टिप्पणी के अलावा। 2017 के अनुसार क्रोम क्रोम w / o (एमटीपी) को स्वीकार नहीं करता है सैन का अब नहीं है: "इस साइट के लिए प्रमाण पत्र में एक डोमेन नाम या आईपी पते वाला विषय वैकल्पिक नाम एक्सटेंशन नहीं है।"
गेरार्डजेपी

6
इन दिनों, जब तक आपका वेबसर्वर इंटरनेट पर पोर्ट 80 पर इसके FQDN द्वारा सुलभ है, तब तक आप LetsEncrypt का उपयोग कर सकते हैं और मुफ्त पूर्ण CA सेर्ट्स प्राप्त कर सकते हैं (90 दिनों के लिए मान्य, नवीनीकरण स्वचालित हो सकता है) जो किसी भी समय चेतावनी नहीं देगा / संदेश। www.letsencrypt.com
Barny

जवाबों:


2130

आप इसे एक कमांड में कर सकते हैं:

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365

यदि आप अपनी निजी कुंजी को पासफ़्रेज़ के साथ सुरक्षित नहीं रखना चाहते हैं, तो आप -nodes(संक्षिप्त में no DES) भी जोड़ सकते हैं। अन्यथा यह आपको "कम से कम 4 वर्ण" पासवर्ड के लिए संकेत देगा।

daysपैरामीटर (365) यदि आप किसी भी संख्या के साथ की जगह ले सकता समाप्ति की तारीख को प्रभावित करने के लिए। यह आपको "देश का नाम" जैसी चीजों के लिए प्रेरित करेगा, लेकिन आप केवल Enterचूक को स्वीकार कर सकते हैं और स्वीकार कर सकते हैं ।

-subj '/CN=localhost'प्रमाणपत्र की सामग्री के बारे में सवालों को दबाने के लिए जोड़ें ( localhostअपने इच्छित डोमेन के साथ बदलें )।

स्व-हस्ताक्षरित प्रमाण पत्र किसी भी तीसरे पक्ष के साथ मान्य नहीं हैं जब तक कि आप उन्हें पहले ब्राउज़र में आयात नहीं करते हैं। यदि आपको अधिक सुरक्षा की आवश्यकता है, तो आपको प्रमाणपत्र प्राधिकारी (सीए) द्वारा हस्ताक्षरित प्रमाण पत्र का उपयोग करना चाहिए ।


8
किसी की रुचि के लिए, यहाँ प्रलेखन है , यदि आप स्वयं कुछ भी सत्यापित करना चाहते हैं।

17
3rd-पार्टी के साथ हस्ताक्षर करना अधिक सुरक्षा कैसे प्रदान करता है?
जेम्स मिल्स

201
स्वचालन में इसका उपयोग करने वाले किसी और के लिए, यहाँ विषय के लिए सभी सामान्य पैरामीटर हैं:-subj "/C=US/ST=Oregon/L=Portland/O=Company Name/OU=Org/CN=www.example.com"
एलेक्स एस

16
@JamesMills मेरा मतलब है, इसके बारे में सोचो - अगर उसकी वैन के किनारे पर लिखा "फ्री कैंडी" वाला एक छायादार लड़का आपको अंदर आने के लिए आमंत्रित करता है, तो आप पूरी तरह से दो बार सोचने जा रहे हैं और इसके बारे में चौकस रह सकते हैं - लेकिन अगर कोई आप पर भरोसा करता है - जैसे वास्तव में विश्वास - सभी की तरह है, "नवा आदमी, वह वैध है" तो आप सभी उस मुफ्त कैंडी के बारे में होंगे।
BrainSlugs83

73
-sha256SHA-256-आधारित प्रमाणपत्र बनाने के लिए उपयोग करना याद रखें ।
गेआ-सुआन लिन

534

क्या मैं कुछ भूल रहा हूँ? क्या यह स्व-हस्ताक्षरित प्रमाण पत्र बनाने का सही तरीका है?

स्व-हस्ताक्षरित प्रमाणपत्र बनाना आसान है। आप बस openssl reqकमांड का उपयोग करें । ब्राउज़र और कमांड लाइन टूल जैसे ग्राहकों के सबसे बड़े चयन द्वारा उपभोग किया जा सकता है।

यह मुश्किल है क्योंकि ब्राउज़र की अपनी आवश्यकताओं का सेट है, और वे IETF की तुलना में अधिक प्रतिबंधक हैं । ब्राउज़रों द्वारा उपयोग की जाने वाली आवश्यकताओं को सीए / ब्राउज़र फ़ोरम (नीचे संदर्भ देखें) पर प्रलेखित किया जाता है । प्रतिबंध दो प्रमुख क्षेत्रों में उत्पन्न होते हैं: (1) विश्वास लंगर, और (2) DNS नाम।

आधुनिक ब्राउज़र (जैसे वेयरज़ हम 2014/2015 में उपयोग कर रहे हैं) एक प्रमाण पत्र चाहते हैं जो एक ट्रस्ट एंकर को वापस जंजीर देता है, और वे चाहते हैं कि DNS नामों को विशेष तरीके से प्रमाण पत्र में प्रस्तुत किया जाए। और ब्राउज़र सक्रिय रूप से स्व-हस्ताक्षरित सर्वर प्रमाण पत्र के खिलाफ बढ़ रहे हैं।

कुछ ब्राउज़र बिल्कुल स्व-हस्ताक्षरित सर्वर प्रमाणपत्र आयात करना आसान नहीं बनाते हैं। वास्तव में, आप कुछ ब्राउज़रों के साथ नहीं कर सकते, जैसे कि एंड्रॉइड का ब्राउज़र। तो पूरा समाधान अपने अधिकार बनने का है।

अपने स्वयं के प्राधिकारी बनने की अनुपस्थिति में, आपको प्रमाणपत्र को सफलता का सबसे बड़ा मौका देने के लिए DNS नाम प्राप्त करना होगा। लेकिन मैं आपको अपना अधिकार बनने के लिए प्रोत्साहित करूंगा। आपका अपना अधिकार बनना आसान है, और यह सभी ट्रस्ट मुद्दों (जो खुद से बेहतर है?) को दूर कर देगा।


यह शायद वह स्थल नहीं है जिसे आप खोज रहे हैं!
साइट का सुरक्षा प्रमाणपत्र विश्वसनीय नहीं है!

ऐसा इसलिए है क्योंकि ब्राउज़र सर्वर प्रमाणपत्रों को मान्य करने के लिए ट्रस्ट एंकरों की पूर्वनिर्धारित सूची का उपयोग करते हैं। एक स्व-हस्ताक्षरित प्रमाणपत्र एक विश्वसनीय एंकर के लिए वापस चेन नहीं करता है।

इससे बचने का सबसे अच्छा तरीका है:

  1. अपना अधिकार बनाएँ (यानी, CA बनें )
  2. सर्वर के लिए एक प्रमाणपत्र हस्ताक्षर अनुरोध (CSR) बनाएं
  3. सर्वर का CSR अपनी CA कुंजी के साथ साइन इन करें
  4. सर्वर पर सर्वर प्रमाणपत्र स्थापित करें
  5. क्लाइंट पर CA प्रमाणपत्र स्थापित करें

चरण 1 - अपना स्वयं का प्राधिकरण बनाएं इसका मतलब है कि स्वयं-हस्ताक्षरित प्रमाण पत्र बनाना CA: trueऔर उचित उपयोग करना। इसका मतलब है कि विषय और जारीकर्ता एक ही इकाई हैं, सीए बेसिक बाधाओं में सच है (इसे भी महत्वपूर्ण के रूप में चिह्नित किया जाना चाहिए), कुंजी का उपयोग है ( keyCertSignऔर crlSignयदि आप CRLs का उपयोग कर रहे हैं), और विषय कुंजी पहचानकर्ता (SKI) है के रूप में ही प्राधिकरण कुंजी पहचानकर्ता (अकी)।

अपना स्वयं का प्रमाणपत्र प्राधिकारी बनने के लिए, * आप अपने प्रमाणीकरण प्राधिकारी के साथ अनुरोध पर हस्ताक्षर करने वाले प्रमाणपत्र पर हस्ताक्षर कैसे करते हैं? स्टैक ओवरफ्लो पर। फिर, ब्राउज़र द्वारा उपयोग किए गए ट्रस्ट स्टोर में अपने सीए को आयात करें।

चरण 2 - 4 मोटे तौर पर आप एक सार्वजनिक सामना करने वाले सर्वर के लिए क्या कर रहे हैं जब आप एक CA की सेवाओं को शुरू करते हैं जैसे कि Startcom या CAcert । चरण 1 और 5 आपको तीसरे पक्ष के प्राधिकरण से बचने, और अपने स्वयं के प्राधिकरण के रूप में कार्य करने की अनुमति देता है (जो खुद पर भरोसा करना बेहतर है)?

ब्राउज़र चेतावनी से बचने का अगला सबसे अच्छा तरीका सर्वर के प्रमाण पत्र पर भरोसा करना है। लेकिन कुछ ब्राउज़र, जैसे एंड्रॉइड के डिफ़ॉल्ट ब्राउज़र, आपको ऐसा करने नहीं देते हैं। इसलिए यह प्लेटफॉर्म पर कभी काम नहीं करेगा।

ब्राउज़र (और अन्य समान उपयोगकर्ता एजेंटों) के मुद्दे पर स्व-हस्ताक्षरित प्रमाणपत्रों पर भरोसा नहीं करना इंटरनेट ऑफ थिंग्स (IoT) में एक बड़ी समस्या होने वाली है। उदाहरण के लिए, जब आप इसे प्रोग्राम करने के लिए अपने थर्मोस्टेट या रेफ्रिजरेटर से कनेक्ट करते हैं तो क्या होने वाला है? जवाब है, जहां तक ​​उपयोगकर्ता अनुभव का संबंध है, कुछ भी अच्छा नहीं है।

W3C की WebAppSec वर्किंग ग्रुप समस्या को देखना शुरू कर रहा है। उदाहरण के लिए देखें, प्रस्ताव: HTTP को गैर-सुरक्षित के रूप में चिह्नित करना


ओपनएसएसएल के साथ स्व-हस्ताक्षरित प्रमाण पत्र कैसे बनाएं

नीचे दिए गए आदेश और कॉन्फ़िगरेशन फ़ाइल एक स्व-हस्ताक्षरित प्रमाण पत्र बनाते हैं (यह आपको एक हस्ताक्षर अनुरोध बनाने के तरीके भी दिखाता है)। वे एक सम्मान में अन्य उत्तरों से भिन्न होते हैं: स्वयं हस्ताक्षरित प्रमाण पत्र के लिए उपयोग किए जाने वाले DNS नाम विषय वैकल्पिक नाम (SAN) में हैं , न कि सामान्य नाम (CN)

DNS नामों को सैन के साथ विन्यास फाइल के माध्यम से लाइन में रखा जाता है subjectAltName = @alternate_names(कमांड लाइन के माध्यम से ऐसा करने का कोई तरीका नहीं है)। फिर alternate_namesकॉन्फ़िगरेशन फ़ाइल में एक खंड होता है (आपको अपने स्वाद के अनुरूप इसे ट्यून करना चाहिए):

[ alternate_names ]

DNS.1       = example.com
DNS.2       = www.example.com
DNS.3       = mail.example.com
DNS.4       = ftp.example.com

# Add these if you need them. But usually you don't want them or
#   need them in production. You may need them for development.
# DNS.5       = localhost
# DNS.6       = localhost.localdomain
# IP.1        = 127.0.0.1
# IP.2        = ::1

यह SAN और नहीं सीएन में DNS नाम डाल करने के लिए महत्वपूर्ण है क्योंकि दोनों IETF और सीए / ब्राउज़र मंच अभ्यास निर्दिष्ट करें। वे यह भी निर्दिष्ट करते हैं कि CN में DNS नाम हटाए गए हैं (लेकिन निषिद्ध नहीं)। यदि आप CN में DNS नाम रखते हैं, तो इसे CA / B नीतियों के तहत SAN में शामिल किया जाना चाहिए। इसलिए आप विषय वैकल्पिक नाम का उपयोग करने से बच नहीं सकते।

यदि आप सैन में DNS नाम नहीं डालते हैं, तो प्रमाणपत्र एक ब्राउज़र और अन्य उपयोगकर्ता एजेंटों के तहत मान्य करने में विफल होगा जो सीए / ब्राउज़र फोरम दिशानिर्देशों का पालन करते हैं।

संबंधित: ब्राउज़र सीए / ब्राउज़र फोरम नीतियों का पालन करते हैं; और IETF नीतियां नहीं। यह उन कारणों में से एक है जो ओपनएसएसएल (जो आमतौर पर आईईटीएफ का अनुसरण करता है) के साथ बनाया गया एक प्रमाण पत्र कभी-कभी एक ब्राउज़र के तहत मान्य नहीं होता है (ब्राउज़र सीए / बी का अनुसरण करते हैं)। वे अलग-अलग मानक हैं, उनके पास अलग-अलग जारी करने की नीतियां और अलग-अलग सत्यापन आवश्यकताएं हैं।


एक स्व-हस्ताक्षरित प्रमाणपत्र बनाएं ( -x509विकल्प के अलावा नोटिस करें ):

openssl req -config example-com.conf -new -x509 -sha256 -newkey rsa:2048 -nodes \
    -keyout example-com.key.pem -days 365 -out example-com.cert.pem

एक हस्ताक्षर अनुरोध बनाएँ ( -x509विकल्प की कमी पर ध्यान दें ):

openssl req -config example-com.conf -new -sha256 -newkey rsa:2048 -nodes \
    -keyout example-com.key.pem -days 365 -out example-com.req.pem

एक स्व-हस्ताक्षरित प्रमाणपत्र प्रिंट करें :

openssl x509 -in example-com.cert.pem -text -noout

एक हस्ताक्षर अनुरोध प्रिंट करें :

openssl req -in example-com.req.pem -text -noout

कॉन्फ़िगरेशन फ़ाइल ( -configविकल्प के माध्यम से पारित )

[ req ]
default_bits        = 2048
default_keyfile     = server-key.pem
distinguished_name  = subject
req_extensions      = req_ext
x509_extensions     = x509_ext
string_mask         = utf8only

# The Subject DN can be formed using X501 or RFC 4514 (see RFC 4519 for a description).
#   Its sort of a mashup. For example, RFC 4514 does not provide emailAddress.
[ subject ]
countryName         = Country Name (2 letter code)
countryName_default     = US

stateOrProvinceName     = State or Province Name (full name)
stateOrProvinceName_default = NY

localityName            = Locality Name (eg, city)
localityName_default        = New York

organizationName         = Organization Name (eg, company)
organizationName_default    = Example, LLC

# Use a friendly name here because it's presented to the user. The server's DNS
#   names are placed in Subject Alternate Names. Plus, DNS names here is deprecated
#   by both IETF and CA/Browser Forums. If you place a DNS name here, then you
#   must include the DNS name in the SAN too (otherwise, Chrome and others that
#   strictly follow the CA/Browser Baseline Requirements will fail).
commonName          = Common Name (e.g. server FQDN or YOUR name)
commonName_default      = Example Company

emailAddress            = Email Address
emailAddress_default        = test@example.com

# Section x509_ext is used when generating a self-signed certificate. I.e., openssl req -x509 ...
[ x509_ext ]

subjectKeyIdentifier        = hash
authorityKeyIdentifier    = keyid,issuer

# You only need digitalSignature below. *If* you don't allow
#   RSA Key transport (i.e., you use ephemeral cipher suites), then
#   omit keyEncipherment because that's key transport.
basicConstraints        = CA:FALSE
keyUsage            = digitalSignature, keyEncipherment
subjectAltName          = @alternate_names
nsComment           = "OpenSSL Generated Certificate"

# RFC 5280, Section 4.2.1.12 makes EKU optional
#   CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
#   In either case, you probably only need serverAuth.
# extendedKeyUsage    = serverAuth, clientAuth

# Section req_ext is used when generating a certificate signing request. I.e., openssl req ...
[ req_ext ]

subjectKeyIdentifier        = hash

basicConstraints        = CA:FALSE
keyUsage            = digitalSignature, keyEncipherment
subjectAltName          = @alternate_names
nsComment           = "OpenSSL Generated Certificate"

# RFC 5280, Section 4.2.1.12 makes EKU optional
#   CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
#   In either case, you probably only need serverAuth.
# extendedKeyUsage    = serverAuth, clientAuth

[ alternate_names ]

DNS.1       = example.com
DNS.2       = www.example.com
DNS.3       = mail.example.com
DNS.4       = ftp.example.com

# Add these if you need them. But usually you don't want them or
#   need them in production. You may need them for development.
# DNS.5       = localhost
# DNS.6       = localhost.localdomain
# DNS.7       = 127.0.0.1

# IPv6 localhost
# DNS.8     = ::1

आपको Chrome के लिए निम्न कार्य करने की आवश्यकता हो सकती है। अन्यथा Chrome को एक सामान्य नाम अमान्य है ( ERR_CERT_COMMON_NAME_INVALID) की शिकायत हो सकती है । मुझे यकीन नहीं है कि इस संबंध में आईपी पते के बीच क्या संबंध है SAN और इस उदाहरण में एक CN।

# IPv4 localhost
# IP.1       = 127.0.0.1

# IPv6 localhost
# IP.2     = ::1

X.509 / PKIX प्रमाणपत्र में DNS नामों की हैंडलिंग से संबंधित अन्य नियम हैं। नियमों के लिए इन दस्तावेजों का संदर्भ लें:

RFC 6797 और RFC 7469 सूचीबद्ध हैं, क्योंकि वे अन्य RFC और CA / B दस्तावेजों की तुलना में अधिक प्रतिबंधात्मक हैं। RFCs 6797 और 7469 IP पते की अनुमति नहीं देते हैं, या तो।


4
क्या alternate_namesअनुभाग में वाइल्डकार्ड का उपयोग करना संभव है ? विशेष रूप से उप-उप डोमेन। मेरे पास इस उत्तर को संदर्भित करने वाला एक प्रश्न है: serverfault.com/questions/711596/…
लियोनार्डकैल्सिस

3
मैंने उनके विशिष्ट प्रश्न का उत्तर दिया है। मुझे लगता है कि इस लंबे सुरक्षा विवरण को जोड़ने का कोई मतलब नहीं है जब उत्तर इतना सरल था
डिएगो Woitasen

14
@diegows - आपका उत्तर पूर्ण या सही नहीं है। जिस कारण से यह सही नहीं है, उस लंबी पोस्ट पर चर्चा की जाती है जिसे आप पढ़ना नहीं चाहते हैं :)
jww

1
धन्यवाद! मुझे आपकी पोस्ट बहुत मददगार लगी। FYI करें मैं हाल ही में तिजोरी के साथ खेल रहा था और पाया कि यह DNS.x 127 के बजाय IP.x 127.0.0.1 पर जोर देता है ... मैंने जांच नहीं की कि यह मानक में है या नहीं।
चोमह

4
साभार @jww आपने कहा, "1. अपना प्राधिकरण बनाएं (यानी, सीए बनें)" , फिर कहा, "5. क्लाइंट पर सीए प्रमाण पत्र स्थापित करें" । यदि रूट कुंजी समझौता हो गया, तो एक दुर्भावनापूर्ण व्यक्ति उस कुंजी के साथ किसी भी डोमेन के लिए एक प्रमाण पत्र पर हस्ताक्षर कर सकता है, और यदि वे आपको अपनी वेबसाइट पर जाने के लिए धोखा देते हैं, तो वे अब एक मध्य-मध्य हमला कर सकते हैं। क्या रूट CA बनाने का कोई तरीका ऐसा है कि यह केवल मध्यस्थ CA पर हस्ताक्षर कर सकता है और प्रमाण पत्र नहीं? तब आप अपने मध्यस्थ सीए को नाम की कमी से सुरक्षित रख सकते हैं।
रॉबिन ज़िम्मरमैन

408

यहाँ दस्तावेज़ों से @ डाइजोज़ के उत्तर में वर्णित विकल्प अधिक विवरण में दिए गए हैं :

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days XXX
req

PKCS # 10 प्रमाणपत्र अनुरोध और उपयोगिता पैदा करने का प्रमाण पत्र।

-x509

यह विकल्प एक प्रमाणपत्र अनुरोध के बजाय एक स्व हस्ताक्षरित प्रमाण पत्र का उत्पादन करता है। यह आमतौर पर एक परीक्षण प्रमाण पत्र या एक स्व हस्ताक्षरित रूट सीए उत्पन्न करने के लिए उपयोग किया जाता है।

-newkey arg

यह विकल्प एक नया प्रमाणपत्र अनुरोध और एक नई निजी कुंजी बनाता है। तर्क कई रूपों में से एक लेता है। rsa: nbit , जहाँ nbits बिट्स की संख्या होती है, आकार में RSA प्रमुख nbit उत्पन्न करती है।

-keyout filename

यह नव निर्मित निजी कुंजी को लिखने के लिए फ़ाइल नाम देता है।

-out filename

यह आउटपुट फ़ाइल नाम को डिफ़ॉल्ट रूप से या मानक आउटपुट पर लिखने के लिए निर्दिष्ट करता है।

-days n

जब -x509 विकल्प का उपयोग किया जा रहा है तो यह प्रमाणपत्र को प्रमाणित करने के लिए दिनों की संख्या को निर्दिष्ट करता है। डिफ़ॉल्ट 30 दिनों का है।

-nodes

यदि यह विकल्प निर्दिष्ट किया जाता है तो यदि कोई निजी कुंजी बनाई जाती है तो उसे एन्क्रिप्ट नहीं किया जाएगा।

प्रलेखन वास्तव में उपरोक्त से अधिक विस्तृत है; मैंने इसे यहाँ संक्षेप में प्रस्तुत किया है।


3
XXXमूल आदेश में 'के लिए प्रमाण पत्र प्रमाणित करने के लिए दिनों की संख्या' के साथ प्रतिस्थापित किया जाना चाहिए। डिफ़ॉल्ट 30 दिनों का है। उदाहरण के लिए, -days XXXहो जाता है -days 365अगर आप अपने प्रमाणपत्र 365 दिनों के लिए वैध होना चाहता हूँ। अधिक के लिए डॉक्स देखें
नाथन जोन्स

प्रलेखन जोड़ने के लिए धन्यवाद। आदेश
लाल मटर

313

2020 तक, निम्न आदेश आपकी सभी आवश्यकताओं को पूरा करता है, जिसमें SAN भी शामिल है:

openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
  -keyout example.key -out example.crt -extensions san -config \
  <(echo "[req]"; 
    echo distinguished_name=req; 
    echo "[san]"; 
    echo subjectAltName=DNS:example.com,DNS:example.net,IP:10.0.0.1
    ) \
  -subj "/CN=example.com"

OpenSSL Open 1.1.1 में, इसे छोटा किया जा सकता है:

openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
  -keyout example.key -out example.crt -subj "/CN=example.com" \
  -addext "subjectAltName=DNS:example.com,DNS:example.net,IP:10.0.0.1"

यह एक प्रमाण पत्र बनाता है जो है

  • डोमेन example.comऔर example.net(SAN) के लिए मान्य है ,
  • IP पते 10.0.0.1(SAN) के लिए भी मान्य है ,
  • अपेक्षाकृत मजबूत (2020 तक) और
  • 3650दिनों के लिए वैध (~ 10 साल)।

यह निम्न फ़ाइलें बनाता है:

  • निजी चाबी: example.key
  • प्रमाणपत्र: example.crt

सभी जानकारी कमांड लाइन पर दी गई है। नहीं है कोई इंटरैक्टिव इनपुट है कि आप गुस्सा दिलाती है। हैं कोई config फ़ाइलें आप के साथ चारों ओर गंदगी के लिए है। सभी आवश्यक कदम एक एकल OpenSSL आह्वान द्वारा निष्पादित किए जाते हैं : निजी कुंजी पीढ़ी से स्व-हस्ताक्षरित प्रमाण पत्र तक।

# 1 टिप्पणी: क्रिप्टो मापदंडों

चूंकि प्रमाणपत्र स्व-हस्ताक्षरित है और उपयोगकर्ताओं द्वारा मैन्युअल रूप से स्वीकार किए जाने की आवश्यकता है, इसलिए यह संक्षिप्त समाप्ति या कमजोर क्रिप्टोग्राफी का उपयोग करने के लिए समझ में नहीं आता है।

भविष्य में, आप 4096RSA कुंजी और हैश एल्गोरिथ्म की तुलना में बिट्स से अधिक उपयोग करना चाह सकते हैं sha256, लेकिन 2020 तक ये समझदार मूल्य हैं। सभी आधुनिक ब्राउज़रों द्वारा समर्थित होने के दौरान वे पर्याप्त रूप से मजबूत हैं।

# 2: पैरामीटर " -nodes"

सैद्धांतिक रूप से आप -nodesपैरामीटर को छोड़ सकते हैं (जिसका अर्थ है "नो डेस एन्क्रिप्शन"), जिस स्थिति example.keyमें पासवर्ड के साथ एन्क्रिप्ट किया जाएगा। हालाँकि, यह सर्वर इंस्टॉलेशन के लिए लगभग कभी भी उपयोगी नहीं है, क्योंकि आपको या तो सर्वर पर पासवर्ड स्टोर करना होगा, या आपको प्रत्येक रिबूट पर इसे मैन्युअल रूप से दर्ज करना होगा।

# 3 टिप्पणी: यह भी देखें


1
मैं यह पता नहीं लगा सका कि वास्तव में arg / CN = localhost को C: / Program Files / Git / CN = localhost में विस्तारित करने का क्या दोष है, इसलिए मैंने पूरे कमांड को सादे cmd.exe में चलाया और यह ठीक काम किया। बस मामले में कोई इस के साथ संघर्ष कर रहा है।
यूरी पोज़निअक

1
@FranklinYu क्या आप सुनिश्चित हैं कि rsa: 2048 अब से 10 वर्षों में पर्याप्त होगा? क्योंकि वह वैधता अवधि है। जैसा कि समझाया गया है, यह संक्षिप्त समाप्ति या कमजोर क्रिप्टो का उपयोग करने के लिए समझ में नहीं आता है। अधिकांश 2048-बिट आरएसए कुंजियों की वैधता अवधि 1-3 वर्ष है। OpenSSL 1.1.1 के बारे में, मैं अभी भी वहाँ में sha256 छोड़ रहा हूँ, इसलिए यदि आप एक मजबूत हैश चाहते हैं तो इसे बदलना अधिक स्पष्ट और स्पष्ट है।
वोग

1
@DaveFerguson //CN=localhostइसके बजाय के लिए बनाया गया प्रमाण पत्र नहीं है /CN=localhost? क्या उचित पलायन यहाँ मदद करेगा? उदाहरण के लिए, की जगह है /CN=localhostके साथ "/CN=localhost"एक साफ तरह से समस्या का समाधान?
वोग

4
एक "वन-लाइनर" बनाने के लिए 1000 + 1s, जो नए आवश्यक सैन का उपयोग करता है, बहुत सारे बॉयलरप्लेट के साथ एक लंबे-घुमावदार कॉन्फ़िगरेशन फ़ाइल बनाने के बिना। बहुत बढ़िया!
जोशुआ पिंटर

1
@cautionbug धन्यवाद! मैंने इसे उत्तर में संपादित किया। क्या अब जवाब विंडोज / मिनगवे के लिए सही है?
वोग

142

मैं टिप्पणी नहीं कर सकता, इसलिए मैं इसे एक अलग उत्तर के रूप में रखूंगा। मुझे स्वीकार किए गए एक-लाइनर जवाब के साथ कुछ मुद्दे मिले:

  • एक-लाइनर में कुंजी में एक पासफ़्रेज़ शामिल है।
  • एक-लाइनर SHA-1 का उपयोग करता है जो कई ब्राउज़रों में कंसोल में चेतावनी देता है।

यहां एक सरलीकृत संस्करण है जो पासफ़्रेज़ को हटाता है, चेतावनियों को दबाने के लिए सुरक्षा को बढ़ाता है और पूर्ण प्रश्न सूची को हटाने के लिए -subj पास करने के लिए टिप्पणियों में एक सुझाव शामिल करता है:

openssl genrsa -out server.key 2048
openssl rsa -in server.key -out server.key
openssl req -sha256 -new -key server.key -out server.csr -subj '/CN=localhost'
openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt

आपको जो भी डोमेन की आवश्यकता है, उसके साथ 'लोकलहोस्ट' बदलें। आपको पहले दो आदेशों को एक-एक करके चलाना होगा क्योंकि ओपनएसएसएल पासफ़्रेज़ के लिए संकेत देगा।

दो को .pem फ़ाइल में संयोजित करने के लिए:

cat server.crt server.key > cert.pem

6
मुझे github.com/molnarg/node-http2 के लिए एक देव प्रमाणपत्र की आवश्यकता थी और यह उत्तर केवल सबसे अच्छा है।
कैपज

1
प्रमाणपत्र और कुंजी को एक फाइल में संयोजित करने के लिए cat server.crt server.key >foo-cert.pem:। उदाहरण के साथ काम करता हैopenssl-1.0.2d/demos/ssl/
18446744073709551615

जिस तरह से मैंने यह प्रमाणित किया है वह अभी भी SHA1 का उपयोग कर रहा है।
user169771

1
टी.के.एस, अच्छा काम करता है एक आत्म पर हस्ताक्षरित प्रमाणपत्र बनाने के लिए FreeBSD 10 OpenLDAP 2.4साथTLS
थियागो परेरा

2
क्या key.pem फ़ाइल के बारे में?
क्विकचेंज

72

आधुनिक ब्राउज़र अब एक अच्छी तरह से बनाए गए स्व-हस्ताक्षरित प्रमाण पत्र के लिए एक सुरक्षा त्रुटि फेंकते हैं यदि वे सैन (विषय वैकल्पिक नाम) को याद कर रहे हैं। OpenSSL इसे निर्दिष्ट करने के लिए एक कमांड-लाइन तरीका प्रदान नहीं करता है , इसलिए कई डेवलपर्स के ट्यूटोरियल और बुकमार्क अचानक पुराने हो गए हैं।

फिर से चलने का सबसे तेज़ तरीका एक छोटी, स्टैंड-अलोन गोपनीय फ़ाइल है:

  1. एक OpenSSL कॉन्फ़िग फ़ाइल बनाएं (उदाहरण: req.cnf)

    [req]
    distinguished_name = req_distinguished_name
    x509_extensions = v3_req
    prompt = no
    [req_distinguished_name]
    C = US
    ST = VA
    L = SomeCity
    O = MyCompany
    OU = MyDivision
    CN = www.company.com
    [v3_req]
    keyUsage = critical, digitalSignature, keyAgreement
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names
    [alt_names]
    DNS.1 = www.company.com
    DNS.2 = company.com
    DNS.3 = company.net
    
  2. इस कॉन्फ़िग फ़ाइल को संदर्भित करने वाला प्रमाणपत्र बनाएं

    openssl req -x509 -nodes -days 730 -newkey rsa:2048 \
     -keyout cert.key -out cert.pem -config req.cnf -sha256
    

उदाहरण https://support.citrix.com/article/CTX135602 से कॉन्फ़िगर करें


1
यह मेरे लिए अंतिम पैरामीटर-वैल्यूएशन 'v3_req' को हटाने के बाद काम किया था जो एक त्रुटि पैदा कर रहा था। खिड़कियों के लिए ओपनएसएसएल का उपयोग करना। अंत में, मैं इस मुद्दे को ठीक करने का प्रबंधन करता हूं! धन्यवाद।
CGodo

1
@ Kyopaxa आप सही हैं - वह पैरामीटर cnf फ़ाइल की पंक्ति 3 के साथ बेमानी है; अपडेट किया गया।
rymo

2
ठोस तरीका। धन्यवाद। मैं जोड़ने का सुझाव देता हूं -sha256
चेरोविम

5
अब आप सैन के साथ कमांड लाइन पर निर्दिष्ट कर सकते हैं -extension 'subjectAltName = DNS:dom.ain, DNS:oth.er'देखने github.com/openssl/openssl/pull/4986
एलेक्जेंडर Dubreuil

2
ऐसा लगता है कि इस विकल्प को -addextअब कहा जाता है।
एलेक्जेंड्रा ज़ुर्बकिन

67

मैं SHA-2 हैश एल्गोरिथ्म का उपयोग करने के लिए -sha256 पैरामीटर जोड़ने की सलाह दूंगा , क्योंकि प्रमुख ब्राउज़र "SHA-1 प्रमाणपत्र" को सुरक्षित नहीं दिखाने के लिए विचार कर रहे हैं।

स्वीकृत उत्तर से एक ही कमांड लाइन - @diegows with -sha256

खुलता है req -x509 -sha256 -newkey rsa: 2048 -keyout key.pem -out cert.pem -days XXX

Google सुरक्षा ब्लॉग में अधिक जानकारी ।

मई 2018 अपडेट करें । टिप्पणियों में कहा गया है कि SHA-2 का उपयोग करने से स्व-हस्ताक्षरित प्रमाण पत्र में कोई सुरक्षा नहीं जुड़ती है। लेकिन मैं अभी भी इसे पुराने / असुरक्षित क्रिप्टोग्राफिक हैश फ़ंक्शन का उपयोग नहीं करने की एक अच्छी आदत के रूप में उपयोग करने की सलाह देता हूं। पूर्ण विवरण उपलब्ध है क्यों यह SHA-1 आधारित अंतिम-इकाई प्रमाणपत्र से ऊपर के प्रमाणपत्र के लिए ठीक है?


1
यदि यह एक स्व-हस्ताक्षरित कुंजी है, तो यह वैसे भी ब्राउज़र त्रुटियों को उत्पन्न करने वाला है, इसलिए यह वास्तव में कोई मायने नहीं रखता है
मार्क

30
@ मर्क, यह मायने रखता है, क्योंकि SHA-2 अधिक सुरक्षित है
Maris B.

1
सर्टिफिकेट का नाम बदलने के बाद सर्टिफिकेट को विंडोज़ में खोलना। सर्टिफिकेट के नाम पर। फिंगरप्रिंट फिंगरप्रिंट एल्गोरिथ्म अभी भी शा 1 है, लेकिन सिग्नेचर हैश एल्गोरिथम शै 256 है।
पाप किया

2
"विश्व स्तरीय एन्क्रिप्शन * शून्य प्रमाणीकरण = शून्य सुरक्षा" gerv.net/security/self-signed-certs
x-yuri

4
ध्यान दें कि स्व-हस्ताक्षरित प्रमाणपत्र पर उपयोग किए गए हस्ताक्षर एल्गोरिथ्म यह तय करने में अप्रासंगिक है कि यह विश्वसनीय है या नहीं। रूट सीए सीरियल्स स्व-हस्ताक्षरित हैं। और मई 2018 तक, अभी भी कई सक्रिय रूट CA प्रमाणपत्र हैं जो SHA-1 पर हस्ताक्षर किए गए हैं। क्योंकि इससे कोई फर्क नहीं पड़ता कि कोई सर्टिफिकेट खुद पर भरोसा करता है और न ही वह सर्टिफिकेट उस ट्रस्ट को कैसे सत्यापित करता है। आप या तो रूट / स्व-हस्ताक्षरित प्रमाणपत्र पर भरोसा करते हैं कि यह किसके लिए है, या आप नहीं करते हैं। सुरक्षा
एंड्रयू हेनले

20

यह वह स्क्रिप्ट है जिसका उपयोग मैं स्थानीय बॉक्स पर सैट (सब्जेक्टनेम) सेट करने के लिए स्व-हस्ताक्षरित प्रमाण पत्र में करता हूं।

यह स्क्रिप्ट डोमेन नाम (example.com) लेती है और उसी सर्टिफ़िकेट में SAN * * .example.com और example.com जेनरेट करती है। नीचे दिए गए अनुभाग टिप्पणी कर रहे हैं। स्क्रिप्ट का नाम (जैसे generate-ssl.sh) और इसे निष्पादन योग्य अनुमति दें। फ़ाइलों को स्क्रिप्ट के समान निर्देशिका में लिखा जाएगा।

Chrome 58 को आगे चलकर SAN को स्व-हस्ताक्षरित प्रमाणपत्रों में सेट करना होगा।

#!/usr/bin/env bash

# Set the TLD domain we want to use
BASE_DOMAIN="example.com"

# Days for the cert to live
DAYS=1095

# A blank passphrase
PASSPHRASE=""

# Generated configuration file
CONFIG_FILE="config.txt"

cat > $CONFIG_FILE <<-EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
x509_extensions = v3_req
distinguished_name = dn

[dn]
C = CA
ST = BC
L = Vancouver
O = Example Corp
OU = Testing Domain
emailAddress = webmaster@$BASE_DOMAIN
CN = $BASE_DOMAIN

[v3_req]
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.$BASE_DOMAIN
DNS.2 = $BASE_DOMAIN
EOF

# The file name can be anything
FILE_NAME="$BASE_DOMAIN"

# Remove previous keys
echo "Removing existing certs like $FILE_NAME.*"
chmod 770 $FILE_NAME.*
rm $FILE_NAME.*

echo "Generating certs for $BASE_DOMAIN"

# Generate our Private Key, CSR and Certificate
# Use SHA-2 as SHA-1 is unsupported from Jan 1, 2017

openssl req -new -x509 -newkey rsa:2048 -sha256 -nodes -keyout "$FILE_NAME.key" -days $DAYS -out "$FILE_NAME.crt" -passin pass:$PASSPHRASE -config "$CONFIG_FILE"

# OPTIONAL - write an info to see the details of the generated crt
openssl x509 -noout -fingerprint -text < "$FILE_NAME.crt" > "$FILE_NAME.info"

# Protect the key
chmod 400 "$FILE_NAME.key"

यह स्क्रिप्ट एक सूचना फ़ाइल भी लिखती है, जिससे आप नए प्रमाणपत्र का निरीक्षण कर सकते हैं और सत्यापित कर सकते हैं कि SAN ठीक से सेट है।

                ...
                28:dd:b8:1e:34:b5:b1:44:1a:60:6d:e3:3c:5a:c4:
                da:3d
            Exponent: 65537 (0x10001)
    X509v3 extensions:
        X509v3 Subject Alternative Name: 
            DNS:*.example.com, DNS:example.com
Signature Algorithm: sha256WithRSAEncryption
     3b:35:5a:d6:9e:92:4f:fc:f4:f4:87:78:cd:c7:8d:cd:8c:cc:
     ...

यदि आप अपाचे का उपयोग कर रहे हैं, तो आप अपनी कॉन्फ़िगरेशन फ़ाइल में उपरोक्त प्रमाणपत्र को इस तरह संदर्भित कर सकते हैं:

<VirtualHost _default_:443>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/htdocs

    SSLEngine on
    SSLCertificateFile path/to/your/example.com.crt
    SSLCertificateKeyFile path/to/your/example.com.key
</VirtualHost>

नए प्रमाणपत्र के प्रभावी होने के लिए अपने Apache (या Nginx, या IIS) सर्वर को पुनरारंभ करना याद रखें।


मैकओएस हाई सियरा और क्रोम 58
साकिब ओमेर

मुझे अब भी यकीन नहीं है कि CN समग्र सेटअप को कैसे प्रभावित करता है? मैं इसे चलाने की कोशिश कर रहा हूं localhostया कुछ इस तरह से इसके लिए 127.0.0.1:port#क्या होगा CN
डीजे 2

@ DJ2 मैं BASE_DOMAIN = "लोकलहोस्ट" सेट करूंगा
Drakes

9

2017 वन-लाइनर:

openssl req \
-newkey rsa:2048 \
-x509 \
-nodes \
-keyout server.pem \
-new \
-out server.pem \
-subj /CN=localhost \
-reqexts SAN \
-extensions SAN \
-config <(cat /System/Library/OpenSSL/openssl.cnf \
    <(printf '[SAN]\nsubjectAltName=DNS:localhost')) \
-sha256 \
-days 3650

यह Chrome 57 में भी काम करता है, क्योंकि यह SAN को एक और कॉन्फ़िगरेशन फ़ाइल प्रदान किए बिना प्रदान करता है। इसे यहां एक उत्तर से लिया गया था ।

यह एक .pem फ़ाइल बनाता है जिसमें निजी कुंजी और प्रमाणपत्र दोनों शामिल हैं। यदि आवश्यक हो तो आप उन्हें .pem फ़ाइलों को अलग करने के लिए ले जा सकते हैं।


2
लिनक्स उपयोगकर्ताओं के लिए आपको विन्यास के लिए उस पथ को बदलना होगा। जैसे वर्तमान Ubuntu पर /etc/ssl/openssl.confकाम करता है
अपकर्ष

एक एक लाइनर कि openssl.cnf स्थान को निर्दिष्ट करने की आवश्यकता नहीं है के लिए देखें: stackoverflow.com/a/41366949/19163
VOG

7

मैं टिप्पणी नहीं कर सकता, इसलिए मैं एक अलग उत्तर जोड़ता हूं। मैंने NGINX के लिए एक स्व-हस्ताक्षरित प्रमाण पत्र बनाने की कोशिश की और यह आसान था, लेकिन जब मैं इसे क्रोम सफेद सूची में जोड़ना चाहता था तो मुझे एक समस्या थी। और मेरा समाधान रूट प्रमाण पत्र बनाना था और इसके द्वारा एक बाल प्रमाणपत्र पर हस्ताक्षर किए।

तो कदम दर कदम। फ़ाइल config_ssl_ca.cnf फ़ाइल बनाएँ , कॉन्फ़िग फ़ाइल में एक विकल्प है BasicConstraints = CA: सच है जिसका अर्थ है कि यह प्रमाणपत्र रूट होना चाहिए।

यह एक अच्छा अभ्यास है, क्योंकि आप इसे एक बार बनाते हैं और पुन: उपयोग कर सकते हैं।

[ req ]
default_bits = 2048

prompt = no
distinguished_name=req_distinguished_name
req_extensions = v3_req

[ req_distinguished_name ]
countryName=UA
stateOrProvinceName=root region
localityName=root city
organizationName=root organisation
organizationalUnitName=roote department
commonName=root
emailAddress=root_email@root.localhost

[ alternate_names ]
DNS.1        = market.localhost
DNS.2        = www.market.localhost
DNS.3        = mail.market.localhost
DNS.4        = ftp.market.localhost

[ v3_req ]
keyUsage=digitalSignature
basicConstraints=CA:true
subjectKeyIdentifier = hash
subjectAltName = @alternate_names

अपने बच्चे के प्रमाणपत्र के लिए अगली कॉन्फिग फाइल।

[ req ]
default_bits = 2048

prompt = no
distinguished_name=req_distinguished_name
req_extensions = v3_req

[ req_distinguished_name ]
countryName=UA
stateOrProvinceName=Kyiv region
localityName=Kyiv
organizationName=market place
organizationalUnitName=market place department
commonName=FirstName LastName
emailAddress=email@market.localhost

[ alternate_names ]
DNS.1        = market.localhost
DNS.2        = www.market.localhost
DNS.3        = mail.market.localhost
DNS.4        = ftp.market.localhost

[ v3_req ]
keyUsage=digitalSignature
basicConstraints=CA:false
subjectAltName = @alternate_names
subjectKeyIdentifier = hash

पहला कदम - रूट की और सर्टिफिकेट बनाएं

openssl genrsa -out ca.key 2048
openssl req -new -x509 -key ca.key -out ca.crt -days 365 -config config_ssl_ca.cnf

दूसरा चरण चाइल्ड की बनाता है और CSR फाइल करता है - सर्टिफिकेट साइनिंग रिक्वेस्ट। क्योंकि विचार यह है कि बच्चे के प्रमाणपत्र को मूल रूप से हस्ताक्षरित करें और एक सही प्रमाण पत्र प्राप्त करें

openssl genrsa -out market.key 2048
openssl req -new -sha256 -key market.key -config config_ssl.cnf -out market.csr

लिनक्स टर्मिनल खोलें और यह कमांड इको करें

echo 1 > ca.srl
touch index.txt

Ca.srl पाठ अगले सीरियल नंबर युक्त फ़ाइल हेक्स में उपयोग करने के लिए। अनिवार्य। यह फ़ाइल मौजूद होनी चाहिए और इसमें एक मान्य सीरियल नंबर होना चाहिए।

अंतिम चरण, एक और कॉन्फिग फ़ाइल को क्रेट करें और इसे config_ca.cnf कहें

# we use 'ca' as the default section because we're usign the ca command
[ ca ]
default_ca = my_ca

[ my_ca ]
#  a text file containing the next serial number to use in hex. Mandatory.
#  This file must be present and contain a valid serial number.
serial = ./ca.srl

# the text database file to use. Mandatory. This file must be present though
# initially it will be empty.
database = ./index.txt

# specifies the directory where new certificates will be placed. Mandatory.
new_certs_dir = ./

# the file containing the CA certificate. Mandatory
certificate = ./ca.crt

# the file contaning the CA private key. Mandatory
private_key = ./ca.key

# the message digest algorithm. Remember to not use MD5
default_md = sha256

# for how many days will the signed certificate be valid
default_days = 365

# a section with a set of variables corresponding to DN fields
policy = my_policy

# MOST IMPORTANT PART OF THIS CONFIG
copy_extensions = copy

[ my_policy ]
# if the value is "match" then the field value must match the same field in the
# CA certificate. If the value is "supplied" then it must be present.
# Optional means it may be present. Any fields not mentioned are silently
# deleted.
countryName = match
stateOrProvinceName = supplied
organizationName = supplied
commonName = supplied
organizationalUnitName = optional
commonName = supplied

आप पूछ सकते हैं कि इतना मुश्किल क्यों, हमें बाल प्रमाणपत्र को रूट द्वारा साइन करने के लिए एक और कॉन्फिगरेशन क्यों बनाना चाहिए। उत्तर सरल है क्योंकि बच्चे के प्रमाण पत्र में एक SAN ब्लॉक होना चाहिए - विषय वैकल्पिक नाम। अगर हम चाइल्ड सर्टिफिकेट पर "ओपन्सल एक्स 509" बर्तनों से हस्ताक्षर करते हैं, तो रूट सर्टिफिकेट चाइल्ड सर्टिफिकेट में सैन फील्ड को हटा देगा। इसलिए हम सैन फील्ड को हटाने से बचने के लिए "ओपनसेल एक्स 509" के बजाय "ओपनसेल सीए" का उपयोग करते हैं। हम एक नई कॉन्फ़िग फ़ाइल बनाते हैं और इसे सभी विस्तारित फ़ील्ड copy_extensions = copy करने के लिए कहते हैं

openssl ca -config config_ca.cnf -out market.crt -in market.csr

कार्यक्रम आपको 2 प्रश्न पूछता है: 1. प्रमाण पत्र पर हस्ताक्षर करें? "Y" 2 कहें। 1 में से 1 प्रमाणपत्र अनुरोध प्रमाणित, प्रतिबद्ध है? "Y" कहें

टर्मिनल में आप "डेटाबेस" शब्द के साथ एक वाक्य देख सकते हैं, इसका मतलब है फ़ाइल इंडेक्स.टैक्स जिसे आप कमांड "टच" द्वारा बनाते हैं। इसमें "ओपनसेल सीए" उपयोग द्वारा आपके द्वारा बनाए गए सभी प्रमाणपत्रों की सभी जानकारी होगी। प्रमाणपत्र मान्य उपयोग की जांच करने के लिए:

openssl rsa -in market.key -check

यदि आप देखना चाहते हैं कि CRT में क्या है:

openssl x509 -in market.crt -text -noout

यदि आप देखना चाहते हैं कि CSR में क्या है:

openssl req -in market.csr -noout -text 

2
हालाँकि, यह प्रक्रिया जटिल दिखती है, यह ठीक वैसा ही है जो हमें .dev डोमेन के लिए चाहिए, क्योंकि यह डोमेन स्व-हस्ताक्षरित प्रमाणपत्रों का समर्थन नहीं करता है और क्रोम और फ़ायरफ़ॉक्स HSTS को मजबूर कर रहे हैं। मैंने जो कुछ भी किया है, वह इस कदम का पालन कर रहा है, जो सीए बना रहा है, एक प्रमाण पत्र बना रहा है और अपने सीए के साथ हस्ताक्षर कर रहा है और अंत में ब्राउज़र में मेरे सीए पर भरोसा कर रहा है। धन्यवाद।
बाजीकुसको

1
आप सर, एक लानत किंवदंती हैं। मेरा होमलैब धन्यवाद!
दोपहर

6

आपके पास सामान्य प्रक्रिया सही है। कमांड का सिंटैक्स नीचे है।

openssl req -new -key {private key file} -out {output file}

हालाँकि, चेतावनियाँ प्रदर्शित की जाती हैं, क्योंकि ब्राउज़र किसी ज्ञात प्रमाणपत्र प्राधिकरण (CA) के साथ प्रमाण पत्र को सत्यापित करके पहचान की पुष्टि करने में सक्षम नहीं था।

जैसा कि यह एक स्व-हस्ताक्षरित प्रमाण पत्र है कोई सीए नहीं है और आप चेतावनी को अनदेखा कर सकते हैं और आगे बढ़ सकते हैं। क्या आप एक वास्तविक प्रमाण पत्र प्राप्त करना चाहते हैं जो सार्वजनिक इंटरनेट पर किसी के द्वारा पहचाना जाएगा तो प्रक्रिया नीचे है।

  1. एक निजी कुंजी उत्पन्न करें
  2. CSR फ़ाइल बनाने के लिए उस निजी कुंजी का उपयोग करें
  3. CSR को CA (सत्यापन या अन्य, आदि) पर जमा करें
  4. वेब सर्वर पर CA से प्राप्त प्रमाणपत्र स्थापित करें
  5. प्रमाणन के प्रकार के आधार पर प्रमाणीकरण श्रृंखला में अन्य सिरे जोड़ें

कनेक्शन सुरक्षित करने की एक पोस्ट में मेरे पास इसके बारे में अधिक विवरण हैं : OpenSSL के साथ एक सुरक्षा प्रमाणपत्र बनाना


6

एक लाइनर FTW। मैं इसे सरल रखना पसंद करता हूं। एक आदेश का उपयोग क्यों न करें जिसमें सभी तर्कों की आवश्यकता हो? यह मुझे कैसे पसंद है - यह एक x509 प्रमाणपत्र और इसकी PEM कुंजी बनाता है:

openssl req -x509 \
 -nodes -days 365 -newkey rsa:4096 \
 -keyout self.key.pem \
 -out self-x509.crt \
 -subj "/C=US/ST=WA/L=Seattle/CN=example.com/emailAddress=someEmail@gmail.com"

उस एकल आदेश में वे सभी उत्तर हैं जो आप सामान्य रूप से प्रमाणपत्र विवरण के लिए प्रदान करेंगे। इस तरह आप पैरामीटर सेट कर सकते हैं और कमांड चला सकते हैं, अपना आउटपुट प्राप्त कर सकते हैं - फिर कॉफी के लिए जाएं।

>> यहाँ अधिक <<


1
SANs को छोड़कर सभी तर्क ... @ vog का उत्तर कवर करता है कि (और इससे पहले की भविष्यवाणी करें) (इसमें एक अधिक संपूर्ण "विषय" फ़ील्ड भरा हुआ है ...) (एक वर्ष का एक बड़ा प्रशंसक या तो समाप्त नहीं होता)
गर्ट वैन डेन बर्ग

6

वन-लाइनर संस्करण 2017:

CentOS:

openssl req -x509 -nodes -sha256 -newkey rsa:2048 \
-keyout localhost.key -out localhost.crt \
-days 3650 \
-subj "CN=localhost" \
-reqexts SAN -extensions SAN \
-config <(cat /etc/pki/tls/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=IP:127.0.0.1,DNS:localhost"))

उबंटू:

openssl req -x509 -nodes -sha256 -newkey rsa:2048 \
-keyout localhost.key -out localhost.crt \
-days 3650 \
-subj "/CN=localhost" \
-reqexts SAN -extensions SAN \
-config <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=IP:127.0.0.1,DNS:localhost"))

संपादित करें: उबंटू के लिए 'सबज' विकल्प में स्लैप को जोड़कर जोड़ा गया।


3

कुंजी उत्पन्न करें

मैं /etc/mysqlप्रमाणित भंडारण के लिए उपयोग कर रहा हूं क्योंकि /etc/apparmor.d/usr.sbin.mysqldइसमें शामिल है /etc/mysql/*.pem r

sudo su -
cd /etc/mysql
openssl genrsa -out ca-key.pem 2048;
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem -out ca-cert.pem;
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem -out server-req.pem;
openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem;
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem -out client-req.pem;
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem;

कॉन्फ़िगरेशन जोड़ें

/etc/mysql/my.cnf

[client]
ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/client-cert.pem
ssl-key=/etc/mysql/client-key.pem

[mysqld]
ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem

मेरे सेटअप पर, Ubuntu सर्वर ने लॉग इन किया: /var/log/mysql/error.log

नोटों का अनुसरण करें:

  • SSL error: Unable to get certificate from '...'

    यदि यह एपरमोर्स कॉन्फ़िगरेशन में नहीं है तो MySQL को आपकी सर्टिफिकेट फ़ाइल तक पढ़ने से वंचित किया जा सकता है । जैसा कि पिछले चरणों में उल्लिखित है ^ हमारे सभी प्रमाणपत्रों को डायरेक्टरी .pemमें फाइलों के रूप में सेव करें, /etc/mysql/जो कि एपरमोर द्वारा डिफ़ॉल्ट रूप से अनुमोदित है (या जहाँ भी आपने उन्हें संग्रहीत किया है, वहां तक ​​पहुंचने की अनुमति देने के लिए अपने अपर्म / SELinux को संशोधित करें।)

  • SSL error: Unable to get private key

    आपका MySQL सर्वर संस्करण डिफ़ॉल्ट rsa:2048प्रारूप का समर्थन नहीं कर सकता है

    इसके साथ rsa:2048सादे में कनवर्ट करें rsa:

    openssl rsa -in server-key.pem -out server-key.pem
    openssl rsa -in client-key.pem -out client-key.pem
    
  • जांचें कि क्या स्थानीय सर्वर एसएसएल का समर्थन करता है :

    mysql -u root -p
    mysql> show variables like "%ssl%";
    +---------------+----------------------------+
    | Variable_name | Value                      |
    +---------------+----------------------------+
    | have_openssl  | YES                        |
    | have_ssl      | YES                        |
    | ssl_ca        | /etc/mysql/ca-cert.pem     |
    | ssl_capath    |                            |
    | ssl_cert      | /etc/mysql/server-cert.pem |
    | ssl_cipher    |                            |
    | ssl_key       | /etc/mysql/server-key.pem  |
    +---------------+----------------------------+
    
  • डेटाबेस से कनेक्शन का सत्यापन SSL एन्क्रिप्टेड है :

    कनेक्शन का सत्यापन

    जब MySQL उदाहरण में लॉग इन किया जाता है, तो आप क्वेरी जारी कर सकते हैं:

    show status like 'Ssl_cipher';
    

    यदि आपका कनेक्शन एन्क्रिप्ट नहीं किया गया है, तो परिणाम रिक्त होगा:

    mysql> show status like 'Ssl_cipher';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | Ssl_cipher    |       |
    +---------------+-------+
    1 row in set (0.00 sec)
    

    अन्यथा, यह उपयोग में सायफ़र के लिए एक गैर-शून्य लंबाई स्ट्रिंग दिखाएगा:

    mysql> show status like 'Ssl_cipher';
    +---------------+--------------------+
    | Variable_name | Value              |
    +---------------+--------------------+
    | Ssl_cipher    | DHE-RSA-AES256-SHA |
    +---------------+--------------------+
    1 row in set (0.00 sec)
    
  • विशिष्ट उपयोगकर्ता के कनेक्शन के लिए ssl की आवश्यकता है ('ssl की आवश्यकता है'):

    • एसएसएल

    सर्वर को केवल खाते के लिए एसएसएल-एन्क्रिप्टेड कनेक्शन की अनुमति देता है।

    GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
      REQUIRE SSL;
    

    कनेक्ट करने के लिए, क्लाइंट को सर्वर प्रमाणपत्र को प्रमाणित करने के लिए --ssl-ca विकल्प को निर्दिष्ट करना होगा, और इसके अलावा --ssl-key और --ssl- प्रमाणित विकल्प निर्दिष्ट कर सकते हैं। यदि न तो --ssl-ca विकल्प और न ही --ssl-capath विकल्प निर्दिष्ट किया जाता है, तो क्लाइंट सर्वर प्रमाणपत्र को प्रमाणित नहीं करता है।


वैकल्पिक लिंक: SSL के साथ MySQL के लिए सुरक्षित PHP कनेक्शन में लंबा ट्यूटोरियल ।


-1; यह पूछे जाने वाले प्रश्न के लिए काफी हद तक मूर्त है, और यह स्पष्ट करने का एक बुरा काम भी करता है कि इसके उद्धरण कहाँ से हैं।
मार्क अमेरी

यह सीए द्वारा हस्ताक्षरित सीए, सर्वर / क्लाइंट सेरेट्स को प्रोविजन करता हुआ दिखाता है, उन्हें एपर्चर के साथ होस्ट पर mysqld द्वारा पढ़ने के लिए कॉन्फ़िगर करता है। यह ca, सर्वर और क्लाइंट को एक ही मशीन पर होस्ट करने के बजाय बेकार मामले की मिसाल देता है, और उस सीए के अधिकार को खतरनाक तरीके से mysqld प्रक्रिया में उजागर करता है। यह सेटअप वास्तव में परीक्षण वातावरण में ssl कॉन्फ़िगरेशन का परीक्षण करने के अलावा अन्य कोई मतलब नहीं है। एक आंतरिक सीए के संचालन के लिए, मैं सिफारिश करेंगे gnuttls openssl से अधिक Toolchain help.ubuntu.com/community/GnuTLS और mysqld + एपआर्मर मामले के आसपास काम करने से पहले टीएलएस की अच्छी समझ होने
ThorSummoner

3

जैसा कि विस्तार से चर्चा की गई है, इंटरनेट पर स्व-हस्ताक्षरित प्रमाणपत्रों पर भरोसा नहीं किया जाता है । आप अपने स्वयं के हस्ताक्षरित प्रमाणपत्र को कई नहीं बल्कि सभी ब्राउज़रों में जोड़ सकते हैं । वैकल्पिक रूप से आप अपने स्वयं के प्रमाणपत्र प्राधिकारी बन सकते हैं

प्राथमिक कारण एक प्रमाणपत्र प्राधिकारी से एक हस्ताक्षरित प्रमाणपत्र प्राप्त नहीं करना चाहता है - प्रमाणपत्र के लिए प्रति वर्ष $ 995 - $ 1,999 प्रति वर्ष के बीच Symantec शुल्क - सिर्फ आंतरिक नेटवर्क के लिए अभिप्रमाणित प्रमाणपत्र के लिए, Symantec प्रति वर्ष $ 399 का शुल्क लेता है । यदि आप क्रेडिट कार्ड से भुगतान कर रहे हैं या अत्यधिक लाभदायक कंपनी के लाभ केंद्र के लिए काम कर रहे हैं तो यह लागत को सही ठहराना आसान है। यह एक व्यक्तिगत परियोजना के लिए कई से अधिक खर्च कर सकता है जो एक इंटरनेट पर बना रहा है, या एक न्यूनतम बजट पर चल रहे गैर-लाभ के लिए, या यदि कोई एक संगठन के लागत केंद्र में काम करता है - लागत केंद्र हमेशा अधिक करने की कोशिश करते हैं कम के साथ।

एक विकल्प सर्टबोट का उपयोग करना है (देखें सर्टिफिकेट के बारे में )। सर्बोट एक आसान-उपयोग वाला स्वचालित ग्राहक है जो आपके वेब सर्वर के लिए एसएसएल / टीएलएस प्रमाणपत्र प्राप्त करता है और उसे वितरित करता है।

यदि आप सर्टिफिकेट को सेटअप करते हैं, तो आप इसे लेट्स एनक्रिप्ट सर्टिफिकेट अथॉरिटी द्वारा जारी किए गए प्रमाण पत्र को बनाने और बनाए रखने में सक्षम कर सकते हैं ।

मैंने अपने संगठन के लिए सप्ताहांत में ऐसा किया। मैंने अपने सर्वर (Ubuntu 16.04) पर सर्टिफिकेट के लिए आवश्यक पैकेज स्थापित किए और फिर सर्टिफिकेट को सेटअप करने और सक्षम करने के लिए आवश्यक कमांड को चलाया। सर्टिफिकेट के लिए एक संभावित रूप से DNS प्लगइन की आवश्यकता होती है - हम वर्तमान में DigitalOcean का उपयोग कर रहे हैं, हालांकि जल्द ही किसी अन्य सेवा में माइग्रेट किया जा सकता है।

ध्यान दें कि कुछ निर्देश काफी सही नहीं थे और Google के साथ इसका पता लगाने के लिए थोड़ा मुक्का और समय लिया। इसने पहली बार मेरे समय की एक उचित राशि ली लेकिन अब मुझे लगता है कि मैं इसे मिनटों में कर सकता था।

DigitalOcean के लिए, मेरे द्वारा संघर्ष किया गया एक क्षेत्र तब था जब मुझे INI फ़ाइल में आपके DigitalOcean क्रेडेंशियल्स के लिए पथ इनपुट करने के लिए कहा गया था। जिस स्क्रिप्ट की बात हो रही है, वह उस पृष्ठ पर मौजूद एप्लिकेशन और API पृष्ठ और टोकन / कुंजी टैब है। DigitalOcean's API के लिए आपको एक व्यक्तिगत एक्सेस टोकन (पढ़ना और लिखना) उत्पन्न करना होगा - यह एक 65 वर्ण हेक्साडेसिमल स्ट्रिंग है। इस स्ट्रिंग को वेबसर्वर पर एक फ़ाइल में डालने की जरूरत है, जिसमें से आप सर्टिफिकेट चला रहे हैं। उस फ़ाइल में पहली पंक्ति के रूप में एक टिप्पणी हो सकती है (टिप्पणियाँ # से शुरू होती हैं)। सेकंड लाइन है:

dns_digitalocean_token = 0000111122223333444455556666777788889999aaaabbbbccccddddeeeeffff

एक बार जब मुझे पता चला कि डिजिटलऑइन के एपीआई के लिए एक रीड + राइट टोकन कैसे सेट किया जाए, तो वाइल्डकार्ड सर्टिफिकेट सेटअप करने के लिए सर्टिफिकेट का उपयोग करना बहुत आसान था । ध्यान दें कि किसी को वाइल्डकार्ड प्रमाणपत्र सेट करने की आवश्यकता नहीं है, कोई इसके बजाय प्रत्येक डोमेन और उप-डोमेन को निर्दिष्ट कर सकता है जो एक प्रमाण पत्र चाहता है। यह वाइल्डकार्ड सर्टिफिकेट था जिसके लिए क्रेडेंशियल्स INI फ़ाइल की आवश्यकता होती है जिसमें DigitalOcean से व्यक्तिगत एक्सेस टोकन शामिल होता है।

ध्यान दें कि सार्वजनिक कुंजी प्रमाणपत्र (पहचान प्रमाणपत्र या एसएसएल प्रमाणपत्र के रूप में भी जाना जाता है) समाप्त हो जाता है और नवीकरण की आवश्यकता होती है। इस प्रकार आपको अपने प्रमाणपत्र को समय-समय पर (पुन: व्यवस्थित) आधार पर नवीनीकृत करना होगा। सर्टिफिकेट दस्तावेज में नए सिरे से सर्टिफिकेट शामिल हैं ।

मेरी योजना यह है कि मेरे प्रमाणपत्र की समाप्ति तिथि प्राप्त करने और 30 दिन या उससे कम होने तक नवीनीकरण को चालू करने के लिए ओपनस् कमांड का उपयोग करने के लिए एक स्क्रिप्ट लिखना है। फिर मैं इस स्क्रिप्ट को क्रोन में जोड़ूंगा और इसे प्रति दिन एक बार चलाऊंगा।

यहाँ आपके प्रमाणपत्र की समाप्ति तिथि पढ़ने की आज्ञा है:

root@prod-host:~# /usr/bin/openssl x509 -enddate -noout -in path-to-certificate-pem-file
notAfter=May 25 19:24:12 2019 GMT
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.