GNU/Linux >> Linux Esercitazione >  >> Linux

Apache – Creazione di un certificato SSL *.local?

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.

Correlati:Schermata GNU:stampare una sessione separata su stdout?

È 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.

Correlati:S maiuscola nei permessi di una cartella?
Linux
  1. Creazione di un file CSR del certificato Web.

  2. Curl:(60) Certificato SSL Problema:impossibile ottenere il certificato dell'emittente locale?

  3. Che cos'è un certificato SSL?

  4. Installa un certificato SSL

  5. Acquista o rinnova un certificato SSL

Che cos'è un certificato SSL?

Come installare il certificato SSL su CentOS 7

Creazione di un certificato SSL autofirmato

Strumento di verifica SSL

Come creare un certificato SSL autofirmato locale su CentOS 8

Come controllare la data di scadenza SSL su Plesk