GNU/Linux >> Linux Esercitazione >  >> Linux

Autorità di certificazione con OpenSSL

Questo articolo ti mostrerà come configurare un'autorità di certificazione con OpenSSL. I certificati digitali sono documenti utilizzati per provare la proprietà di una chiave pubblica. Ad esempio, un certificato digitale viene utilizzato per autenticare un sito Web a cui si accede tramite HTPS. Un altro esempio di uso comune è la firma dei documenti.

I certificati includono informazioni sulla chiave, l'identità del suo proprietario e la firma digitale di un'entità che ne ha verificato il contenuto. Un'autorità di certificazione (CA) è l'organizzazione che emette i certificati digitali.

Inoltre questo articolo mostrerà come dire ad altri host di fidarsi dei certificati emessi.

Avviso :questo dovrebbe essere solo a scopo di test o proof of concept. Per usi nella vita reale dovresti acquisire certificati reali da una vera autorità di certificazione. Ad esempio, se vuoi solo HTTPS e vuoi il certificato gratuitamente, vai su https://letsencrypt.org/

Installa OpenSSL

Il mio sistema operativo principale è FreeBSD e mi piace usare l'albero dei port, per installarlo basta eseguire:

# cd /usr/ports/security/openssl
# make install clean

E attendi che la compilazione e l'installazione del port siano pronte. Fai attenzione che probabilmente hai già un eseguibile openssl (sotto /usr/bin path) e se lo installi comunque il binario 'port' sarà in /usr/local /bin/openssl.

La prima volta che mi sono occupato di OpenSSL, il binario fornito non ha funzionato per me, ma la porta sì.

File di configurazione

Sebbene il mio sistema operativo principale sia FreeBSD, d'ora in poi, dovrebbero essere gli stessi passaggi su qualsiasi sistema operativo che supporta OpenSSL. Forse devi modificare alcuni percorsi, ma questo è tutto.

Troverai (di nuovo, in FreeBSD) un esempio e un file di configurazione ben commentato in /usr/local/openssl/openssl.conf. Questo è mio dopo un po' di pulizia, ho evidenziato le impostazioni più importanti:

#OpenSSL Home current directory
HOME                    = /var/openssl #choose any reasonable location
#RANDFILE                = $ENV::HOME/.rnd

# Extra OBJECT IDENTIFIER info:
oid_section             = new_oids

[ new_oids ]
tsa_policy1 = 1.2.3.4.1
tsa_policy2 = 1.2.3.4.5.6
tsa_policy3 = 1.2.3.4.5.7

[ ca ]
default_ca      = YourCA              # The default Certificate Authority section

[ YourCA ] #most important section of your file
dir             = /var/openssl/yourCA           # Where everything is kept
                                                              # choose any reasonable location
certs           = $dir/certs            # Where the issued certs are kept
crl_dir         = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # database index file.
new_certs_dir   = $dir/newcerts         # default place for new certs.
certificate     = $dir/CA/yourCA.crt  # The CA certificate
serial          = $dir/serial           # The current serial number
#crlnumber       = $dir/crlnumber        # the current crl number
                                        # must be commented out to leave a V1 CRL
crl             = $dir/CA/yourCA.crl  # The current CRL
private_key     = $dir/CA/yourCA.key  # The private key
RANDFILE        = $dir/private/.rand    # private random number file
x509_extensions = usr_cert              # The extentions to add to the cert

# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt        = ca_default            # Subject Name options
cert_opt        = ca_default            # Certificate field options

default_days    = 365                   # how long to certify for
default_crl_days= 30                    # how long before next CRL
default_md      = default               # use public key default MD
preserve        = no                    # keep passed DN ordering
policy          = policy_match

# For the CA policy
[ policy_match ]
countryName             = match
stateOrProvinceName     = supplied
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional
localityName            = supplied

# For the 'anything' policy. At this point in time, you must list all 
# acceptable 'object' types.
[ policy_anything ]
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

