Chứng chỉ SSL tự ký không hợp lệ - “Thiếu tên thay thế chủ đề”


96

Gần đây, Chrome đã ngừng hoạt động với chứng chỉ SSL tự ký của tôi và cho rằng chúng không an toàn. Khi tôi nhìn vào chứng chỉ trong DevTools | Securitytab, tôi có thể thấy rằng nó cho biết

Thiếu Tên Thay thế Chủ đề Chứng chỉ cho trang web này không chứa phần mở rộng Tên Thay thế Chủ đề có chứa tên miền hoặc địa chỉ IP.

Lỗi chứng chỉ Có vấn đề với chuỗi chứng chỉ của trang web (net :: ERR_CERT_COMMON_NAME_INVALID).

Làm thế nào tôi có thể sửa lỗi này?


33
. Làm thế nào được đây không phải là một câu hỏi lập trình ..... nó về giấy chứng nhận ký tự mà là một phần của việc tạo ra Ngăn xếp của bạn ,,, Cảm ơn bạn Brad
Ngọt Chilly Philly

1
CN=www.example.comcó lẽ là sai. Tên máy chủ luôn có trong SAN . Nếu nó có trong CN , thì nó cũng phải có trong SAN (bạn phải liệt kê nó hai lần trong trường hợp này). Để biết thêm các quy tắc và lý do, hãy xem Cách bạn ký Yêu cầu ký chứng chỉ với Tổ chức phát hành chứng chỉCách tạo chứng chỉ tự ký với openssl? Bạn cũng sẽ cần đặt chứng chỉ tự ký vào kho tin cậy thích hợp.
jww

@jww - đây không phải là bản sao của câu hỏi đó, vì bạn không phải tạo chứng chỉ bằng openssl, bạn có thể tạo bằng các công cụ khác.
Brad Parks

1
@BradParks - Hmmm ... Câu hỏi đã được gắn thẻ OpenSSL và câu trả lời được chấp nhận sử dụng OpenSSL. Tôi đã mở lại và xóa thẻ OpenSSL.
jww

Câu trả lời:


104

Để khắc phục điều này openssl, về cơ bản , bạn cần cung cấp một tham số bổ sung khi tạo chứng chỉ

-sha256 -extfile v3.ext

đâu v3.extlà một tệp như vậy, được %%DOMAIN%%thay thế bằng cùng tên mà bạn sử dụng với tên của bạn Common Name. Thêm thông tin ở đâyở đây . Lưu ý rằng thông thường bạn sẽ đặt Common Name%%DOMAIN%%cho tên miền mà bạn đang cố gắng tạo chứng chỉ. Vì vậy, nếu có www.mysupersite.com, thì bạn sẽ sử dụng nó cho cả hai.

v3.ext

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

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

Lưu ý: Có thể tìm thấy các tập lệnh giải quyết vấn đề này và tạo chứng chỉ ssl hoàn toàn đáng tin cậy để sử dụng trong Chrome, Safari và từ các ứng dụng khách Java tại đây

Một lưu ý khác : Nếu tất cả những gì bạn đang cố gắng làm là ngăn chrome ném lỗi khi xem chứng chỉ tự ký, bạn có thể yêu cầu Chrome bỏ qua tất cả các lỗi SSL cho TẤT CẢ các trang web bằng cách khởi động nó bằng một tùy chọn dòng lệnh đặc biệt, như chi tiết tại đây trên SuperUser


2
Không chắc bạn đang sử dụng phiên bản XAMPP nào, nhưng nếu bạn tìm kiếm một dòng trong tệp đó có chứa "openssl x509", bạn sẽ có thể thêm phần trên vào cuối dòng đó trong tệp. Ví dụ, phiên bản này của makecert.bat , có nó trên dòng 9, và sẽ kết thúc là: bin\openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365 -sha256 -extfile v3.ext. Tất nhiên bạn vẫn cần lưu v3.ext vào một tệp trong cùng một thư mục.
Brad Parks

