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


52

Chrome 58 के रूप में यह अब स्व-हस्ताक्षरित समारोहों को स्वीकार नहीं करता है जो इस पर निर्भर करते हैं Common Name: https://productforums.google.com/forum/# .topic/chrome/zVo3M8CgKzQ;context-place=topicsin/chrome/category $ 3ACanary% 7Cort: प्रासंगिकता% 7Cspell: झूठे

इसके बजाय इसका उपयोग करने की आवश्यकता है Subject Alt Name। मैं पहले से ही एक स्व-हस्ताक्षरित प्रमाण पत्र बनाने के तरीके के बारे में इस गाइड का अनुसरण कर रहा हूं: https://devcenter.heroku.com/articles/ssl-cert सर्टिफिकेट- खुद जो महान काम करता है क्योंकि मुझे जो चाहिए उसके लिए server.crtऔर server.keyफाइलों की आवश्यकता थी । मुझे अब ऐसे नए सिरे उत्पन्न करने की आवश्यकता है, जिनमें SANक्रोम 58 के साथ काम न करने के मेरे सभी प्रयास शामिल हैं।

यहाँ मैंने क्या किया है:

मैंने कुंजी बनाने के लिए उपर्युक्त हरोकू लेख के चरणों का पालन किया। मैंने तब एक नई ओपनएसएसएल विन्यास फाइल लिखी:

[ req ]
default_bits        = 2048
distinguished_name  = req_distinguished_name
req_extensions      = san
extensions          = san
[ req_distinguished_name ]
countryName         = US
stateOrProvinceName = Massachusetts
localityName        = Boston
organizationName    = MyCompany
[ san ]
subjectAltName      = DNS:dev.mycompany.com

फिर server.crtनिम्नलिखित कमांड के साथ उत्पन्न :

openssl req \
-new \
-key server.key \
-out server.csr \
-config config.cnf \
-sha256 \
-days 3650

मैं मैक पर हूं, इसलिए मैंने server.crtकिचेन के साथ फाइल खोली , इसे अपने सिस्टम सर्टिफिकेट में जोड़ा। मैंने फिर उसे सेट किया Always Trust

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

हालाँकि, इसके बाद भी मुझे ERR_CERT_COMMON_NAME_INVALIDChrome 58 में मिला।

जवाबों:


62

मेरा समाधान:

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

स्थिति: मेरे लिए काम करता है


2
उपधारा का महान उपयोग। मुझे लगता है कि आप इसे थोड़ा सरल कर सकते हैं:-config <(cat /System/Library/OpenSSL/openssl.cnf ; printf '[SAN]\nsubjectAltName=DNS:dev.mycompany.com')
jrwren

1
मुझे अब विषय Alt नाम त्रुटि नहीं मिलती है, लेकिन अब मुझे सामान्य नाम के बारे में एक त्रुटि मिलती है, और डाउनलोड किए गए प्रमाणपत्र को "हमेशा विश्वास" करने के लिए काम नहीं करता है। कोई विचार? @bcardarella
रग्बर्ट

2
Chrome 59 के अपडेट के साथ, प्रमाणपत्र इस तरह से एक त्रुटि दिखाता है: साइट की प्रमाणपत्र श्रृंखला (शुद्ध :: ERR_CERT_COMMON_NAME_INVALID) के साथ समस्याएँ हैं।
हर्ष

1
मैं बदल dev.company.nameगया localhostऔर इसने लोकलहोस्ट से लोकल डेवलपमेंट साइट परोसने का काम किया। MacOS पर मुझे कीचेन के साथ प्रमाणपत्र भी जोड़ना था और SSL को "ऑलवेज ट्रस्ट" पर सेट करना था।
डैनियल एम।

1
यह अब तक का सबसे सरल उपाय है और इसे sslconf के साथ खराब करने या CA स्थापित करने की आवश्यकता नहीं है।
बी.पी.

16

Windows में, इस स्क्रिप्ट को अपने SSL फ़ोल्डर में makeCERT.bat के रूप में सहेजें। यह इन फ़ाइलों को बनाएगा: example.cnf, example.crt, example.key

@echo off

REM IN YOUR SSL FOLDER, SAVE THIS FILE AS: makeCERT.bat
REM AT COMMAND LINE IN YOUR SSL FOLDER, RUN: makecert
REM IT WILL CREATE THESE FILES: example.cnf, example.crt, example.key
REM IMPORT THE .crt FILE INTO CHROME Trusted Root Certification Authorities
REM REMEMBER TO RESTART APACHE OR NGINX AFTER YOU CONFIGURE FOR THESE FILES

