ใบรับรอง SSL ที่ลงนามด้วยตนเองไม่ถูกต้อง -“ Subject Alternative Name Missing”


99

เมื่อเร็ว ๆ นี้ Chrome หยุดทำงานกับใบรับรอง SSL ที่ลงนามด้วยตนเองของฉันและคิดว่าไม่ปลอดภัย เมื่อฉันดูใบรับรองในDevTools | Securityแท็บฉันจะเห็นว่ามันระบุ

Subject Alternative Name ขาดใบรับรองสำหรับไซต์นี้ไม่มีส่วนขยาย Subject Alternative Name ที่มีชื่อโดเมนหรือที่อยู่ IP

ข้อผิดพลาดของใบรับรองมีปัญหากับห่วงโซ่ใบรับรองของไซต์ (net :: ERR_CERT_COMMON_NAME_INVALID)

ฉันจะแก้ไขปัญหานี้ได้อย่างไร?


34
คำถามนี้ไม่ใช่คำถามเกี่ยวกับการเขียนโปรแกรมได้อย่างไร ..... เกี่ยวกับใบรับรองการลงนามด้วยตนเองซึ่งเป็นส่วนหนึ่งของการสร้างกองของคุณ ,,, ขอบคุณ Brad
Sweet Chilly Philly

2
CN=www.example.comอาจจะผิด ชื่อโฮสต์จะอยู่ในSANเสมอ หากมีอยู่ในCNก็จะต้องมีอยู่ในSANด้วย (คุณต้องแสดงรายการสองครั้งในกรณีนี้) สำหรับกฎและเหตุผลเพิ่มเติมโปรดดูที่คุณลงนามคำขอลงนามใบรับรองกับผู้ออกใบรับรองของคุณได้อย่างไรและจะสร้างใบรับรองที่ลงนามด้วยตนเองด้วย openssl ได้อย่างไร นอกจากนี้คุณจะต้องวางใบรับรองที่ลงนามด้วยตนเองในที่เก็บความน่าเชื่อถือที่เหมาะสม
jww

@jww - คำถามนี้ไม่ซ้ำกันเนื่องจากคุณไม่ต้องสร้างใบรับรองโดยใช้ openssl คุณสามารถสร้างได้ด้วยเครื่องมืออื่น ๆ
Brad Parks

1
@BradParks - อืม ... คำถามถูกแท็ก OpenSSL และคำตอบที่ยอมรับใช้ OpenSSL ฉันเปิดใหม่และลบแท็ก OpenSSL
jww

คำตอบ:


104

ในการแก้ไขปัญหานี้คุณต้องระบุพารามิเตอร์เพิ่มเติมopensslเมื่อคุณสร้างใบรับรองโดยพื้นฐานแล้ว

-sha256 -extfile v3.ext

v3.extไฟล์อยู่ที่ไหนโดย%%DOMAIN%%แทนที่ด้วยชื่อเดียวกับที่คุณใช้เป็นCommon Nameไฟล์. ข้อมูลเพิ่มเติมที่นี่และมากกว่าที่นี่ โปรดทราบว่าโดยทั่วไปคุณจะตั้งค่าCommon Nameและ%%DOMAIN%%เป็นโดเมนที่คุณพยายามสร้างใบรับรอง ถ้าเป็นwww.mysupersite.comเช่นนั้นคุณจะใช้ทั้งสองอย่าง

v3.ext

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

[alt_names]
DNS.1 = %%DOMAIN%%

หมายเหตุ: สคริปต์ที่แก้ไขปัญหานี้และสร้างใบรับรอง ssl ที่เชื่อถือได้สำหรับใช้ใน Chrome, Safari และจากไคลเอนต์ Java สามารถพบได้ที่นี่

หมายเหตุอีกประการหนึ่ง : หากสิ่งที่คุณพยายามทำคือหยุด Chrome ไม่ให้เกิดข้อผิดพลาดเมื่อดูใบรับรองที่ลงนามด้วยตนเองคุณสามารถบอก Chrome ให้ละเว้นข้อผิดพลาด SSL ทั้งหมดสำหรับทุกไซต์ได้โดยเริ่มต้นด้วยตัวเลือกบรรทัดคำสั่งพิเศษตามรายละเอียดที่นี่ บน SuperUser