1
Tôi đã từ bỏ chrome sau khi thử mọi thứ và tiếp tục với một trình duyệt khác. Vài ngày sau, hôm nay tôi đã kiểm tra bằng chrome và nó hoạt động !!! Chrome có thể có một lỗi và họ đã sửa nó. Phương pháp của bạn cho Chủ đề Tên thay thế Thiếu hoạt động !!!! Chỉ cần thêm chứng chỉ được chứng nhận theo chứng chỉ gốc đáng tin cậy trong trình duyệt.
Tarik

35
Tôi đang nhận được unknown option -extfile. Làm cách nào để sửa lỗi này?
Nick Manning

2
@NickManning - Có thể bạn đang sử dụng extfilelệnh trong lệnh openssl sai? Thay vì nó được sử dụng trong openssl req -new ..., nó được sử dụng trong openssl x509 -req .... Ít nhất đó là những gì ai đó ở đây cho biết , trong đó có vẻ đúng từ ví dụ tôi có trong câu trả lời khác cho một câu hỏi tương tự như thế nào để tạo ra đầy đủ các Certs
Brad Parks

2
"cung cấp thêm một tham số cho openssl" Cụ thể là lệnh nào? Có nhiều bước liên quan và câu trả lời này quá mơ hồ: ibm.com/support/knowledgecenter/en/SSWHYP_4.0.0/…
user145400

34

Giải pháp sau phù hợp với tôi trên chrome 65 ( ref ) -

Tạo tệp cấu hình OpenSSL (ví dụ: 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

Tạo chứng chỉ tham chiếu đến tệp cấu hình này

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

2
Điều đó thật tuyệt! Chính xác những gì tôi cần và nó bỏ qua những lời nhắc phiền phức cho những thứ như tên công ty và tiểu bang, v.v.
coredumperror

2
Tôi đã thử một số giải pháp thay thế hiện có nhưng đây là giải pháp duy nhất phù hợp với tôi. Cám ơn!!
Mirko

1
Bạn có thể chuyển chủ đề từ một dòng lệnh: openssl req ... -subj "/C=US/ST=VA/L=SomeCity/O=MyCompany/CN=www.company.com"
Jaroslav Záruba

bạn đã nhập vào chrome như thế nào? Ở đây không basicConstraints = CA:truethiếu sao?
woodz

19

Tập lệnh Bash

Tôi đã tạo tập lệnh bash để giúp tạo chứng chỉ TLS tự ký hợp lệ trong Chrome dễ dàng hơn.

Đã thử nghiệm Chrome 65.xvà nó vẫn đang hoạt động. Đảm bảo khởi động lại chrome sau khi cài đặt chứng chỉ mới.

chrome://restart



Các nguồn lực khác

Một công cụ khác (mạnh mẽ hơn nhiều) đáng để thử là cfsslbộ công cụ của CloudFlare :


2
Bạn nên thêm script vào đây và giải thích nó.
jww

Có vẻ như kịch bản đẹp. Nhưng một script không (trực tiếp) cung cấp câu trả lời thực sự về vấn đề của OP là gì. Có thể giải thích vấn đề của anh ấy là gì.
bshea

4

Tôi chỉ đơn giản sử dụng -subjtham số thêm địa chỉ ip của máy. Vì vậy, giải quyết chỉ với một lệnh.

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

Bạn có thể thêm các thuộc tính khác như C, ST, L, O, OU, emailAddress để tạo chứng chỉ mà không cần được nhắc.


2
không hoạt động cho. có vẻ như chrome không nhận SAN cách này
Mononoke

Tôi gặp "sự cố khi tạo Yêu cầu chứng chỉ" trên OpenSSL 1.1.0b bằng cách sử dụng lệnh này.
Rick

Đối với tôi (Windows) đã làm việc một cú pháp hơi khác nhau: 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 sau đó cần *.pfxđịnh dạng:openssl.exe pkcs12 -export -out certificate.pfx -inkey certificate.key -in certificate.crt
Stepan Havránek

3

Tôi đã gặp rất nhiều vấn đề khi nhận chứng chỉ tự ký hoạt động trên macos / Chrome. Cuối cùng tôi đã tìm thấy Mkcert, "Một công cụ zero-config đơn giản để tạo chứng chỉ phát triển cục bộ đáng tin cậy với bất kỳ tên nào bạn muốn." https://github.com/FiloSottile/mkcert


Nó cũng hoạt động trên Windows 10 của tôi trong Chrome mới. Mặc dù tôi đã phải sao chép các tệp .pem từ thư mục Windows \ system32 mặc định sang một thư mục khác, vì Nginx không thể truy cập thư mục này.
vatavale

2
  • Tạo một bản sao của cấu hình OpenSSL của bạn trong thư mục chính của bạn:

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

    hoặc trên Linux:

    cp /etc/ssl/openssl.cnf ~/openssl-temp.cnf
    
  • Thêm Tên Thay thế Chủ đề vào openssl-temp.cnf, dưới [v3_ca]:

    [ v3_ca ]
    subjectAltName = DNS:localhost
    

    Thay thế localhostbằng miền mà bạn muốn tạo chứng chỉ đó.

  • Tạo chứng chỉ:

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

Sau đó bạn có thể xóa openssl-temp.cnf


1

Tôi đã có thể loại bỏ (net :: ERR_CERT_AUTHORITY_INVALID) bằng cách thay đổi giá trị DNS.1 của tệp v3.ext

[alt_names] DNS.1 = domainname.com

Thay đổi tên miền.com bằng tên miền của riêng bạn.


0

trên MAC bắt đầu từ Phiên bản chrome 67.0.3396.99 chứng chỉ tự ký của tôi đã ngừng hoạt động.

tái tạo với tất cả những gì được viết ở đây không hoạt động.

CẬP NHẬT

đã có cơ hội xác nhận rằng cách tiếp cận của tôi hoạt động ngày hôm nay :). Nếu nó không hiệu quả với bạn, hãy đảm bảo rằng bạn đang sử dụng phương pháp này

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>
$