############################################################
[ req ]
default_bits            = 2048
default_keyfile         = privkey.pem
distinguished_name      = req_distinguished_name
attributes              = req_attributes
x509_extensions = v3_ca # The extentions to add to the self signed cert
string_mask = utf8only

[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
countryName_default             = AR #I'm on ARgentina
countryName_min                 = 2
countryName_max                 = 2

stateOrProvinceName             = State or Province Name (full name)
stateOrProvinceName_default     = Salta # i.e. the province I live on

localityName                    = Locality Name (eg, city)

0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = Your company name

organizationalUnitName          = Organizational Unit Name (eg, section)
organizationalUnitName_default  = Section Name. # eg. IT
commonName                      = Common Name (e.g. server FQDN or YOUR name)
commonName_max                  = 64

emailAddress                    = Email Address
emailAddress_max                = 64

[ req_attributes ]
challengePassword               = A challenge password
challengePassword_min           = 4
challengePassword_max           = 20
unstructuredName                = An optional company name

[ usr_cert ]
basicConstraints=CA:FALSE
nsComment                       = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer

[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment

[ v3_ca ]
# Extensions for a typical CA
# PKIX recommendation.
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = CA:true

[ crl_ext ]
authorityKeyIdentifier=keyid:always

[ proxy_cert_ext ]
basicConstraints=CA:FALSE
nsComment                       = "OpenSSL Generated Certificate"
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
# This really needs to be in place for it to be a proxy certificate.
proxyCertInfo=critical,language:id-ppl-anyLanguage,pathlen:3,policy:foo

[ tsa ]
default_tsa = tsa_config1       # the default TSA section

[ tsa_config1 ]
# These are used by the TSA reply generation only.
dir             = ./demoCA              # TSA root directory
serial          = $dir/tsaserial        # The current serial number (mandatory)
crypto_device   = builtin               # OpenSSL engine to use for signing
signer_cert     = $dir/tsacert.pem      # The TSA signing certificate
                                        # (optional)
certs           = $dir/cacert.pem       # Certificate chain to include in reply
                                        # (optional)
signer_key      = $dir/private/tsakey.pem # The TSA private key (optional)
default_policy  = tsa_policy1           # Policy if request did not specify it
                                        # (optional)
other_policies  = tsa_policy2, tsa_policy3      # acceptable policies (optional)
digests         = md5, sha1             # Acceptable message digests (mandatory)
accuracy        = secs:1, millisecs:500, microsecs:100  # (optional)
clock_precision_digits  = 0     # number of digits after dot. (optional)
ordering                = yes   # Is ordering defined for timestamps?
                                # (optional, default: no)
tsa_name                = yes   # Must the TSA name be included in the reply?
                                # (optional, default: no)
ess_cert_id_chain       = no    # Must the ESS cert id chain be included?
                                # (optional, default: no)

Glossario

Prima di continuare un piccolo glossario degli acronimi utilizzati nel file:

  • CA:sta per Certificate Authority
  • CRL:sta per Elenchi di revoche di certificati
  • CSR:sta per Certificate Signing Request
  • MD:sta per Message Digest
  • TSA:sta per Time Stamping Authority

Archivio certificati

Quindi, crea le directory e i file (per ora vuoti) in cui archiviare le nostre chiavi e certificati:

# cd /var/openssl
# mkdir -p yourCA/CA
# mkdir -p yourCA/newcerts
# mkdir -p yourCA/certs/keys
# mkdir -p yourCA/certs/requests
# mkdir -p yourCA/certs/certificates
# cd yourCA
# touch index.txt
# echo 01 > serial

Certificato CA

Ora puoi creare il tuo certificato di autorità di certificazione e firmarlo. Ma prima, dobbiamo creare una chiave privata con il seguente comando:

# /usr/local/bin/openssl genrsa -out yourCA/CA/yourCA.key 2048

In secondo luogo, crea una CSR eseguendo:

# /usr/local/bin/openssl req -new -key ./yourCA/CA/yourCA.key -out yourCA/CA/yourCA.csr

Segui le istruzioni sullo schermo, prestando attenzione a inserire le informazioni corrette. Infine, autofirma il tuo certificato:

# /usr/local/bin/openssl x509 -req -days 365 \
> -in yourCA/CA/yourCA.csr -out yourCA/CA/yourCA.crt \
> -signkey yourCA/CA/yourCA.key

Ed ecco fatto:ora puoi iniziare a firmare i tuoi certificati client e/o web

Certificati cliente

Il processo è abbastanza simile a quello precedente. Ma stiamo usando il nostro certificato CA per firmare il certificato client. E, idealmente, il cliente genererà la propria chiave privata e la CSR.

Ad ogni modo, stiamo solo testando le cose, quindi sto facendo ogni passaggio e quindi distribuendo i certificati generati al mio utente. I seguenti comandi possono essere eseguiti ovunque, ma solo per mantenere un po' di ordine sto usando le cartelle precedentemente create (sotto /var/openssl/yourCA/certs ). Il nostro utente, John Doe, ha bisogno prima di una chiave privata:

# cd /var/openssl/yourCA/certs
# /usr/local/bin/openssl genrsa -des3 -out keys/johndoe.key 2048

Non dimenticare la passprhase che verrà richiesta più volte; quindi crea la richiesta di firma del certificato:

# /usr/local/bin/openssl req -new -key keys/johndoe.key -out requests/johndoe.csr

Quindi, firma il certificato con questo comando:

# /usr/local/bin/openssl ca -in requests/johndoe.csr -cert ../CA/yourCA.crt -keyfile ../CA/yourCA.key -out certificates/johndoe.crt

Infine, esporta il certificato nel formato PKCS12, ti verrà richiesta la passphrase della PK:

# /usr/local/bin/openssl pkcs12 -export -clcerts -in certificates/johndoe.crt -inkey keys/johndoe.key -out certificates/johndoe.p12

Installazione del certificato

Ora puoi emettere i tuoi certificati necessari all'utente per installarli per poterlo utilizzare. Devi fornire due file:yourCA.crt e johndoe.p12 personale.

Per installarlo su Windows utilizzare lo strumento Gestione certificati. Non sto caricando diversi screenshot perché, poiché le mie finestre sono in spagnolo, non lo troverei molto utile. Fare clic sul menu di avvio ed eseguire "certmgr.msc", verrà visualizzata la seguente schermata:

Fare clic con il tasto destro del mouse sulla cartella Root Certification Authority e scegliere "Importa". Inizia con yourCA.crt e scegli l'Autorità di certificazione radice del negozio, segui la procedura guidata.

Ora fai clic con il tasto destro sulla cartella Personale e ripeti la procedura guidata con il file johndoe.p12. Ti verrà richiesta la passprhase. Al termine della procedura guidata puoi vedere il certificato valido installato e i dettagli:

Ricorda, questo è solo a scopo di apprendimento. Ma questa è anche una questione di fiducia. Se la tua organizzazione è abbastanza piccola e c'è fiducia, dovresti essere in grado di lavorare con questi certificati fai-da-te.


Linux
  1. Test delle connessioni SSL con SSLyze, Nmap o OpenSSL

  2. Come generare una richiesta di firma del certificato (CSR) con OpenSSL?

  3. Come compilare il file .c con OpenSSL include?

  4. Utilizzo di openssl per ottenere il certificato da un server

  5. Come impostare la mia autorità di certificazione completa?

Crea la tua autorità di certificazione (CA) in CentOS/RHEL

Come generare certificati SSL autofirmati utilizzando OpenSSL

Sostituisci un certificato SHA-1 con un certificato SHA-2 in Plesk

Proteggi Nginx con Let's Encrypt SSL Certificate su Ubuntu 18.04

Come proteggere Nginx con Let's Encrypt certificato SSL

Come generare un certificato openssl con scadenza inferiore a un giorno?