2
ไม่แน่ใจว่าคุณกำลังใช้ XAMPP เวอร์ชันใดอยู่ แต่หากคุณมองหาบรรทัดในไฟล์ที่มี "openssl x509" คุณควรจะเพิ่มด้านบนที่ท้ายบรรทัดนั้นในไฟล์ได้ ตัวอย่างเช่นmakecert.batเวอร์ชันนี้มีอยู่ในบรรทัดที่ 9 และจะลงเอยด้วย: bin\openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365 -sha256 -extfile v3.ext. แน่นอนคุณยังคงต้องบันทึกv3.ext ลงในไฟล์ในโฟลเดอร์เดียวกัน
Brad Parks

1
ฉันเลิกใช้ Chrome หลังจากลองทุกอย่างและใช้เบราว์เซอร์อื่นต่อ ไม่กี่วันต่อมาวันนี้ฉันตรวจสอบด้วย chrome และใช้งานได้ !!! Chrome อาจมีข้อบกพร่องและได้แก้ไขแล้ว วิธีการของคุณสำหรับ Subject Alternative Name หายไปได้ผล !!!! เพียงเพิ่มใบรับรองภายใต้ใบรับรองหลักที่เชื่อถือได้ในเบราว์เซอร์
Tarik

37
unknown option -extfileฉันได้รับ ฉันจะแก้ไขปัญหานี้ได้อย่างไร
Nick Manning

2
@NickManning - บางทีคุณอาจใช้extfileคำสั่งในคำสั่ง openssl ที่ไม่ถูกต้อง? แทนที่จะใช้ในopenssl req -new ...นั้นจะใช้ในopenssl x509 -req .... อย่างน้อยนั่นคือสิ่งที่ใครบางคนพูดในที่นี้ซึ่งดูเหมือนจะเป็นจริงจากตัวอย่างที่ฉันมีในคำตอบอื่นสำหรับคำถามที่คล้ายกันว่าจะสร้างใบรับรองเหล่านี้ได้อย่างไร
Brad Parks

2
"จัดหาพารามิเตอร์เพิ่มเติมให้กับ openssl" สำหรับคำสั่งใดโดยเฉพาะ มีหลายขั้นตอนที่เกี่ยวข้องและคำตอบนี้คลุมเครือเกินไป: ibm.com/support/knowledgecenter/th/SSWHYP_4.0.0/…
user145400

35

วิธีแก้ปัญหาต่อไปนี้ใช้ได้ผลกับฉันใน chrome 65 ( อ้างอิง ) -

สร้างไฟล์กำหนดค่า 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

สร้างใบรับรองที่อ้างถึงไฟล์กำหนดค่านี้

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

2
นี่มันเยี่ยมมาก! สิ่งที่ฉันต้องการและมันข้ามการแจ้งเตือนที่น่ารำคาญสำหรับสิ่งต่างๆเช่นชื่อ บริษัท และรัฐเป็นต้น
coredumperror

2
ฉันลองใช้วิธีแก้ปัญหาทางเลือกอื่น ๆ แต่นี่เป็นวิธีเดียวที่เหมาะกับฉัน ขอบคุณ!!
Mirko

1
คุณสามารถส่งผ่านหัวเรื่องจากบรรทัดคำสั่ง: openssl req ... -subj "/C=US/ST=VA/L=SomeCity/O=MyCompany/CN=www.company.com"
Jaroslav Záruba

คุณนำเข้าสู่ chrome ได้อย่างไร ที่นี่ไม่basicConstraints = CA:trueหายไปเหรอ?
woodz

19

สคริปต์ทุบตี

ฉันสร้างสคริปต์ทุบตีเพื่อให้ง่ายขึ้นในการสร้างใบรับรอง TLS ที่ลงชื่อด้วยตนเองที่ใช้ได้ใน Chrome

