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.