REM PLEASE UPDATE THE FOLLOWING VARIABLES FOR YOUR NEEDS.
SET HOSTNAME=example
SET DOT=com
SET COUNTRY=US
SET STATE=KS
SET CITY=Olathe
SET ORGANIZATION=IT
SET ORGANIZATION_UNIT=IT Department
SET EMAIL=webmaster@%HOSTNAME%.%DOT%

(
echo [req]
echo default_bits = 2048
echo prompt = no
echo default_md = sha256
echo x509_extensions = v3_req
echo distinguished_name = dn
echo:
echo [dn]
echo C = %COUNTRY%
echo ST = %STATE%
echo L = %CITY%
echo O = %ORGANIZATION%
echo OU = %ORGANIZATION_UNIT%
echo emailAddress = %EMAIL%
echo CN = %HOSTNAME%.%DOT%
echo:
echo [v3_req]
echo subjectAltName = @alt_names
echo:
echo [alt_names]
echo DNS.1 = *.%HOSTNAME%.%DOT%
echo DNS.2 = %HOSTNAME%.%DOT%
)>%HOSTNAME%.cnf

openssl req -new -x509 -newkey rsa:2048 -sha256 -nodes -keyout %HOSTNAME%.key -days 3560 -out %HOSTNAME%.crt -config %HOSTNAME%.cnf

13

यहाँ एक समाधान है जो मेरे लिए काम करता है:

CA कुंजी और प्रमाणपत्र बनाएं

# openssl genrsa -out server_rootCA.key 2048
# openssl req -x509 -new -nodes -key server_rootCA.key -sha256 -days 3650 -out server_rootCA.pem

Server_rootCA.csr.cnf बनाएं

# server_rootCA.csr.cnf
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn

[dn]
C=DE
ST=Berlin
L=NeuKoelln
O=Weisestrasse
OU=local_RootCA
emailAddress=ikke@server.berlin
CN = server.berlin

V3.ext कॉन्फ़िगरेशन फ़ाइल बनाएँ

# v3.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = server.berlin

सर्वर कुंजी बनाएँ

# openssl req -new -sha256 -nodes -out server.csr -newkey rsa:2048 -keyout server.key -config <( cat server_rootCA.csr.cnf )

सर्वर सर्टिफिकेट बनाएं

# openssl x509 -req -in server.csr -CA server_rootCA.pem -CAkey server_rootCA.key -CAcreateserial -out server.crt -days 3650 -sha256 -extfile v3.ext

Apache2 साइट-फ़ाइल, HTTPS (पोर्ट 443) अनुभाग में प्रमाणपत्र और कुंजी जोड़ें

SSLCertificateFile    /etc/apache2/ssl/server.crt
SSLCertificateKeyFile    /etc/apache2/ssl/server.key

Server_rootCA.pem को सर्वर से अपनी मशीन पर कॉपी करें।

# scp you@server.berlin:~/server_rootCA.pem .

.. और इसे क्रोमियम ब्राउज़र में जोड़ें

Chromium -> Setting -> (Advanced) Manage Certificates -> Import -> 'server_rootCA.pem'

आप सब हो गए!

PS एक कार्यात्मक CA और सर्वर प्रमाणित जोड़ी (ऊपर दिए गए निर्देशों के अनुसार) बनाने के बजाय आप बस अपने HTTP सर्वर कॉन्फ़िगरेशन में HSTS हेडर अक्षम कर सकते हैं। यह क्रोमियम को HTTPS को लागू करने से रोकेगा और उपयोगकर्ताओं को आपके कस्टम CA (server_rootCA.pem) प्रमाणपत्र प्राप्त करने और स्थापित करने के लिए बिना "उन्नत → पर अपने .url (असुरक्षित)" पर क्लिक करने की अनुमति देगा। दूसरे शब्दों में - HSTS को निष्क्रिय करने से आपकी साइट को सार्वजनिक रूप से HTTP और / या असुरक्षित HTTPS कनेक्शन (beware!) पर देखा जा सकेगा।

Apache2 के लिए साइट-फ़ाइल, HTTP (पोर्ट 80) अनुभाग में निम्नलिखित जोड़ें

Header unset Strict-Transport-Security
Header always set Strict-Transport-Security "max-age=0;includeSubDomains"

डेबियन / Apache2.4 + डेबियन / क्रोमियम 59 पर परीक्षण किया गया

https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58


