Sertifikat SSL yang ditandatangani sendiri tidak valid - "Nama Alternatif Subjek Tidak Ada"

98

Baru-baru ini, Chrome berhenti bekerja dengan sertifikat SSL yang saya tandatangani sendiri, dan menganggapnya tidak aman. Saat saya melihat sertifikat di DevTools | Securitytab, saya dapat melihat bahwa tertulis

Nama Alternatif Subjek Hilang Sertifikat untuk situs ini tidak berisi ekstensi Nama Alternatif Subjek yang berisi nama domain atau alamat IP.

Kesalahan Sertifikat Ada masalah dengan rantai sertifikat situs (net :: ERR_CERT_COMMON_NAME_INVALID).

Bagaimana cara memperbaikinya?

Brad Parks
sumber
33
Bagaimana ini bukan pertanyaan pemrograman ..... ini tentang Sertifikat penandatanganan sendiri yang merupakan bagian dari pembuatan Stack Anda. ,,, Terima kasih Brad
Sweet Chilly Philly
1
CN=www.example.commungkin salah. Nama host selalu masuk ke SAN . Jika ada di CN , maka itu harus ada di SAN juga (Anda harus mendaftar dua kali dalam kasus ini). Untuk aturan dan alasan selengkapnya, lihat Bagaimana Anda menandatangani Permintaan Penandatanganan Sertifikat dengan Otoritas Sertifikasi Anda dan Bagaimana cara membuat sertifikat yang ditandatangani sendiri dengan openssl? Anda juga perlu menempatkan sertifikat yang ditandatangani sendiri di penyimpanan kepercayaan yang sesuai.
jww
@jww - ini bukan duplikat dari pertanyaan itu, karena Anda tidak perlu membuat sertifikat menggunakan openssl, Anda dapat membuatnya dengan alat lain.
Brad Parks
1
@BradParks - Hmmm ... Pertanyaan itu diberi tag OpenSSL dan jawaban yang diterima menggunakan OpenSSL. Saya membuka kembali dan menghapus tag OpenSSL.
jww

Jawaban:

104

Untuk memperbaikinya, Anda perlu memberikan parameter tambahan ke opensslsaat Anda membuat sertifikat, pada dasarnya

-sha256 -extfile v3.ext

di mana v3.extfile seperti itu, dengan %%DOMAIN%%diganti dengan nama yang sama yang Anda gunakan sebagai milik Anda Common Name. Info lebih lanjut di sini dan di sini . Perhatikan bahwa biasanya Anda menyetel Common Namedan %%DOMAIN%%ke domain yang Anda coba buatkan sertifikatnya. Jadi jika ya www.mysupersite.com, maka Anda akan menggunakannya untuk keduanya.

v3.ext

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

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

Catatan: Skrip yang mengatasi masalah ini, dan membuat sertifikat ssl tepercaya sepenuhnya untuk digunakan di Chrome, Safari, dan dari klien Java dapat ditemukan di sini

Catatan lain : Jika semua yang Anda coba lakukan adalah menghentikan chrome agar tidak menampilkan kesalahan saat melihat sertifikat yang ditandatangani sendiri, Anda dapat memberi tahu Chrome untuk mengabaikan semua kesalahan SSL untuk SEMUA situs dengan memulainya dengan opsi baris perintah khusus, seperti yang dijelaskan di sini di SuperUser

Brad Parks
sumber
2
Tidak yakin versi XAMPP mana yang Anda gunakan, tetapi jika Anda mencari baris di file itu yang berisi "openssl x509", Anda dapat menambahkan yang di atas ke akhir baris tersebut di file. Sebagai contoh, versi ini makecert.bat , mengatakan pada baris 9, dan akan berakhir menjadi: bin\openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 365 -sha256 -extfile v3.ext. Tentu saja Anda masih perlu menyimpan v3.ext ke file di folder yang sama.
Brad Parks
1
Saya berhenti menggunakan chrome setelah mencoba semuanya dan melanjutkan dengan browser lain. Beberapa hari kemudian, hari ini saya memeriksa dengan chrome dan berfungsi !!! Chrome mungkin memiliki bug dan mereka memperbaikinya. Metode Anda untuk Nama Alternatif Subjek Hilang bekerja !!!! Cukup tambahkan sertifikat di bawah sertifikat dasar tepercaya di browser.
Tarik
35
Saya mendapatkan unknown option -extfile. Bagaimana cara mengatasinya?
Nick Manning
2
@NickManning - Mungkin Anda menggunakan extfilearahan dalam perintah openssl yang salah? Alih-alih digunakan dalam openssl req -new ..., ini digunakan dalam openssl x509 -req .... Setidaknya itulah yang dikatakan seseorang di sini , yang tampaknya benar dari contoh yang saya miliki di jawaban lain untuk pertanyaan serupa tentang cara menghasilkan sertifikat ini sepenuhnya
Brad Parks
2
"berikan parameter tambahan ke openssl" Untuk perintah yang mana secara khusus? Ada beberapa langkah yang terlibat dan jawaban ini terlalu kabur: ibm.com/support/knowledgecenter/en/SSWHYP_4.0.0/…
pengguna145400
34

Solusi berikut berhasil untuk saya di chrome 65 ( ref ) -

