OpenSSL ja CA:n luominen

Netistä saa metsästää oikein urakalla, että saa tarvittavat palaset CA:n luomiseen OpenSSL:llä. Peruspaketista löytyy kyllä CA:n konffis, mutta se on mielestäni ihan päin mäntyä. Minä tein CA:n omien tietämysteni ja CA/B forumin ohjeisiin pohjaten. Tällä päästään ratkaisuun, jonka pitäisi kantaa pitkälle.

Mietittävää

Avaimen koko: 1024 ei ole enää suositeltu CA:n avaimen koko (ref:NIST 800-57, part 3), 2048 riittää nykytietämyksen mukaan, 4096 on “varma”
Avaimen salasana: kaksi piippuinen juttu. Täysin automatisoitua CRL:n luontia varten salasana pitää syöttää skripteihin, joten kotionline CA:n avainta ei ehkä kannata salata. Toisaalta jos salasanaan menee, oleellista on valittu salausalgoritmi ja salasanan pituus. AES-128 bittinen vaatii kaveriksieen 23 merkkiä pitkän salasanan (a-z,A-Z,0-9 aakkosto), jotta salasana olisi yhtä vahva kuin  algoritmi. 25 vuotta voimassa oleva avain kaipaa järeämpää salausta ja vastaavasti useita kymmeniä merkkejä pitkän salasanan.
Allekirjoitusalgoritmi: MD5 on heikko, eikä suositeltava. SHA1 on yhtä vahva kuin 1024 bittinen avain. SHA256 on 2048:n kanssa oikea pari. Huomioitavaa on että SHA256 ei ole kaikkien vempainten tukema. Esimerkiksi 2010 vuoden Tomato firmwaressa oleva OpenVPN ei tue SHA256:sta. Vanhat älypuhelimet, eivät välttämättä tue ja näin lista jatkuu.

Nämä asiat kun on mietittynä lähdetään CA:n luontiin.

Pohjatyöt

Tarvitsemme OpenSSL:n  valitsemallemme käyttikselle. Linuxien tapauksessa pakettienhallinnasta löytyy, Windowsin tapauksesta täältä löytyy.
Seuraavanlainen hakemisto rakenne on tarpeen

/LeivoCA 
  |-/certs 
  |-/newcerts 
  |-/crl 
  |-/private

CA:n juurihakemistosta (/LeivoCA) pitää löytyä seuraavat tiedostot

index.txt 
index.txt.attr 
serial (tämän tiedoston sisältä pitää löytyä sarjanumero hex-muodossa, joten laita sinne vaikka 01) 
crlnumber (tämän tiedoston sisältä pitää löytyä sarjanumero hex-muodossa, joten laita sinne 00)

Hakemistoihin oikat pitää rajata hyvin hyvin tiukaksi. Root tai Administrator pääsy on ainut hyväksyttävä pääsy, jos kokee että CA:ta tulee ajaa jollain muulla tunnuksella, sille tarpeelliset oikat. Näiden käyttäjien oikeuksien lisäksi mitään muita oikeuksia hakemistoihin ei tule olla.

Konfiguraatiotiedosto

Tässä on konffitiedosto paloiteltuna osiin. Tämä konfiguraatiotiedosto on tarkoitettu vain juuriCA:lle. Varsinaisen tiedoston löydät täältä.

Tässä osuudessa määritellään kotihakemisto ja tiedostojen sijainti. Korjaa hakemistot täsmäämään tarpeisiisi.

# 
# OpenSSL configuration for Leivo Root 
#
# This definition stops the following lines choking if HOME isn't 
# defined. 
HOME            = . 
RANDFILE        = $ENV::HOME/.rnd
#################################################################### 
[ ca ] 
default_ca    = Leivo_Root        # The default ca section
############################# Defining CA ###################################### 
[ Leivo_Root ]
dir        = d:/temp/testCA    # Where everything is kept 
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/Leivo_Root.pem    # The CA certificate 
serial        = $dir/serial         # The current serial number 
crlnumber    = $dir/crlnumber    # the current crl number 
crl        = $dir/crl.pem         # The current CRL 
private_key    = $dir/private/root-ca.key # The private key 
RANDFILE    = $dir/private/.rand    # private random number file 
string_mask    = utf8only