एक रूट सीए प्राधिकरण के मार्ग पर जाना जो बाद में व्यक्तिगत सीट्स पर हस्ताक्षर करता है, एकमात्र तरीका है जिससे मुझे पूरी तरह से प्रमाणित करने के लिए क्रोम मिल सकता है; इसका एक फायदा यह भी है कि मुझे केवल एक ही प्रमाणपत्र स्थापित करने के लिए लोगों की आवश्यकता है। धन्यवाद
जियोऑफ

4
क्या कोई मुझे समझा सकता है कि इस क्षेत्र में हर कोई -config <( cat server_rootCA.csr.cnf )बस के बजाय बशमीज़ का उपयोग क्यों करता है -config server_rootCA.csr.cnf?
सीज़र

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

12

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

सबसे पहले, एक तरफ के रूप में, ओपनएसएसएल आपको किसी भी विशिष्ट नाम मान को अनदेखा करने के लिए डिफॉल्ट करता है जो आप कॉन्फ़िगरेशन में प्रदान करते हैं। यदि आप उनका उपयोग करना चाहते हैं तो आपको prompt = no अपने विन्यास में जोड़ना होगा । इसके अतिरिक्त, जैसा कि लिखा गया आदेश केवल एक प्रमाणपत्र अनुरोध बनाता है न कि स्वयं एक प्रमाण पत्र -days

यदि आप इस आदेश का उपयोग करके अपना प्रमाणपत्र अनुरोध उत्पन्न करते हैं और परिणाम का निरीक्षण करते हैं, तो विषय Alt नाम मौजूद है:

$ openssl req -new -key server.key -out server.csr -config config.cnf -sha256
$ openssl req -text -noout -in server.csr
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: C = US, ST = Massachusetts, L = Boston, O = MyCompany
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    ...
                Exponent: 65537 (0x10001)
        Attributes:
        Requested Extensions:
            X509v3 Subject Alternative Name:
                DNS:dev.mycompany.com
    Signature Algorithm: sha256WithRSAEncryption
         ...

लेकिन तब यदि आप heroku लिंक में कमांड का उपयोग करके प्रमाण पत्र उत्पन्न करते हैं और परिणाम का निरीक्षण करते हैं, तो विषय Alt नाम गायब है:

$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
$ openssl x509 -text -noout -in server.crt
Certificate:
    Data:
        Version: 1 (0x0)
        Serial Number:
            89:fd:75:26:43:08:04:61
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, ST = Massachusetts, L = Boston, O = MyCompany
        Validity
            Not Before: Jan 21 04:27:21 2018 GMT
            Not After : Jan 21 04:27:21 2019 GMT
        Subject: C = US, ST = Massachusetts, L = Boston, O = MyCompany
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    ...
                Exponent: 65537 (0x10001)
    Signature Algorithm: sha256WithRSAEncryption
         ...

कारण यह है कि डिफ़ॉल्ट रूप से ओपनएसएसएल प्रमाणपत्र के अनुरोध से एक्सटेंशन की प्रतिलिपि नहीं करता है। आम तौर पर, एक ग्राहक से अनुरोध के आधार पर, CA द्वारा प्रमाण पत्र बनाया / हस्ताक्षरित किया जाएगा, और कुछ एक्सटेंशन CA से अधिक शक्ति प्रदान कर सकते हैं यदि वे अनुरोध में परिभाषित एक्सटेंशन पर आँख बंद करके भरोसा करना चाहते थे।

एक्सटेंशन को कॉपी करने के लिए ओपनएसएसएल को बताने के तरीके हैं, लेकिन जब आप प्रमाण पत्र उत्पन्न करते हैं तो आईएमएचओ एक कॉन्फ़िगरेशन फ़ाइल में एक्सटेंशन प्रदान करने की तुलना में अधिक काम करता है।

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

$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt -extfile config.cnf

वैकल्पिक रूप से, आप पहले एक अनुरोध बनाने और फिर एक प्रमाण पत्र बनाने के बजाय, एक आदेश में एक स्व-हस्ताक्षरित प्रमाण पत्र बनाने के -x509लिए reqआदेश का उपयोग कर सकते हैं । इस मामले में [req]अनुभाग लाइन को हटाना आवश्यक नहीं है , क्योंकि उस खंड को रीड कमांड द्वारा पढ़ा और उपयोग किया जाता है।

$ openssl req -x509 -sha256 -days 365 -key server.key -out server.crt -config config.cnf

