GNU/Linux >> Znalost Linux >  >> Linux

Certifikační autorita s OpenSSL

Tento článek vám ukáže, jak nastavit certifikační autoritu s OpenSSL. Digitální certifikáty jsou dokumenty používané k prokázání vlastnictví veřejného klíče. Například digitální certifikáty se používají k autentizaci navštívených webových stránek prostřednictvím HTPS. Dalším příkladem běžného použití je podepisování dokumentů.

Certifikáty obsahují informace o klíči, identitě jeho vlastníka a digitálním podpisu entity, která ověřila obsah. Certifikační autorita (CA) je organizace, která vydává digitální certifikáty.

Tento článek také ukáže, jak sdělit ostatním hostitelům, aby důvěřovali vydaným certifikátům.

Upozornění :toto by mělo být pouze pro testovací účely nebo pro ověření konceptu. Pro skutečné použití byste měli získat skutečné certifikáty od skutečné certifikační autority. Pokud například chcete pouze HTTPS a chcete certifikát zdarma, přejděte na https://letsencrypt.org/

Nainstalujte OpenSSL

Můj hlavní OS je FreeBSD a rád používám strom portů, k instalaci stačí spustit:

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

A počkejte, až bude připravena kompilace a instalace portu. Věnujte pozornost tomu, že pravděpodobně již máte spustitelný soubor openssl (v cestě /usr/bin) a pokud jej přesto nainstalujete, binární soubor ‚port‘ bude v /usr/local /bin/openssl.

Když jsem se poprvé zabýval OpenSSL, poskytnutý binární soubor mi nefungoval, ale port ano.

Konfigurační soubor

Ačkoli můj hlavní OS je FreeBSD, od této chvíle by měly být stejné kroky na jakémkoli OS, který podporuje OpenSSL. Možná budete muset upravit některé cesty, ale to je vše.

Příklad a dobře komentovaný konfigurační soubor najdete (opět ve FreeBSD) v /usr/local/openssl/openssl.conf. Toto je po nějakém vyčištění moje, zdůraznil jsem nejdůležitější nastavení:

#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)

Glosář

Než budeme pokračovat, malý glosář zkratek použitých v souboru:

  • CA:znamená certifikační autoritu
  • CRL:je zkratka pro Certificate Revocation Lists
  • CSR:je zkratka pro Certificate Signing Request
  • MD:je zkratka pro Message Digest
  • TSA:znamená Time Stamping Authority

Úložiště certifikátů

Dále vytvořte adresáře a (zatím prázdné) soubory pro uložení našich klíčů a certifikátů:

# 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

Certifikát CA

Nyní můžete vytvořit certifikát certifikačního úřadu a podepsat jej. Nejprve však musíme vytvořit soukromý klíč pomocí následujícího příkazu:

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

Za druhé, vytvořte CSR spuštěním:

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

Postupujte podle pokynů na obrazovce a věnujte pozornost vyplnění správných informací. Nakonec svůj certifikát podepište sami:

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

A je to:nyní můžete začít podepisovat klientské nebo webové certifikáty

Klientské certifikáty

Proces je velmi podobný předchozímu. K podpisu klientského certifikátu však používáme náš certifikát CA. A v ideálním případě si klient vygeneruje vlastní soukromý klíč a CSR.

Každopádně věci jen testujeme, takže dělám každý krok a poté distribuuji vygenerované certifikáty svému uživateli. Následující příkazy lze spouštět kdekoli, ale abych zachoval pořádek, používám dříve vytvořené složky (pod /var/openssl/yourCA/certs ). Náš uživatel, John Doe, potřebuje nejprve soukromý klíč:

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

Nezapomeňte na přístupovou frázi, která bude několikrát dotázána; dále vytvořte žádost o podpis certifikátu:

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

Dále podepište certifikát tímto příkazem:

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

Nakonec exportujte certifikát do formátu PKCS12, budete požádáni o heslo PK:

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

Instalace certifikátu

Nyní můžete vydávat své vlastní certifikáty, které uživatel potřebuje k instalaci, aby jej mohl používat. Potřebujete doručit dva soubory:yourCA.crt a osobní johndoe.p12.

Chcete-li jej nainstalovat do systému Windows, použijte nástroj Správce certifikátů. Nenahrám několik screenshotů, protože moje okna jsou ve španělštině, nepovažoval bych to za příliš užitečné. Klikněte na nabídku Start a spusťte „certmgr.msc“, objeví se následující obrazovka:

Klikněte pravým tlačítkem myši na složku Kořenová certifikační autorita a zvolte „Importovat“. Začněte s yourCA.crt a vyberte kořenovou certifikační autoritu obchodu, postupujte podle průvodce.

Nyní klikněte pravým tlačítkem myši na složku Osobní a opakujte průvodce se souborem johndoe.p12. Budete požádáni o heslo. Po dokončení průvodce uvidíte nainstalovaný platný certifikát a podrobnosti:

Pamatujte, že toto je pouze pro účely učení. Ale to je také otázka důvěry. Pokud je vaše organizace dostatečně malá a existuje důvěra, měli byste být schopni pracovat s těmito certifikáty pro vlastní potřebu.


Linux
  1. Jak vygenerovat žádost o podpis certifikátu (CSR) s OpenSSL?

  2. Vygenerujte žádost o podpis certifikátu

  3. Jak zkompilovat .c soubor s OpenSSL zahrnuje?

  1. Testování připojení SSL pomocí SSLyze, Nmap nebo OpenSSL

  2. Nepodařilo se podepsat Csr pomocí kořenového klíče Ca?

  3. Generovat otisky prstů Hpkp pro všechny řetězce certifikátů?

  1. Pomocí openssl získáte certifikát ze serveru

  2. Openssl:chyba certifikátu s vlastním podpisem v řetězci certifikátů

  3. Jak nastavit vlastní plnohodnotnou certifikační autoritu?