ทดสอบChrome 65.xแล้วและยังใช้งานได้ อย่าลืมรีสตาร์ท Chrome หลังจากติดตั้งใบรับรองใหม่

chrome://restart



แหล่งข้อมูลอื่น ๆ

เครื่องมืออื่น (ที่แข็งแกร่งกว่ามาก) ที่ควรค่าแก่การตรวจสอบคือcfsslชุดเครื่องมือของ CloudFlare :


2
คุณควรเพิ่มสคริปต์ที่นี่และอธิบาย
jww

ดูเหมือนสคริปต์ที่ดี แต่สคริปต์ไม่ (โดยตรง) ให้คำตอบที่แท้จริงว่าปัญหาของ OP คืออะไร บางทีอธิบายว่าปัญหาของเขาคืออะไรเช่นกัน
bshea

4

ฉันใช้-subjพารามิเตอร์เพิ่มที่อยู่ IP ของเครื่อง ดังนั้นแก้ไขได้ด้วยคำสั่งเดียวเท่านั้น

sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -sha256 -subj '/CN=my-domain.com/subjectAltName=DNS.1=192.168.0.222/' -keyout my-domain.key -out my-domain.crt

คุณสามารถเพิ่มแอตทริบิวต์อื่น ๆ เช่น C, ST, L, O, OU, emailAddress เพื่อสร้างใบรับรองโดยไม่ได้รับพร้อมท์


3
ไม่ได้ผลสำหรับ ดูเหมือนว่า chrome จะไม่รู้จักSANด้วยวิธีนี้
mononoke

ฉันพบ "ปัญหาในการขอใบรับรอง" บน OpenSSL 1.1.0b โดยใช้คำสั่งนี้
Rick

สำหรับฉัน (Windows) ใช้ไวยากรณ์ที่แตกต่างกันเล็กน้อย: openssl.exe req -x509 -sha256 -newkey rsa:2048 -keyout certificate.key -out certificate.crt -days 365 -nodes -subj "/CN=my.domain.com" -addext "subjectAltName=DNS:my.domain.com" IIS ต้องการ*.pfxรูปแบบ:openssl.exe pkcs12 -export -out certificate.pfx -inkey certificate.key -in certificate.crt
ŠtěpánHavránek

3

ฉันมีปัญหามากมายในการรับใบรับรองที่ลงนามด้วยตนเองซึ่งทำงานบน macos / Chrome ในที่สุดฉันก็พบ Mkcert "เครื่องมือ zero-config ที่เรียบง่ายสำหรับสร้างใบรับรองการพัฒนาที่เชื่อถือได้ในท้องถิ่นพร้อมชื่อที่คุณต้องการ" https://github.com/FiloSottile/mkcert


มันทำงานบน Windows 10 ของฉันใน Chrome ใหม่ด้วย แม้ว่าฉันจะต้องคัดลอกไฟล์. pem จากโฟลเดอร์ Windows \ system32 เริ่มต้นไปยังโฟลเดอร์อื่นเนื่องจาก Nginx ไม่สามารถเข้าถึงโฟลเดอร์นี้ได้
vatavale

2
  • ทำสำเนาการกำหนดค่า OpenSSL ของคุณในโฮมไดเร็กทอรีของคุณ:

    cp /System/Library/OpenSSL/openssl.cnf ~/openssl-temp.cnf
    

    หรือบน Linux:

    cp /etc/ssl/openssl.cnf ~/openssl-temp.cnf
    
  • เพิ่ม Subject Alternative Name ในopenssl-temp.cnfภายใต้[v3_ca]:

    [ v3_ca ]
    subjectAltName = DNS:localhost
    

    แทนที่localhostด้วยโดเมนที่คุณต้องการสร้างใบรับรองนั้น

  • สร้างใบรับรอง:

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
        -config ~/openssl-temp.cnf
        -keyout /path/to/your.key -out /path/to/your.crt
    

จากนั้นคุณสามารถลบ openssl-temp.cnf


1

ฉันสามารถกำจัด (net :: ERR_CERT_AUTHORITY_INVALID) โดยเปลี่ยนค่า DNS.1 ของไฟล์ v3.ext

