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