सवाल Chrome 58 में काम करता है जो openssl के साथ एक स्व-हस्ताक्षरित प्रमाणपत्र उत्पन्न करना


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

इसके बजाय इसे उपयोग करने की आवश्यकता है Subject Alt Name। मैं पहले इस मार्गदर्शिका का पालन कर रहा हूं कि एक स्व-हस्ताक्षरित प्रमाण कैसे उत्पन्न करें: https://devcenter.heroku.com/articles/ssl-certificate-self जो बहुत अच्छा काम करता था क्योंकि मुझे इसकी आवश्यकता थी 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

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

हालांकि, इसके बाद भी मुझे मिलता है ERR_CERT_COMMON_NAME_INVALID क्रोम 58 में।


39
2018-04-21 13:50


मूल




जवाब:


मेरा समाधान:

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

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


49
2018-04-21 15:55



सबहेल का बहुत अच्छा उपयोग। मुझे लगता है कि आप इसे थोड़ा सा सरल बना सकते हैं: -config <(cat /System/Library/OpenSSL/openssl.cnf ; printf '[SAN]\nsubjectAltName=DNS:dev.mycompany.com') - jrwren
अब मुझे विषय Alt नाम त्रुटि नहीं मिली है, लेकिन अब मुझे सामान्य नाम के बारे में एक त्रुटि मिलती है, और डाउनलोड किए गए प्रमाण को "हमेशा विश्वास" पर सेट करना काम नहीं करता है। कोई विचार? @bcardarella - rugbert
क्रोम 59 पर अपडेट के साथ, प्रमाणपत्र इस तरह की एक त्रुटि दिखाता है: साइट की प्रमाणपत्र श्रृंखला (नेट :: ERR_CERT_COMMON_NAME_INVALID) के साथ समस्याएं हैं। - theHarsh
मैं बदल गया dev.company.name सेवा मेरे localhost और यह स्थानीयहोस्ट से स्थानीय विकास स्थल की सेवा के लिए काम किया। मैकोज़ पर मुझे भी कीचैन में प्रमाणपत्र जोड़ना पड़ा और एसएसएल को "हमेशा ट्रस्ट" में सेट करना पड़ा। - Daniel M.
यह अब तक का सबसे सरल समाधान है और एसएसएलओफ़ोन के साथ घूमने की आवश्यकता नहीं है या सीए स्थापित नहीं करता है। - bp.


विंडोज़ में, इस स्क्रिप्ट को अपने एसएसएल फ़ोल्डर में 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

10
2018-05-18 18:30





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

सीए कुंजी और प्रमाण बनाएँ

# 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'

तुम सब हो गए हो! 

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

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

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

डेबियन / अपाचे 2.4 + डेबियन / क्रोमियम 59 पर परीक्षण किया गया

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


9
2017-08-10 00:53



एक रूट सीए प्राधिकरण के मार्ग पर जाकर जो बाद में व्यक्तिगत चेतावनियों पर हस्ताक्षर करता है वह एकमात्र तरीका है जिसे मैं पूरी तरह प्रमाणित करने के लिए क्रोम प्राप्त कर सकता हूं; यह भी लाभ है कि मुझे केवल एक प्रमाण स्थापित करने के लिए लोगों को प्राप्त करने की आवश्यकता है। धन्यवाद - geoff
क्या कोई मुझे बता सकता है कि इस क्षेत्र में हर कोई इस तरह के बैशिस का उपयोग क्यों करता है -config <( cat server_rootCA.csr.cnf ) बस के बजाय -config server_rootCA.csr.cnf? - Caesar


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

सबसे पहले, एक तरफ के रूप में, OpenSSL किसी भी विशिष्ट नाम मानों को अनदेखा करने के लिए डिफ़ॉल्ट है आप कॉन्फ़िगरेशन में प्रदान करते हैं। यदि आप उनका उपयोग करना चाहते हैं तो आपको जोड़ना होगा 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
         ...

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

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

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

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

वैकल्पिक रूप से, आप इसका उपयोग कर सकते हैं -x509 के लिए तर्क req उत्पन्न करने के लिए आदेश पहले एक बनाने के बजाय, एक ही कमांड में एक स्व-हस्ताक्षरित प्रमाणपत्र अनुरोध और फिर एक प्रमाणपत्र। इस मामले में इसे हटाने के लिए आवश्यक नहीं है [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

3
2018-02-02 01:28





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

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

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


2
2018-04-23 22:36





कॉन्फ़िगर के साथ बैश स्क्रिप्ट

एक शेल स्क्रिप्ट के रूप में जो बैश के साथ प्लेटफॉर्म पर काम करना चाहिए। मान लिया गया है HOSTNAME खोल के लिए env सेट करें या अपने चयन का होस्टनाम प्रदान करें, उदा। 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"

उपर्युक्त कम से कम कम से कम इंजेक्ट करता है कम से कम विन्यास फाइल जानकारी openssl जरूरत है।

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

श्रेय

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

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

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

परीक्षा

परीक्षण करने के लिए, आयात करने के लिए 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

1
2017-08-28 14:32