Saya mencoba menyiapkan satu sertifikat SSL yang akan membuat situs web *.local apa pun berfungsi melalui https. Saya memiliki semua domain .local yang menunjuk kembali ke mesin lokal saya. Saya menggunakan ini ketika mengembangkan situs web. Banyak fitur baru (lokasi geografis, pekerja layanan, dll.) memerlukan SSL.
Saya yakin bahwa untuk Chrome/Firefox versi terbaru, sertifikat yang ditandatangani sendiri oleh sekolah lama tidak lagi berfungsi.
Berikut adalah langkah-langkah yang saya ambil setelah mengikuti kombinasi panduan ini:
https://deliciousbrains.com/https-locally-without-browser-privacy-errors/
https://codeghar.wordpress.com/2008/03/17/create-a-certificate-authority-and-certificates-with-openssl/
https://stackoverflow.com/questions/27294589/creating-self-signed-certificate-for-domain-and-subdomains-neterr-cert-commo
Ini file konfigurasi saya:
#..................................
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /home/*****/Sites/root-ca
serial = $dir/serial
database = $dir/index.txt
new_certs_dir = $dir/certs
certificate = $dir/certs/cacert.pem
private_key = $dir/private/cakey.pem
default_days = 3000
default_md = sha256
preserve = no
email_in_dn = no
nameopt = default_ca
certopt = default_ca
policy = policy_match
copy_extensions = copyall
[ policy_match ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
default_bits = 2048 # Size of keys
default_keyfile = key.pem # name of generated keys
default_md = md5 # message digest algorithm
string_mask = nombstr # permitted characters
distinguished_name = req_distinguished_name
req_extensions = v3_req
[ req_distinguished_name ]
# Variable name Prompt string
#------------------------- ----------------------------------
0.organizationName = Organization Name (company)
organizationalUnitName = Organizational Unit Name (department, division)
emailAddress = Email Address
emailAddress_max = 40
localityName = Locality Name (city, district)
stateOrProvinceName = State or Province Name (full name)
countryName = Country Name (2 letter code)
countryName_min = 2
countryName_max = 2
commonName = Common Name (hostname, IP, or your name)
commonName_max = 64
# Default values for the above, for consistency and less typing.
# Variable name Value
#------------------------ ------------------------------
0.organizationName_default = *****
localityName_default = *****
stateOrProvinceName_default = *****
countryName_default = *****
emailAddress_default = *****
[ v3_ca ]
basicConstraints = CA:TRUE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer:always
subjectAltName = @alternate_names
[ v3_req ]
subjectKeyIdentifier = hash
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
subjectAltName = @alternate_names
nsComment = "OpenSSL Generated Certificate"
[ alternate_names ]
DNS.1 = *.local
Saya pertama kali membuat otoritas sertifikat baru:
openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out certs/cacert.pem -days 3000 -config conf/caconfig.cnf
Saya telah memberikan nama Umum di sini sebagai nama saya
Common Name (hostname, IP, or your name) []:Jonathan Hodgson
File certs/cacert.pem
Saya kemudian mengimpor ke otoritas chromium yang berfungsi tanpa masalah.
Saya kemudian membuat permintaan sertifikat:
openssl req -extensions v3_req -new -nodes -out local.req.pem -keyout private/local.key.pem -config conf/caconfig.cnf
Saya telah memberikan nama Umum di sini sebagai *.local
Common Name (hostname, IP, or your name) []:*.local
Saya kemudian menandatangani permintaan:
openssl ca -out certs/local.cert.pem -config conf/caconfig.cnf -infiles local.req.pem
Saya menambahkan file ke konfigurasi http saya:
<VirtualHost *:80>
ServerName test.local
ServerAlias *.local
VirtualDocumentRoot /home/jonathan/Sites/%-2/public_html
CustomLog /home/jonathan/Sites/access.log vhost_combined
ErrorLog /home/jonathan/Sites/error.log
</VirtualHost>
<VirtualHost *:443>
ServerName test.local
ServerAlias *.local
VirtualDocumentRoot /home/jonathan/Sites/%-2/public_html
CustomLog /home/jonathan/Sites/access.log vhost_combined
ErrorLog /home/jonathan/Sites/error.log
SSLEngine On
SSLCertificateFile /home/jonathan/Sites/root-ca/certs/local.cert.pem
SSLCertificateKeyFile /home/jonathan/Sites/root-ca/private/local.key.pem
</VirtualHost>
Saya telah memulai ulang Apache tetapi saya masih mendapatkan NET::ERR_CERT_COMMON_NAME_INVALID
Saya mendapat kesan bahwa ini karena saya perlu menambahkan subjectAltName ke file konfigurasi yang telah saya lakukan.
Tolong beri tahu saya apa yang harus saya lakukan secara berbeda.
Terima kasih sebelumnya atas bantuannya
Sunting
Saya pikir masalahnya ada hubungannya dengan wildcard. Jika saya menyetel nama_alternatif ke example.local dan nama Umum untuk permintaan menjadi example.local, example.local ditampilkan sebagai aman di Chrome dan Firefox.
Saya mencoba menyetel DNS.1 ke local
dan DNS.2 ke *.local
, saya kemudian baru saja mendapatkan ERR_SSL_SERVER_CERT_BAD_FORMAT
di chrome dan SEC_ERROR_REUSED_ISSUER_AND_SERIAL
di firefox. Saya pasti mengatur ulang file serial dan file indeks saya sebelum membuat sertifikat.
Jawaban yang Diterima:
Anda menambahkan SAN ke CSR tetapi Anda tidak memberi tahu ca
untuk menyertakan ekstensi dari CSR dalam sertifikat. Lihat https://security.stackexchange.com/questions/150078/missing-x509-extensions-with-an-openssl-generated-certificate atau halaman manual untuk ca
juga di web di copy_extensions
EDIT:Anda juga perlu menentukan x509_extensions
di ca
config, atau yang setara tetapi kurang nyaman opsi baris perintah -extensions
, dalam kedua kasus menunjuk ke bagian yang ada tetapi bisa kosong jika Anda tidak menginginkan ekstensi yang diperlukan CA. Saya tidak memperhatikan ini pada awalnya karena saya belum pernah mencoba kasus ekstensi dari CSR hanya dan bukan konfigurasi, yang tidak realistis untuk sebagian besar CA. Jika Anda menentukan copy_extensions
selain none
(dan CSR memiliki beberapa) tetapi jangan tentukan x509_extensions
lalu ca
memang letakkan ekstensi di sertifikat tetapi tidak setel versi sertifikat ke v3 seperti yang disyaratkan oleh standar (seperti rfc5280) saat ada ekstensi.
Dapat diperdebatkan jika ini adalah bug; halaman manual mengatakan x509_extensions/extensions
mengontrol pengaturan v3, dan dengan tidak mengatakan hal serupa tentang copy_extensions
menyiratkan bahwa tidak, tetapi IMHO itu pasti fitur yang sangat suboptimal. EDIT:ini adalah bug dan akan diperbaiki tetapi sampai saat itu gunakan solusinya, lihat https://unix.stackexchange.com/a/394465/59699
NAMUN:dalam pengujian saya, ini sebenarnya tidak menyelesaikan masalah Anda. Padahal sertifikatnya ada *.local
di SAN dan CN dan (sekarang) dinyatakan valid, Firefox saya (53.0.2) dan Chrome (59.0.3071.109) masih menolaknya masing-masing dengan SSL_ERROR_CERT_DOMAIN_ERROR dan ERR_CERT_COMMON_NAME_INVALID. Saya kira mereka mungkin tidak mengecualikan local
dari logika level 2+ normal dan mencoba *.example.local
:Chrome menerimanya, tetapi Firefox tidak. Saya juga mencoba *.example.org
dan baik Chrome maupun IE11 menyukai itu tetapi tetap bukan Firefox (dan tentu saja menetapkan nama sendiri dalam TLD asli seperti .org
bukan cara kerja DNS yang seharusnya).
Ini telah saya terjebak. Dengan beberapa pekerjaan, OpenSSL dapat dibuat untuk menghasilkan sertifikat yang berisi hampir semua hal yang Anda inginkan, tetapi apa yang akan terima oleh Firefox dan Chrome Saya tidak tahu. Saya akan mencoba memeriksanya dan memperbarui jika saya menemukan sesuatu.
Saya harap maksud Anda Anda memberi *.local
sebagai CommonName hanya untuk CSR server dan BUKAN untuk sertifikat CA (ditandatangani sendiri). Jika nama Subjek untuk CA dan sertifikat daun sama, tidak ada yang akan berfungsi dengan baik. EDIT:Q Anda yang diedit mengonfirmasi bahwa mereka berbeda dengan benar. Meskipun tidak disebutkan juga menentukan Negara, Negara Bagian, dan Organisasi seperti yang dipersyaratkan oleh ca
kebijakan yang Anda gunakan.
Catatan 'menandatangani sendiri' adalah istilah seni dan sarana yang ditandatangani dengan kunci yang sama . Sertifikat CA Anda ditandatangani sendiri. Sertifikat server Anda ditandatangani oleh Anda sendiri menggunakan kunci Anda sendiri tetapi tidak ditandatangani sendiri. Mencoba menerapkan instruksi untuk sertifikat yang ditandatangani sendiri ke sertifikat yang tidak ditandatangani sendiri adalah bagian dari masalah Anda.
Dan poin Gilles tentang md5 untuk algoritma tanda tangan juga benar.
EDIT:serial 'mengatur ulang' (dan indeks) untuk openssl ca
penyiapan adalah ide yang buruk, kecuali jika Anda secara permanen membuang sertifikat CA dan nama mereka digunakan untuk. Standar mengatakan CA yang diberikan tidak boleh mengeluarkan lebih dari satu sertifikat dengan nilai seri yang sama di sertifikat, dan file serial adalah cara openssl ca
(dan juga x509 -req
) mengimplementasikan ini. CA 'nyata' (publik) saat ini tidak lagi menggunakan penghitung sederhana tetapi menyertakan entropi untuk memblokir serangan tabrakan pada PKI — google hashclash — tetapi ini bukan masalah untuk CA pribadi seperti milik Anda. Saya dapat dengan mudah percaya bahwa browser (atau relier lain) tidak senang jika melihat banyak sertifikat dengan serial dan nama CA yang sama, meskipun saya TIDAK mengharapkan browser untuk terus-menerus menyimpan sertifikat daun — dan dengan demikian melihat yang lama dan yang baru di satu proses kecuali berjalan lama — kecuali Anda mengimpornya ke toko yang berlaku, termasuk di Firefox jika Anda menjadikannya 'pengecualian' permanen.