Come creare un certificato autofirmato per localhost?


23

Ho fatto con una password e con i seguenti campi come root

openssl req -x509 -days 365 -newkey rsa:2048 -keyout /etc/ssl/apache.key \
    -out /etc/ssl/apache.crt

campi

Country: FI
State: Pirkanmaa
Locality: Tampere
Organization: masi
Organizational Unit Name: SSL Certificate Test
CommonName: 192.168.1.107/owncloud
EmailAddress: masi@gmail.com

Output: errore di handshake SSL in HTTPS. Uscita prevista: connessione HTTPS. HTTP funziona.

CommonName dovrebbe includere l'URL dove vuoi andare, il thread di owncloud qui . Ho provato senza successo in commonname

  • 192.168.1.107/owncloud
  • 192.168.1.107/

Sistema operativo di prova per server: Debian 8.5.
Server: Raspberry Pi 3b. Owncloud-server: 8.2.5. Owncloud-client: 2.1.1. Client di sistema: Debian 8.5.


Se stai cercando di generare un nuovo certificato SSL utilizzando SAN per localhost, i passaggi su questo post hanno funzionato per me Centos 7 / Vagrant / Chrome Browser.
Damodar Bashyal,

@DamodarBashyal Per favore, non fornire una risposta solo al link ma anche una descrizione come risposta.
Léo Léopold Hertz

Risposte:


11

openssl req -x509 -days 365 -newkey rsa: 2048 -keyout /etc/ssl/apache.key -out /etc/ssl/apache.crt

Non è possibile utilizzare questo comando per generare un certificato X.509 ben formato. Sarà malformato perché il nome host è inserito nel nome comune (CN) . Inserire un nome host o un indirizzo IP nella CN è deprecato sia dall'IETF (maggior parte degli strumenti, come wgete curl) sia dai forum CA / B (CA e browser).

In base ai forum IETF e CA / B, i nomi dei server e gli indirizzi IP vanno sempre nel Nome alternativo soggetto (SAN) . Per le regole, vedere RFC 5280, profilo XRL09 di infrastruttura a chiave pubblica e elenco di revoche di certificati (CRL) e requisiti di base del forum CA / browser .

Per lo più è necessario utilizzare un file di configurazione OpenSSL e adattarlo alle proprie esigenze. Di seguito è riportato un esempio di quello che uso. Si chiama example-com.confe viene passato al comando OpenSSL tramite -config example-com.conf.


Inoltre nota bene : tutte le macchine sostengono di essere localhost, localhost.localdomainecc Fate attenzione a rilascio di certificati per localhost. Sto Non dicendo di non farlo; basta capire che ci sono alcuni rischi.

Le alternative localhostsono: (1) eseguire DNS ed emettere certificati sul nome DNS della macchina. Oppure, (2) usa IP statico e includi l'indirizzo IP statico.


Il browser ti avviserà comunque di un certificato autofirmato che non si ricollega a una radice attendibile. Strumenti come curle wgetnon si lamentano, ma devi comunque fidarti di te stesso con un'opzione come quella di cURL --cafile. Per superare il problema di attendibilità del browser, devi diventare la tua CA.

"Diventare la propria CA" è noto come esecuzione di una PKI privata. Non c'è molto da fare. Puoi fare tutto ciò che può fare una CA pubblica. L'unica cosa diversa è che è necessario installare il certificato CA principale nei vari negozi. Non è diverso, per esempio, dall'uso di cURL cacerts.pm. cacerts.pmè solo una raccolta di CA radice e ora ti sei unito al club.

Se si diventa la propria CA, assicurarsi di masterizzare la chiave privata della CA principale su disco e mantenerla offline. Quindi inseriscilo nell'unità CD / DVD quando devi firmare una richiesta di firma. Ora stai emettendo certificati proprio come una CA pubblica.

Niente di tutto questo è terribilmente difficile una volta firmate una o due richieste di firma. Gestisco un PKI privato da anni a casa. Tutti i miei dispositivi e gadget si affidano alla mia CA.

