Sto cercando di impostare un singolo certificato SSL che farà funzionare qualsiasi sito Web *.local su https. Ho tutti i domini .local che puntano al mio computer locale. Li uso durante lo sviluppo di siti Web. Molte nuove funzionalità (geolocalizzazione, addetti ai servizi ecc.) richiedono un SSL.
Credo che per le versioni recenti di Chrome/Firefox, un certificato autofirmato della vecchia scuola non funzioni più.
Di seguito sono riportati i passaggi che ho eseguito dopo aver seguito una combinazione di queste guide:
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-netrr-cert-commo
Ecco il mio file di configurazione:
#..................................
[ 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
Per prima cosa creo una nuova autorità di certificazione:
openssl req -new -x509 -extensions v3_ca -keyout private/cakey.pem -out certs/cacert.pem -days 3000 -config conf/caconfig.cnf
Ho dato il nome comune qui come mio nome
Common Name (hostname, IP, or your name) []:Jonathan Hodgson
Il file certs/cacert.pem
Quindi importo nelle autorità del cromo che funziona senza problemi.
Quindi creo una richiesta di certificato:
openssl req -extensions v3_req -new -nodes -out local.req.pem -keyout private/local.key.pem -config conf/caconfig.cnf
Ho dato il nome comune qui come *.local
Common Name (hostname, IP, or your name) []:*.local
Firmo quindi la richiesta:
openssl ca -out certs/local.cert.pem -config conf/caconfig.cnf -infiles local.req.pem
Aggiungo i file alla mia configurazione http:
<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>
Ho riavviato Apache ma ricevo ancora NET::ERR_CERT_COMMON_NAME_INVALID
Avevo l'impressione che ciò fosse dovuto al fatto che dovevo aggiungere subjectAltName al file di configurazione che ho fatto.
Per favore, fammi sapere cosa dovrei fare diversamente.
Grazie in anticipo per qualsiasi aiuto
Modifica
Penso che il problema abbia a che fare con il carattere jolly. Se ho impostato i nomi_alternativi su example.local e il nome comune per la richiesta su example.local, example.local viene visualizzato come sicuro sia in Chrome che in Firefox.
Ho provato a impostare DNS.1 su local
e da DNS.2 a *.local
, quindi ho appena ricevuto ERR_SSL_SERVER_CERT_BAD_FORMAT
in Chrome e SEC_ERROR_REUSED_ISSUER_AND_SERIAL
in Firefox. Ho definitivamente ripristinato il mio file seriale e il mio file di indice prima di generare i certificati.
Risposta accettata:
Hai aggiunto SAN alla CSR ma non l'hai detto a ca
per includere estensioni dalla CSR nel certificato. Vedi https://security.stackexchange.com/questions/150078/missing-x509-extensions-with-an-openssl-generated-certificate o la pagina man per ca
anche sul web all'indirizzo copy_extensions
EDIT:anche è necessario specificare x509_extensions
nel ca
config, o equivalente ma meno conveniente l'opzione della riga di comando -extensions
, in entrambi i casi puntando a una sezione che esiste ma può essere vuota se non vuoi estensioni richieste da CA. All'inizio non me ne sono accorto perché non avevo mai provato il caso delle estensioni da CSR solo e non config, che non è realistico per la maggior parte delle CA. Se specifichi copy_extensions
diverso da none
(e la CSR ne ha alcuni) ma non specificare x509_extensions
quindi ca
fa inserisci le estensioni nel certificato ma non imposta la versione del certificato su v3 come richiesto dagli standard (come rfc5280) quando sono presenti estensioni.
È discutibile se si tratta di un bug; la pagina di manuale dice x509_extensions/extensions
controlla l'impostazione v3 e non dicendo qualcosa di simile su copy_extensions
implica che non lo fa, ma IMHO è certamente una caratteristica molto non ottimale. EDIT:è un bug e verrà corretto, ma fino ad allora usa la soluzione alternativa, vedi https://unix.stackexchange.com/a/394465/59699
TUTTAVIA:nel mio test, questo in realtà non ha risolto il tuo problema. Anche se il certificato ha *.local
in SAN e CN ed è (ora) altrimenti valido, il mio Firefox (53.0.2) e Chrome (59.0.3071.109) lo rifiutano ancora rispettivamente con SSL_ERROR_CERT_DOMAIN_ERROR e ERR_CERT_COMMON_NAME_INVALID. Ho indovinato che potrebbero non escludere local
dalla normale logica di livello 2+ e ho provato *.example.local
:Chrome lo accetta, ma Firefox no. Ho anche provato *.example.org
e sia Chrome che IE11 come quello ma non ancora Firefox (e ovviamente assegnandoti nomi in veri TLD come .org
non è il modo in cui il DNS dovrebbe funzionare).
Questo mi ha bloccato. Con un po' di lavoro è possibile fare in modo che OpenSSL generi un certificato contenente quasi tutto ciò che desideri, ma ciò che Firefox e Chrome accetteranno Non lo so. Proverò a esaminarlo e ad aggiornare se trovo qualcosa.
Spero tu intenda hai fornito *.local
come CommonName solo per il server CSR e NON per il certificato CA (autofirmato). Se i nomi dei soggetti per CA e certificati foglia sono gli stessi, nulla funzionerà in modo affidabile. EDIT:la tua Q modificata conferma che erano correttamente differenti. Anche se non menziona anche la specifica di Paese, Stato e Organizzazione come richiesto dal ca
politica che hai utilizzato.
Nota "autofirmato" è un termine artistico e significa firmato con la stessa chiave . Il tuo certificato CA è autofirmato. Il certificato del tuo server è firmato da te stesso utilizzando la tua chiave ma non autofirmato. Il tentativo di applicare le istruzioni per un certificato autofirmato a un certificato non autofirmato faceva parte del tuo problema.
E anche il punto di Gilles su md5 per l'algoritmo della firma è corretto.
EDIT:"reset" seriale (e indice) per un openssl ca
l'installazione è una cattiva idea, a meno che tu non scarti permanentemente il certificato CA e il nome erano usati per. Gli standard dicono che una determinata CA non deve emettere più di un certificato con lo stesso valore seriale nel certificato e il file seriale è il modo in cui openssl ca
(e anche x509 -req
) lo implementa. Le CA "reali" (pubbliche) al giorno d'oggi non utilizzano più un semplice contatore ma includono l'entropia per bloccare gli attacchi di collisione su PKI - google hashclash - ma questo non è un problema per una CA personale come la tua. Posso facilmente credere che un browser (o un altro relier) non sia soddisfatto se vede più certificati con lo stesso nome seriale e CA, anche se NON mi aspetterei che un browser memorizzi in modo persistente un certificato foglia - e quindi veda sia il vecchio che il nuovo in un processo a meno che non sia di lunga durata, a meno che non lo importi nell'archivio appropriato, incluso in Firefox se lo rendi un'"eccezione" permanente.