1. Using the x509 module
openssl x509 ...
...
2 Using the ca module
openssl ca ...
...
आप उन आदेशों की प्रस्तावना को याद कर रहे हैं।
यह दो-चरणीय प्रक्रिया है। सबसे पहले आप अपना CA सेट करते हैं, और फिर आप एक अंतिम इकाई प्रमाणपत्र (उर्फ सर्वर या उपयोगकर्ता) पर हस्ताक्षर करते हैं। दोनों आदेशों के दोनों एक में दो चरणों को समाप्त करते हैं। और दोनों मान लेते हैं कि आपके पास एक OpenSSL कॉन्फ़िगरेशन फ़ाइल है जो पहले से ही CA और सर्वर (अंतिम निकाय) प्रमाणपत्र दोनों के लिए सेटअप है।
सबसे पहले, एक बुनियादी विन्यास फाइल बनाएँ :
$ touch openssl-ca.cnf
फिर, इसमें निम्नलिखित जोड़ें:
HOME = .
RANDFILE = $ENV::HOME/.rnd
####################################################################
[ ca ]
default_ca = CA_default # The default ca section
[ CA_default ]
default_days = 1000 # How long to certify for
default_crl_days = 30 # How long before next CRL
default_md = sha256 # Use public key default MD
preserve = no # Keep passed DN ordering
x509_extensions = ca_extensions # The extensions to add to the cert
email_in_dn = no # Don't concat the email in the DN
copy_extensions = copy # Required to copy SANs from CSR to cert
####################################################################
[ req ]
default_bits = 4096
default_keyfile = cakey.pem
distinguished_name = ca_distinguished_name
x509_extensions = ca_extensions
string_mask = utf8only
####################################################################
[ ca_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = Maryland
localityName = Locality Name (eg, city)
localityName_default = Baltimore
organizationName = Organization Name (eg, company)
organizationName_default = Test CA, Limited
organizationalUnitName = Organizational Unit (eg, division)
organizationalUnitName_default = Server Research Department
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = Test CA
emailAddress = Email Address
emailAddress_default = test@example.com
####################################################################
[ ca_extensions ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always, issuer
basicConstraints = critical, CA:true
keyUsage = keyCertSign, cRLSign
उपरोक्त फ़ील्ड अधिक जटिल से ली गई हैं openssl.cnf
(आप इसे पा सकते हैं /usr/lib/openssl.cnf
), लेकिन मुझे लगता है कि वे सीए प्रमाण पत्र और निजी कुंजी बनाने के लिए आवश्यक हैं।
अपने स्वाद के अनुरूप ऊपर के खेतों को मोड़ें। कॉन्फ़िगरेशन फ़ाइल और कमांड विकल्पों के साथ प्रयोग करते समय चूक आपको उसी जानकारी को दर्ज करने से बचाती हैं।
मैंने CRL- प्रासंगिक सामान को छोड़ दिया है, लेकिन आपके CA के संचालन में उन्हें होना चाहिए। देखें openssl.cnf
और संबंधित crl_ext
अनुभाग।
फिर, निम्नलिखित निष्पादित करें। -nodes
पासवर्ड या पदबंध को छोड़ देता है ताकि आप प्रमाण पत्र की जांच कर सकते हैं। पासवर्ड या पासफ़्रेज़ को छोड़ना वास्तव में एक बुरा विचार है।
$ openssl req -x509 -config openssl-ca.cnf -newkey rsa:4096 -sha256 -nodes -out cacert.pem -outform PEM
कमांड निष्पादित होने के बाद, cacert.pem
CA संचालन के लिए आपका प्रमाण पत्र cakey.pem
होगा , और निजी कुंजी होगी। निजी कुंजी याद नहीं करता है एक पासवर्ड या पदबंध की है।
आप निम्नलिखित के साथ प्रमाण पत्र को डंप कर सकते हैं।
$ openssl x509 -in cacert.pem -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 11485830970703032316 (0x9f65de69ceef2ffc)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, ST=MD, L=Baltimore, CN=Test CA/emailAddress=test@example.com
Validity
Not Before: Jan 24 14:24:11 2014 GMT
Not After : Feb 23 14:24:11 2014 GMT
Subject: C=US, ST=MD, L=Baltimore, CN=Test CA/emailAddress=test@example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
00:b1:7f:29:be:78:02:b8:56:54:2d:2c:ec:ff:6d:
...
39:f9:1e:52:cb:8e:bf:8b:9e:a6:93:e1:22:09:8b:
59:05:9f
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
4A:9A:F3:10:9E:D7:CF:54:79:DE:46:75:7A:B0:D0:C1:0F:CF:C1:8A
X509v3 Authority Key Identifier:
keyid:4A:9A:F3:10:9E:D7:CF:54:79:DE:46:75:7A:B0:D0:C1:0F:CF:C1:8A
X509v3 Basic Constraints: critical
CA:TRUE
X509v3 Key Usage:
Certificate Sign, CRL Sign
Signature Algorithm: sha256WithRSAEncryption
4a:6f:1f:ac:fd:fb:1e:a4:6d:08:eb:f5:af:f6:1e:48:a5:c7:
...
cd:c6:ac:30:f9:15:83:41:c1:d1:20:fa:85:e7:4f:35:8f:b5:
38:ff:fd:55:68:2c:3e:37
और निम्नलिखित के साथ अपने उद्देश्य का परीक्षण करें (के बारे में चिंता न करें Any Purpose: Yes
; "महत्वपूर्ण, CA: FALSE" देखें लेकिन "कोई भी उद्देश्य CA: हाँ" )।
$ openssl x509 -purpose -in cacert.pem -inform PEM
Certificate purposes:
SSL client : No
SSL client CA : Yes
SSL server : No
SSL server CA : Yes
Netscape SSL server : No
Netscape SSL server CA : Yes
S/MIME signing : No
S/MIME signing CA : Yes
S/MIME encryption : No
S/MIME encryption CA : Yes
CRL signing : Yes
CRL signing CA : Yes
Any Purpose : Yes
Any Purpose CA : Yes
OCSP helper : Yes
OCSP helper CA : Yes
Time Stamp signing : No
Time Stamp signing CA : Yes
-----BEGIN CERTIFICATE-----
MIIFpTCCA42gAwIBAgIJAJ9l3mnO7y/8MA0GCSqGSIb3DQEBCwUAMGExCzAJBgNV
...
aQUtFrV4hpmJUaQZ7ySr/RjCb4KYkQpTkOtKJOU1Ic3GrDD5FYNBwdEg+oXnTzWP
tTj//VVoLD43
-----END CERTIFICATE-----
भाग दो के लिए, मैं एक और विन्यास फाइल बनाने जा रहा हूँ जो आसानी से पचने योग्य है। सबसे पहले, (आप उपयोगकर्ता प्रमाण पत्र भी के लिए इनमें से किसी एक कर सकते हैं)।touch
openssl-server.cnf
$ touch openssl-server.cnf
फिर इसे खोलें, और निम्नलिखित जोड़ें।
HOME = .
RANDFILE = $ENV::HOME/.rnd
####################################################################
[ req ]
default_bits = 2048
default_keyfile = serverkey.pem
distinguished_name = server_distinguished_name
req_extensions = server_req_extensions
string_mask = utf8only
####################################################################
[ server_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = US
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = MD
localityName = Locality Name (eg, city)
localityName_default = Baltimore
organizationName = Organization Name (eg, company)
organizationName_default = Test Server, Limited
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_default = Test Server
emailAddress = Email Address
emailAddress_default = test@example.com
####################################################################
[ server_req_extensions ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
####################################################################
[ alternate_names ]
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = mail.example.com
DNS.4 = ftp.example.com
यदि आप विकास कर रहे हैं और सर्वर के रूप में अपने कार्य केंद्र का उपयोग करने की आवश्यकता है, तो आपको क्रोम के लिए निम्न कार्य करने की आवश्यकता हो सकती है। अन्यथा Chrome को एक सामान्य नाम अमान्य है ( ERR_CERT_COMMON_NAME_INVALID
) की शिकायत हो सकती है । मुझे यकीन नहीं है कि इस संबंध में आईपी पते के बीच क्या संबंध है SAN और इस उदाहरण में एक सीएन।
# IPv4 localhost
IP.1 = 127.0.0.1
# IPv6 localhost
IP.2 = ::1
फिर, सर्वर प्रमाणपत्र अनुरोध बनाएँ। अवश्य छोड़ें -x509
*। जोड़ने -x509
से एक प्रमाण पत्र बन जाएगा, और एक अनुरोध नहीं होगा।
$ openssl req -config openssl-server.cnf -newkey rsa:2048 -sha256 -nodes -out servercert.csr -outform PEM
यह कमांड निष्पादित होने के बाद, आपके पास एक अनुरोध होगा servercert.csr
और एक निजी कुंजी होगी serverkey.pem
।
और आप फिर से इसका निरीक्षण कर सकते हैं।
$ openssl req -text -noout -verify -in servercert.csr
Certificate:
verify OK
Certificate Request:
Version: 0 (0x0)
Subject: C=US, ST=MD, L=Baltimore, CN=Test Server/emailAddress=test@example.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:ce:3d:58:7f:a0:59:92:aa:7c:a0:82:dc:c9:6d:
...
f9:5e:0c:ba:84:eb:27:0d:d9:e7:22:5d:fe:e5:51:
86:e1
Exponent: 65537 (0x10001)
Attributes:
Requested Extensions:
X509v3 Subject Key Identifier:
1F:09:EF:79:9A:73:36:C1:80:52:60:2D:03:53:C7:B6:BD:63:3B:61
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Key Encipherment
X509v3 Subject Alternative Name:
DNS:example.com, DNS:www.example.com, DNS:mail.example.com, DNS:ftp.example.com
Netscape Comment:
OpenSSL Generated Certificate
Signature Algorithm: sha256WithRSAEncryption
6d:e8:d3:85:b3:88:d4:1a:80:9e:67:0d:37:46:db:4d:9a:81:
...
76:6a:22:0a:41:45:1f:e2:d6:e4:8f:a1:ca:de:e5:69:98:88:
a9:63:d0:a7
अगला, आपको इसे अपने सीए के साथ हस्ताक्षर करना होगा।
आप अपने सीए द्वारा सर्वर के प्रमाण पत्र पर हस्ताक्षर करने के लिए लगभग तैयार हैं। openssl-ca.cnf
आदेश जारी करने से पहले सीए को दो और खंडों की आवश्यकता होती है।
सबसे पहले, openssl-ca.cnf
निम्न दो खंडों को खोलें और जोड़ें।
####################################################################
[ signing_policy ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
####################################################################
[ signing_req ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
दूसरा, निम्नलिखित को [ CA_default ]
सेक्शन में जोड़ें openssl-ca.cnf
। मैंने उन्हें पहले छोड़ दिया, क्योंकि वे चीजों को जटिल कर सकते हैं (वे उस समय अप्रयुक्त थे)। अब आप देखेंगे कि उनका उपयोग कैसे किया जाता है, इसलिए उम्मीद है कि वे समझेंगे।
base_dir = .
certificate = $base_dir/cacert.pem # The CA certifcate
private_key = $base_dir/cakey.pem # The CA private key
new_certs_dir = $base_dir # Location for new certs after signing
database = $base_dir/index.txt # Database index file
serial = $base_dir/serial.txt # The current serial number
unique_subject = no # Set to 'no' to allow creation of
# several certificates with same subject.
तीसरा, स्पर्श index.txt
और serial.txt
:
$ touch index.txt
$ echo '01' > serial.txt
फिर, निम्नलिखित कार्य करें:
$ openssl ca -config openssl-ca.cnf -policy signing_policy -extensions signing_req -out servercert.pem -infiles servercert.csr
आपको निम्नलिखित के समान दिखना चाहिए:
Using configuration from openssl-ca.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName :PRINTABLE:'US'
stateOrProvinceName :ASN.1 12:'MD'
localityName :ASN.1 12:'Baltimore'
commonName :ASN.1 12:'Test CA'
emailAddress :IA5STRING:'test@example.com'
Certificate is to be certified until Oct 20 16:12:39 2016 GMT (1000 days)
Sign the certificate? [y/n]:Y
1 out of 1 certificate requests certified, commit? [y/n]Y
Write out database with 1 new entries
Data Base Updated
कमांड निष्पादित होने के बाद, आपके पास एक नया खनन सर्वर प्रमाणपत्र होगा servercert.pem
। निजी कुंजी पहले बनाई गई थी और इसमें उपलब्ध है serverkey.pem
।
अंत में, आप निम्नलिखित के साथ अपने ताजा खनन प्रमाण पत्र का निरीक्षण कर सकते हैं:
$ openssl x509 -in servercert.pem -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 9 (0x9)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=US, ST=MD, L=Baltimore, CN=Test CA/emailAddress=test@example.com
Validity
Not Before: Jan 24 19:07:36 2014 GMT
Not After : Oct 20 19:07:36 2016 GMT
Subject: C=US, ST=MD, L=Baltimore, CN=Test Server
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
00:ce:3d:58:7f:a0:59:92:aa:7c:a0:82:dc:c9:6d:
...
f9:5e:0c:ba:84:eb:27:0d:d9:e7:22:5d:fe:e5:51:
86:e1
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Subject Key Identifier:
1F:09:EF:79:9A:73:36:C1:80:52:60:2D:03:53:C7:B6:BD:63:3B:61
X509v3 Authority Key Identifier:
keyid:42:15:F2:CA:9C:B1:BB:F5:4C:2C:66:27:DA:6D:2E:5F:BA:0F:C5:9E
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Key Encipherment
X509v3 Subject Alternative Name:
DNS:example.com, DNS:www.example.com, DNS:mail.example.com, DNS:ftp.example.com
Netscape Comment:
OpenSSL Generated Certificate
Signature Algorithm: sha256WithRSAEncryption
b1:40:f6:34:f4:38:c8:57:d4:b6:08:f7:e2:71:12:6b:0e:4a:
...
45:71:06:a9:86:b6:0f:6d:8d:e1:c5:97:8d:fd:59:43:e9:3c:
56:a5:eb:c8:7e:9f:6b:7a
इससे पहले, आप के लिए निम्नलिखित जोड़ा CA_default
: copy_extensions = copy
। यह प्रतिलिपि अनुरोध करने वाले व्यक्ति द्वारा प्रदान की गई एक्सटेंशन है।
यदि आप छोड़ देते हैं copy_extensions = copy
, तो आपके सर्वर प्रमाणपत्र में विषय वैकल्पिक नाम (SAN) www.example.com
और जैसे की कमी होगी mail.example.com
।
यदि आप उपयोग करते हैं copy_extensions = copy
, लेकिन अनुरोध पर विचार नहीं करते हैं, तो अनुरोधकर्ता आपको एक अधीनस्थ रूट (सर्वर या उपयोगकर्ता प्रमाणपत्र के बजाय) पर हस्ताक्षर करने में सक्षम कर सकता है। जिसका अर्थ है कि वह आपके विश्वसनीय रूट पर वापस उस प्रमाण पत्र को प्रमाणित करने में सक्षम होगा। openssl req -verify
हस्ताक्षर करने से पहले अनुरोध को सत्यापित करना सुनिश्चित करें ।
यदि आप इसे छोड़ देते हैं unique_subject
या इसे सेट करते हैं yes
, तो आपको केवल विषय के विशिष्ट नाम के तहत एक प्रमाण पत्र बनाने की अनुमति होगी ।
unique_subject = yes # Set to 'no' to allow creation of
# several ctificates with same subject.
प्रयोग करते समय दूसरा प्रमाण पत्र बनाने की कोशिश करने के परिणामस्वरूप सीए के निजी कुंजी के साथ अपने सर्वर के प्रमाण पत्र पर हस्ताक्षर करते समय निम्नलिखित परिणाम होंगे:
Sign the certificate? [y/n]:Y
failed to update database
TXT_DB error number 2
तो unique_subject = no
परीक्षण के लिए एकदम सही है।
यदि आप यह सुनिश्चित करना चाहते हैं कि संगठनात्मक नाम स्व-हस्ताक्षरित सीए, अधीनस्थ सीए और एंड-एंटिटी प्रमाणपत्रों के बीच संगत है , तो अपनी सीए कॉन्फ़िगरेशन फ़ाइलों में निम्न जोड़ें:
[ policy_match ]
organizationName = match
यदि आप संगठनात्मक नाम बदलने की अनुमति देना चाहते हैं, तो उपयोग करें:
[ policy_match ]
organizationName = supplied
X.509 / PKIX प्रमाणपत्र में DNS नामों की हैंडलिंग से संबंधित अन्य नियम हैं। नियमों के लिए इन दस्तावेजों का संदर्भ लें:
RFC 6797 और RFC 7469 सूचीबद्ध हैं, क्योंकि वे अन्य RFC और CA / B दस्तावेजों की तुलना में अधिक प्रतिबंधात्मक हैं। RFC के 6797 और 7469 IP पते की अनुमति नहीं देते हैं, या तो।