Per ulteriori informazioni su come diventare la propria CA, vedere Come si firma la richiesta di firma del certificato con l'autorità di certificazione e Come creare un certificato autofirmato con openssl? .


Dai commenti nel file di configurazione qui sotto ...

Autofirmato (notare l'aggiunta di -x509)

openssl req -config example-com.conf -new -x509 -sha256 -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.cert.pem

Richiesta di firma (notare la mancanza di -x509)

openssl req -config example-com.conf -new -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem

Stampa un autofirmato

openssl x509 -in example-com.cert.pem -text -noout

Stampa una richiesta di firma

openssl req -in example-com.req.pem -text -noout

File di configurazione

# Self Signed (note the addition of -x509):
#     openssl req -config example-com.conf -new -x509 -sha256 -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.cert.pem
# Signing Request (note the lack of -x509):
#     openssl req -config example-com.conf -new -newkey rsa:2048 -nodes -keyout example-com.key.pem -days 365 -out example-com.req.pem
# Print it:
#     openssl x509 -in example-com.cert.pem -text -noout
#     openssl req -in example-com.req.pem -text -noout

[ req ]
default_bits        = 2048
default_keyfile     = server-key.pem
distinguished_name  = subject
req_extensions      = req_ext
x509_extensions     = x509_ext
string_mask         = utf8only

# The Subject DN can be formed using X501 or RFC 4514 (see RFC 4519 for a description).
#   It's sort of a mashup. For example, RFC 4514 does not provide emailAddress.
[ subject ]
countryName         = Country Name (2 letter code)
countryName_default     = US

stateOrProvinceName     = State or Province Name (full name)
stateOrProvinceName_default = NY

localityName            = Locality Name (eg, city)
localityName_default        = New York

organizationName         = Organization Name (eg, company)
organizationName_default    = Example, LLC

# Use a friendly name here because it's presented to the user. The server's DNS
#   names are placed in Subject Alternate Names. Plus, DNS names here is deprecated
#   by both IETF and CA/Browser Forums. If you place a DNS name here, then you 
#   must include the DNS name in the SAN too (otherwise, Chrome and others that
#   strictly follow the CA/Browser Baseline Requirements will fail).
commonName          = Common Name (e.g. server FQDN or YOUR name)
commonName_default      = Example Company

emailAddress            = Email Address
emailAddress_default        = test@example.com

# Section x509_ext is used when generating a self-signed certificate. I.e., openssl req -x509 ...
[ x509_ext ]

subjectKeyIdentifier        = hash
authorityKeyIdentifier  = keyid,issuer

#  If RSA Key Transport bothers you, then remove keyEncipherment. TLS 1.3 is removing RSA
#  Key Transport in favor of exchanges with Forward Secrecy, like DHE and ECDHE.
basicConstraints        = CA:FALSE
keyUsage            = digitalSignature, keyEncipherment
subjectAltName          = @alternate_names
nsComment           = "OpenSSL Generated Certificate"

# RFC 5280, Section 4.2.1.12 makes EKU optional
# CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
# extendedKeyUsage  = serverAuth, clientAuth

# Section req_ext is used when generating a certificate signing request. I.e., openssl req ...
[ req_ext ]

subjectKeyIdentifier        = hash

basicConstraints        = CA:FALSE
keyUsage            = digitalSignature, keyEncipherment
subjectAltName          = @alternate_names
nsComment           = "OpenSSL Generated Certificate"

# RFC 5280, Section 4.2.1.12 makes EKU optional
# CA/Browser Baseline Requirements, Appendix (B)(3)(G) makes me confused
# extendedKeyUsage  = serverAuth, clientAuth

[ alternate_names ]

DNS.1       = example.com
DNS.2       = www.example.com
DNS.3       = mail.example.com
DNS.4       = ftp.example.com

# Add these if you need them. But usually you don't want them or
#   need them in production. You may need them for development.
# DNS.5       = localhost
# DNS.6       = localhost.localdomain
# DNS.7       = 127.0.0.1

# IPv6 localhost
# DNS.8     = ::1
# DNS.9     = fe80::1

Potrebbe essere necessario eseguire le seguenti operazioni per Chrome. Altrimenti Chrome potrebbe lamentare un nome comune non valido ( ERR_CERT_COMMON_NAME_INVALID) . Non sono sicuro di quale sia la relazione tra un indirizzo IP nella SAN e una CN in questo caso.

# IPv4 localhost
# IP.1       = 127.0.0.1

# IPv6 localhost
# IP.2     = ::1

Potete per favore aggiungere il percorso predefinito al file di configurazione? - - Potete per favore mostrare il flusso di lavoro completo? Informazioni sul passaggio del file al comando openssl ecc. - - Non sono riuscito ad avere successo con la risposta precedente, quindi tutte le informazioni necessarie sono apprezzate.
Léo Léopold Hertz

@Masi - "Puoi per favore aggiungere il percorso predefinito al file di configurazione?" - Non sono sicuro cosa intendi. Puoi salvarlo dove vuoi. Lo eseguo dal desktop su molte macchine e la mia home directory su altre. Ho notato che hai usato sudo. Forse il tuo .rndfile è di proprietà di root. In tal caso, prova a sudo chown -R masi:masi /home/masi. Quindi sarai in grado di leggere da esso e scrivere ad esso.

Ora sto usando solo Debian, non Ubuntu, quindi solo root. Per favore, aggiungi il tuo flusso di lavoro come esempio sul file keepinv in Desktop e in avanti. Non ho un'immagine chiara del sistema.
Léo Léopold Hertz

1
Esegui uno dei comandi elencati all'inizio del file. I commenti ci sono per copia / incolla. Scegli quello che soddisfa i tuoi gusti. Se stai ancora cercando di generare un autofirmato, esegui il comando con x509esso (proprio come dice il commento).

L'autore ha richiesto la cancellazione di questo post "a causa di modifiche della CA / B", ma a causa del numero di voti e del potenziale aiuto fornito negli anni, l'ho ripristinato. Prendi il consiglio nel post come dato quando è stato dato.
Jeff Schaller

1

Il CommonNamedovrebbe essere corrispondono con ciò viene inviato come Host: nella richiesta HTTP. Nel tuo caso, sarebbe 192.168.1.107 (senza una barra finale).

Configurare il nome host per un server Web

Personalmente, configurerei un nome host amichevole per il server web. Nella tua configurazione di posta Apache o nella configurazione dell'host virtuale (probabilmente presente nelle /etc/apache2/sites-enabled/000-default.confdistribuzioni basate su Debian), usa la direttiva ServerNameo ServerAlias, ad es.

ServerName owncloud.masi

Riavvia Apache e quindi e configura DNS o (più semplicemente) aggiungi una voce in ciascun client /etc/hostsper indicarla all'indirizzo IP corretto, ad es.

192.168.1.107   owncloud.masi

L'accesso mycloud è a 192.168.1.107. L'altro thread dice che dovresti includere il sottodominio. Penso che implichi 192.168.1.107/owncloud. Tuttavia, posso sbagliarmi.
Léo Léopold Hertz

Supponiamo che lo usi ServerName owncloud.masiin .../sites-enabled/000-default.conf. Il nome comune della chiave SSL è quindi owncloud.masi ?
Léo Léopold Hertz

L'indirizzo IP smetterà di funzionare? Allo stesso modo se usi ServerAlias?
Léo Léopold Hertz

1
L'accesso tramite indirizzo IP dovrebbe continuare a funzionare per HTTP. A proposito, abbiamo raggiunto i limiti dei commenti (quindi ho eliminato le mie precedenti risposte alle tue domande) e dovrò andare offline presto.
Anthony G - giustizia per Monica l'

1
"Il CommonName deve corrispondere a tutto ciò che viene inviato come intestazione Host: nella richiesta HTTP" - Errato. Inserire un nome host è il nome comune è deprecato da entrambi i forum IETF e CA / B. I nomi dei server e gli indirizzi IP vanno sempre nel Nome alternativo soggetto per i forum IETF e CA / B. Vedi anche Come si firma la richiesta di firma del certificato con l'autorità di certificazione e come si crea un certificato autofirmato con openssl?
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.