######################## End of defining CA ####################################

Tässä osuudessa määritellään yleisesti ottaen varmenteen allekirjoittamiseen liittyvät palaset. Laajennukset, nimeämiskäytännöt, CRL voimassaolo aika, allekirjoitusalgoritmi.

#################### Defining certificate signing ############################## 
x509_extensions    = v3_ca        # The extentions to add to the cert 
name_opt     = ca_default        # Subject Name options 
cert_opt     = ca_default        # Certificate field options
crl_extensions    = crl_ext
default_days    = 3650            # how long to certify for 
default_crl_days= 365             # how long before next CRL 
default_md    = sha256        # use public key default MD 
preserve    = no            # keep passed DN ordering
policy        = policy_match
# For the CA policy 
[ policy_match ] 
countryName        = match 
organizationName    = match 
commonName        = supplied 
emailAddress               = optional

################## End of defining certificate signing #########################

Tämän osuuden jälkeen määritellään laajennukset. Tässä tulee se varsinainen pihvi varmenteille.

v3_ca_root –osuus määrittelee juurivarmenteen. Olen rajannut juuren alla olevien CA:n määrän yhteen (pathlen:1)

v3_ca –osuus on subCA:lle tarkoitettu osuus.  Pathlen on 0, sillä subCA:lla ei voi alla olevia CA:ta. SubCA:lle on myös määritelty CRL, mikä on juuriCA:n CRL.

[ crl_ext ] 
  authorityKeyIdentifier    = keyid:always
[ v3_ca_root ] 
  subjectKeyIdentifier        = hash 
  authorityKeyIdentifier    = keyid:always,issuer 
  basicConstraints         = CA:true, pathlen:1 
  keyUsage             = cRLSign, keyCertSign, digitalSignature
[ v3_ca ] 
  subjectKeyIdentifier        = hash 
  authorityKeyIdentifier    = keyid:always,issuer 
  basicConstraints         = critical, CA:true, pathlen:0 
  crlDistributionPoints     = URI:http://crl.leivo.org/Rootca-crl.pem
########################### Basic SSL request ################################## 
[ req ] 
  default_bits        = 2048 
  default_keyfile     = privkey.pem 
  distinguished_name    = req_distinguished_name 
  req_extensions    = extensions 
  string_mask        = utf8only
[ req_distinguished_name ] 
countryName            = Country Name (2 letter code) 
countryName_default        = FI 
countryName_min            = 2 
countryName_max            = 2
0.organizationName        = Organization Name (eg, company) 
0.organizationName_default    = Leivo.org
# get the DN name for the certificate 
commonName            = Server FQDN 
commonName_max            = 64
[ extensions ] 
  subjectKeyIdentifier        = hash 
  basicConstraints         = critical,CA:true, pathlen:0 
  keyUsage             = cRLSign, keyCertSign, digitalSignature

######################### End basic SSL request ################################

Juuren, sub:n ja CRL:n luonti

Juuren avaimen luonti

openssl genrsa -aes256 -out testCA\private\root-ca.key 4096

Juuren itse itsensä allekirjoittaminen

openssl req -new -x509 -days 9125 -key testCA\private\root-ca.key -out testCA\Leivo_Root.pem -extensions v3_ca_root -sha256 -config testca.cnf

CRL:n luominen

openssl ca -config testca.cnf -gencrl -out testCA\crl\Rootca-crl.pem

SubCA:n luonti

openssl req -out subca.csr -pubkey -new -keyout subca.key -config testca.cnf

SubCA:n allekirjoittaminen

openssl ca -config testca.cnf -extensions v3_ca -out subca.crt -infiles subca.csr

Juuren sammuttaminen

Lopuksi kopioidaan koneelta ulos

  • Leivo_Root.pem (JuuriCA:n varmenne)
  • Rootca-crl.pem (JuuriCA:n CRL)
  • subca.key (SubCA:n privaattiavain, TÄMÄ SIIRRETÄÄN, ei kopioida!)
  • subca.crt (SubCA:n varmenne)

Ja näin, iso työ on tehty. Seuraavaksi subCA:n konffaus, ensimmäiset SSL varmenteet, automaattinen CRL julkaisu ja muu työ.

Leave a Reply