[alt_names] DNS.1 = domainname.com

เปลี่ยน domainname.com ด้วยโดเมนของคุณเอง


1

นี่เป็นวิธีง่ายๆในการสร้างใบรับรอง IP ที่ Chrome เชื่อถือได้

ไฟล์ ssl.conf ...

[ req ]
default_bits       = 4096
distinguished_name = req_distinguished_name
req_extensions     = req_ext
prompt             = no

[ req_distinguished_name ]
commonName                  = 192.168.1.10

[ req_ext ]
subjectAltName = IP:192.168.1.10

โดยที่ 192.168.1.10 คือ IP เครือข่ายท้องถิ่นที่เราต้องการให้ Chrome ไว้วางใจ

สร้างใบรับรอง:

openssl genrsa -out key1.pem
openssl req -new -key key1.pem -out csr1.pem -config ssl.conf
openssl x509 -req -days 9999 -in csr1.pem -signkey key1.pem -out cert1.pem -extensions req_ext -extfile ssl.conf
rm csr1.pem

ใน Windows นำเข้าใบรับรองไปยัง Trusted Root Certificate Store บนเครื่องไคลเอ็นต์ทั้งหมด บนโทรศัพท์ Android หรือแท็บเล็ตดาวน์โหลดใบรับรองเพื่อติดตั้ง ตอนนี้ Chrome จะเชื่อถือใบรับรองบน ​​windows และ Android

ในกล่อง dev windows สถานที่ที่ดีที่สุดในการรับ openssl.exe คือจาก "c: \ Program Files \ Git \ usr \ bin \ openssl.exe"


0

บนMAC ที่ เริ่มจาก chrome เวอร์ชัน 67.0.3396.99 ใบรับรองที่ลงนามด้วยตนเองของฉันหยุดทำงาน

การสร้างใหม่ด้วยสิ่งที่เขียนไว้ที่นี่ไม่ได้ผล

อัปเดต

มีโอกาสยืนยันว่าแนวทางของฉันใช้ได้ผลในวันนี้ :) หากไม่ได้ผลให้ตรวจสอบว่าคุณกำลังใช้แนวทางนี้

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

[alt_names]
DNS.1 = <specify-the-same-common-name-that-you-used-while-generating-csr-in-the-last-step>
$

คัดลอกมาที่นี่ https://ksearch.wordpress.com/2017/08/22/generate-and-import-a-self-signed-ssl-certificate-on-mac-osx-sierra/

สิ้นสุดการอัปเดต

ในที่สุดก็สามารถที่จะเห็นสีเขียวที่ปลอดภัยเท่านั้นเมื่อถอดออกใบรับรองของฉันจากระบบและเพิ่มความมันให้กับท้องถิ่นพวงกุญแจ (ถ้ามี - วางไว้ก่อน) ไม่แน่ใจว่าตรงกันหรือไม่ แต่ในกรณีของฉันฉันดาวน์โหลดใบรับรองผ่าน chrome และตรวจสอบแล้วว่าวันที่สร้างคือวันนี้ดังนั้นจึงเป็นวันที่ฉันเพิ่งสร้างขึ้น

หวังว่าจะเป็นประโยชน์สำหรับใครบางคนที่ใช้เวลาอย่างนั้น 1 วัน

ไม่เคยอัปเดต Chrome!


0

หากคุณต้องการเรียกใช้เซิร์ฟเวอร์ localhost ของคุณคุณต้องตั้งค่าCN = localhostและDNS.1 = localhost.

[req]
default_bits = 2048
default_md = sha256
distinguished_name = req_distinguished_name
prompt = no
prompt = no
x509_extensions = v3_req

[req_distinguished_name]
C = BR
CN = localhost
emailAddress=contact@example.com
L = Sao Paulo
O = example.com
OU = example.com
ST = Sao Paulo

[v3_req]
authorityKeyIdentifier = keyid, issuer
basicConstraints = CA:FALSE
extendedKeyUsage = serverAuth
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = localhost
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.