पुनर्कथन करने के लिए, ऊपर दी गई कमांड में प्रयुक्त संशोधित विन्यास फाइल है:

default_bits        = 2048
distinguished_name  = dn
x509_extensions     = san
req_extensions      = san
extensions          = san
prompt              = no
[ dn ]
countryName         = US
stateOrProvinceName = Massachusetts
localityName        = Boston
organizationName    = MyCompany
[ san ]
subjectAltName      = DNS:dev.mycompany.com

2
यह एकमात्र स्पष्टीकरण है जिसने मुझे यह समझने में मदद की कि प्रमाण पत्र सैन के बिना क्यों निकला (मेरे मामले में, मुझे कॉन्फ़िगरेशन फ़ाइल में x509_extensions को शामिल करने की आवश्यकता है)
डैनियल

2

मेरा समाधान मुख्य रखने के लिए है openssl.cnfजैसे कि यह है और बस एक नया खंड जोड़ने के लिए जैसे [ cert_www.example.com ]www.example.com वह वेबसाइट है जिसके लिए मैं एक प्रमाण पत्र बनाना चाहता हूं, और इसमें subjectAltNameमुझे आवश्यकता होगी ( और कुछ)। बेशक जो भी आप चाहते हैं उस अनुभाग का नाम दिया जा सकता है।

उसके बाद, मैं openssl reqकमांड को पहले की तरह चला सकता हूं , बस -extensions cert_www.example.comइसकी सामग्री को जोड़ने के -subjलिए जोड़ रहा हूं और मैं सीधे सभी डीएन जानकारी को जोड़ने के लिए जोड़ता हूं ।

इसके निर्माण के बाद और इसके उपयोग से पहले, प्रमाण पत्र सामग्री को सत्यापित करना न भूलें openssl x509 -text


1

अंदर पके हुए विन्यास के साथ बैश स्क्रिप्ट

एक शेल स्क्रिप्ट के रूप में जिसे बैश के साथ प्लेटफार्मों पर काम करना चाहिए। Env HOSTNAMEखोल के लिए सेट या अपने चुनने के एक hostname की आपूर्ति मान लेता है , जैसेself_signed_cert.sh test

set -e

if [ -z "$1" ]; then
  hostname="$HOSTNAME"
else
  hostname="$1"
fi

local_openssl_config="
[ req ]
prompt = no
distinguished_name = req_distinguished_name
x509_extensions = san_self_signed
[ req_distinguished_name ]
CN=$hostname
[ san_self_signed ]
subjectAltName = DNS:$hostname, DNS:localhost
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = CA:true
keyUsage = nonRepudiation, digitalSignature, keyEncipherment, dataEncipherment, keyCertSign, cRLSign
extendedKeyUsage = serverAuth, clientAuth, timeStamping
"

openssl req \
  -newkey rsa:2048 -nodes \
  -keyout "$hostname.key.pem" \
  -x509 -sha256 -days 3650 \
  -config <(echo "$local_openssl_config") \
  -out "$hostname.cert.pem"
openssl x509 -noout -text -in "$hostname.cert.pem"

ऊपर या कम नंगे न्यूनतम विन्यास फाइल की जानकारी को खोलता है।

ध्यान दें, DNS:localhostस्थानीय के रूप में परीक्षण करने की अनुमति देने के लिए एक SAN के रूप में अतिरिक्त शामिल है । यदि आप नहीं चाहते हैं तो स्क्रिप्ट से उस अतिरिक्त बिट को हटा दें।

श्रेय

bcardarella का उत्तर महान है (अपर्याप्त प्रतिनिधि के कारण टिप्पणी / अप-वोट नहीं कर सकता है)। हालाँकि, उत्तर प्लेटफ़ॉर्म विशिष्ट के लिए एक मौजूदा ओप्सनल कॉन्फ़िग फ़ाइल स्थान का उपयोग करता है ... इसलिए:

मेरे लिये कार्य करता है

जाहिर है, किसी को अपने स्वयं के दिए गए प्लेटफ़ॉर्म के लिए ओपनस्फ़्ल कॉन्फिग फ़ाइल ढूंढनी होगी और सही स्थान को बदलना होगा।

परीक्षा

परीक्षण के तरीके के लिए, test.cert.pemक्रोम के अधिकारियों में आयात करें chrome://settings/certificates, और:

openssl s_server -key test.key.pem -cert test.cert.pem -accept 20443 -www &
openssl_pid=$!
google-chrome https://localhost:20443

और परीक्षण के बाद

kill $openssl_pid
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.