được sao chép từ đây https://ksearch.wordpress.com/2017/08/22/generate-and-import-a-self-signed-ssl-certificate-on-mac-osx-sierra/

CẬP NHẬT KẾT THÚC

cuối cùng chỉ có thể nhìn thấy Secure màu xanh lục khi xóa chứng chỉ của tôi khỏi hệ thốngthêm nó vào chuỗi khóa cục bộ . (nếu có - bỏ nó trước). Không chắc liệu nó có hợp lệ hay không nhưng trong trường hợp của tôi, tôi đã tải xuống chứng chỉ qua chrome và xác minh rằng ngày tạo là hôm nay - vì vậy đó là ngày tôi vừa tạo.

hy vọng nó sẽ hữu ích cho ai đó dành một ngày cho nó.

không bao giờ cập nhật chrome!


0

Đây là một cách rất đơn giản để tạo chứng chỉ IP mà Chrome sẽ tin tưởng.

Tệp 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

Tất nhiên 192.168.1.10 là địa chỉ IP mạng cục bộ mà chúng tôi muốn Chrome tin tưởng.

Tạo chứng chỉ:

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

Trên Windows, hãy nhập chứng chỉ vào Kho lưu trữ chứng chỉ gốc đáng tin cậy trên tất cả các máy khách. Trên Điện thoại hoặc Máy tính bảng Android, hãy tải xuống chứng chỉ để cài đặt nó. Bây giờ Chrome sẽ tin cậy chứng chỉ trên windows và Android.

Trên hộp windows dev, nơi tốt nhất để lấy openssl.exe là từ "c: \ Program Files \ Git \ usr \ bin \ openssl.exe"


0

Nếu bạn muốn chạy localhost máy chủ của mình, bạn cần thiết lập CN = localhostDNS.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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.