Buat file konfigurasi OpenSSL (contoh: 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

Buat sertifikat yang mereferensikan file konfigurasi ini

openssl req -x509 -nodes -days 730 -newkey rsa:2048 \
 -keyout cert.key -out cert.pem -config req.cnf -sha256
Anshul
sumber
2
Ini bagus! Persis yang saya butuhkan, dan itu melewatkan petunjuk yang mengganggu untuk hal-hal seperti nama dan negara perusahaan dan semacamnya, juga.
coredumperror
2
Saya mencoba beberapa solusi alternatif di luar sana tetapi ini adalah satu-satunya yang berhasil untuk saya. Terima kasih!!
Mirko
1
Anda dapat meneruskan subjek dari baris perintah: openssl req ... -subj "/C=US/ST=VA/L=SomeCity/O=MyCompany/CN=www.company.com"
Jaroslav Záruba
bagaimana Anda mengimpor ke chrome? Apa disini tidak basicConstraints = CA:truehilang?
woodz
19

Bash Script

Saya membuat skrip bash untuk memudahkan pembuatan sertifikat TLS yang ditandatangani sendiri yang valid di Chrome.

Diuji Chrome 65.xdan masih berfungsi. Pastikan untuk memulai ulang chrome setelah memasang sertifikat baru.

chrome://restart



Sumber Daya Lainnya

Alat lain (yang jauh lebih kuat) yang layak untuk dicoba adalah cfssltoolkit CloudFlare :

Logan
sumber
2
Anda harus menambahkan skrip di sini dan menjelaskannya.
jww
Sepertinya naskah yang bagus. Tetapi skrip tidak (secara langsung) memberikan jawaban nyata tentang apa masalah OP itu. Mungkin menjelaskan apa masalahnya juga.
bshea
4

Saya hanya menggunakan -subjparameter menambahkan alamat ip mesin. Jadi diselesaikan dengan satu perintah saja.

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

Anda dapat menambahkan atribut lain seperti C, ST, L, O, OU, emailAddress untuk menghasilkan sertifikat tanpa diminta.

Ludwig
sumber
3
tidak bekerja untuk. tampaknya chrome tidak mengenali SAN dengan cara ini
mononoke
Saya mendapat "masalah membuat Permintaan Sertifikat" di OpenSSL 1.1.0b menggunakan perintah ini.
Rick
Bagi saya (Windows) bekerja sintaks yang sedikit berbeda: 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 kemudian membutuhkan *.pfxformat:openssl.exe pkcs12 -export -out certificate.pfx -inkey certificate.key -in certificate.crt
Štěpán Havránek
3

Saya mengalami begitu banyak masalah saat mendapatkan sertifikat yang ditandatangani sendiri yang berfungsi di macos / Chrome. Akhirnya saya menemukan Mkcert, "Alat zero-config sederhana untuk membuat sertifikat pengembangan tepercaya secara lokal dengan nama apa pun yang Anda inginkan." https://github.com/FiloSottile/mkcert

Anthony
sumber
Ini berfungsi pada Windows 10 saya di Chrome baru juga. Meskipun saya harus menyalin file .pem dari folder Windows \ system32 default ke yang lain, karena Nginx tidak dapat mengakses folder ini.
vatavale
2
  • Buat salinan konfigurasi OpenSSL Anda di direktori beranda:

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

    atau di Linux:

    cp /etc/ssl/openssl.cnf ~/openssl-temp.cnf
    
  • Tambahkan Nama Alternatif Subjek ke openssl-temp.cnf, di bawah [v3_ca]:

    [ v3_ca ]
    subjectAltName = DNS:localhost
    

    Ganti localhostdengan domain yang ingin Anda buatkan sertifikatnya.

  • Hasilkan sertifikat:

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

Anda kemudian dapat menghapus openssl-temp.cnf

Vic Seedyew
sumber
1

Saya bisa menyingkirkan (net :: ERR_CERT_AUTHORITY_INVALID) dengan mengubah nilai DNS.1 dari file v3.ext

[alt_names] DNS.1 = domainname.com

Ubah domainname.com dengan domain Anda sendiri.

Jun See
sumber
1

Berikut ini cara yang sangat sederhana untuk membuat sertifikat IP yang dipercaya oleh Chrome.

File 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

Di mana, tentu saja 192.168.1.10 adalah IP jaringan lokal yang kami ingin Chrome percayai.

Buat sertifikat:

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

Di Windows, impor sertifikat ke Penyimpanan Sertifikat Akar Tepercaya di semua mesin klien. Di Ponsel Android atau Tablet, unduh sertifikat untuk menginstalnya. Sekarang Chrome akan mempercayai sertifikat di windows dan Android.

Di windows dev box, tempat terbaik untuk mendapatkan openssl.exe adalah dari "c: \ Program Files \ Git \ usr \ bin \ openssl.exe"

AQuirky
sumber
0

pada MAC mulai dari chrome Versi 67.0.3396.99, sertifikat yang ditandatangani sendiri berhenti berfungsi.

regenerasi dengan semua yang tertulis di sini tidak berhasil.

MEMPERBARUI

memiliki kesempatan untuk mengonfirmasi bahwa pendekatan saya berfungsi hari ini :). Jika tidak berhasil, pastikan Anda menggunakan pendekatan ini

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

disalin dari sini https://ksearch.wordpress.com/2017/08/22/generate-and-import-a-self-signed-ssl-certificate-on-mac-osx-sierra/

AKHIR UPDATE

akhirnya dapat melihat hijau Aman hanya ketika menghapus sertifikat saya dari sistem , dan menambahkannya ke rantai kunci lokal . (jika ada - jatuhkan dulu). Tidak yakin apakah itu penting, tetapi dalam kasus saya, saya mengunduh sertifikat melalui chrome, dan memverifikasi bahwa tanggal pembuatan adalah hari ini - jadi itu adalah yang baru saja saya buat.

semoga bermanfaat bagi seseorang yang menghabiskan waktu seharian di situ.

jangan pernah memperbarui chrome!

pengguna2932688
sumber
0

Jika Anda ingin menjalankan server localhost Anda, Anda perlu mengatur CN = localhostdan 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
[email protected]
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
Washington Botelho
sumber