GNU/Linux >> Belajar Linux >  >> Linux

Apache – Membuat Sertifikat SSL *.local?

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.

Terkait:Layar GNU:cetak sesi terpisah ke stdout?

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.

Terkait:Huruf besar S dalam izin folder?
Linux
  1. Cara Membuat Permintaan Penandatanganan Sertifikat (CSR) untuk SSL

  2. Plesk:Instalasi SSL

  3. Kesalahan peramban sertifikat SSL

  1. Membuat file CSR sertifikat web.

  2. Curl:(60) Sertifikat SSL Masalah:Tidak Dapat Mendapatkan Sertifikat Penerbit Lokal?

  3. Periksa sertifikat jarak jauh - MySQL

  1. Apa itu Sertifikat SSL?

  2. Membuat pengalihan Apache

  3. 'Jenis sertifikat SSL'