This is an old revision of the document!


Project owner: embargo
Interested: dron, lichnak
Related:
License: WTFPL

Public Key Infrastructure

V tomto dokumentu chci nastínit základy provozování a používání PKI postavené na openssl. V první části představím nezbytné součásti a koncepty. Druhá část se bude věnovat reálným příkladům.

X.509 PKI je bezpečnostní architektura používající zavedené kryptomechanizmy k podpoře případů užití jako je ochrana e-mailove pošty, autentifikace (nejen) webových služeb. Je velice podobná jiným systémům založeným na užití veřejných klíčů, jako je například OpenPGP.

Postup vydání certifikátu

  1. Žadatel vygeneruje CSR1) a doručí jej do CA2).
  2. CA vystaví požadovaný certifikát dle poskytnutého CSR a vrátí jej žadateli.
  3. V případě, že je z libovolného důvodů vystavený certifikát revokován, CA jej přidá do jejího CRL3).

Součásti PKI

  • Public Key Infrastructure (PKI)
    • Bezpečnostní architektura, kde je důvěra založena na podpisu důvěryhodné certifikační autority.
  • Certifikační autorita (CA)
    • Entita vystavující certifikáty a CRL.
  • Registrační autorita (RA)
    • Entita starající se o zápisy do PKI. Může být stejná jako CA.
  • Certifikát
    • Veřejný klíč a jeho ID svázané podpisem CA.
  • Certificate Signing Request (CSR)
    • Žádost o certifikaci. Obsahuje veřejný klíč a ID, které mají být certifikovány.
  • Certificate Revocation List (CRL)
    • Seznam revokovaných certifikátů. V pravidelných intervalech je vystavován CA.
  • Certification Practice Statement (CPS)
    • Politika popisující strukturu a procesy konkrétní CA.

Typy certifikačních autorit

  • Root CA
    • Také se označuje jako kořenová. Je to autorita na vrcholu PKI hierarchie. Vydává certifikáty pro mezilehlé certifikační autority.
  • Intermediate CA
    • Mezilehlá certifikační autorita. Nepoužívá se k vydávání koncových certifikátů, vydává certifikáty pro podpisové CA.
  • Signing CA
    • Podepisující autorita. Nachází se na spodku PKI hierarchie a slouží k vydávání koncových certifikátů.

Typy certifikátů

  • CA certificate
    • Je to certifikát samotné certifikační autority. Slouží k podpisu dalších certifikátů a CRL.
  • Root certificate
    • Neboli kořenový certifikát. Je podepsány sám sebou (šelf-signed) a slouží jako počáteční bod řetězce důvěry.
  • Cross certificate
    • Křížový certifikát. Je to certifikát CA podepsaný externí certifikační autoritou.
  • User certificate
    • Koncový certifikát vydaný pro jeden nebo více použití, například ochrana e-mailové komunikace, ověření serverů nebo uživatele atd. Jako jediný nemůže být použit k podpisu dalších certifikátů.

Formáty certifikátů

  • Privacy Enhanced Mail (PEM)
    • Textový formát, zakódovaný pomocí base64. Používá se všude tam, kde je použito openssl (Apache mód_ssl, nginx, stunnel, …)
  • Distinguished Encoding Rules (DER)
    • Binární formát používaný v MS prostředí.
create-certs-CA-LDAPS.sh
# CA & LDAPS
# https://www.happyassassin.net/2015/01/14/trusting-additional-cas-in-fedora-rhel-centos-dont-append-to-etcpkitlscertsca-bundle-crt-or-etcpkitlscert-pem/
# https://access.redhat.com/documentation/en-us/red_hat_directory_server/9.0/html/administration_guide/managing_ssl-using_certificate_based_authentication
# https://www.server-world.info/en/note?os=CentOS_7&p=openldap&f=4
# https://www.petri.com/enable-secure-ldap-windows-server-2008-2012-dc
# https://blogs.msdn.microsoft.com/microsoftrservertigerteam/2017/04/10/step-by-step-guide-to-setup-ldaps-on-windows-server/
# https://social.technet.microsoft.com/wiki/contents/articles/2980.ldap-over-ssl-ldaps-certificate.aspx
# http://directory.fedoraproject.org/docs/389ds/howto/howto-certmapping.html
# http://javadoc.iaik.tugraz.at/iaik_jce/current/iaik/x509/extensions/ExtendedKeyUsage.html
 
## guide
# 1> Set the password:
$ echo "<Your Very Secure Password>" > passwd
 
# 2> Create a root CA:
$ openssl req-x509 -newkey rsa:4096 -keyout myCA.key -out myCA.pem -days 3650 \
 -subj "/C=CZ/L=Ostrava/O=Labka/OU=Infra/CN=ldap.labka.cz/emailAddress=admin@admin" \
 -passout file:passwd
 
# 3> Strip the password from RSA key:
$ openssl rsa -in myCA.key -out myCA_nopass.key -passin file:passwd
 
# 4> Export CA certificate bundle along with the private key in PFX format:
$ openssl pkcs12 -export -in myCA.pem -inkey myCA.key \
 -passin pass:$(<passwd) -out CA.pfx -passout file:passwd
 
# 5> Create CSR configuration template for LDAPS:
$ cat <<EOT >myCSR.cnf
basicContrains=CA:FALSE
keyUsage=nonRepudiation,digitalSignature,keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
subjectAltName=DNS:LDAP.LABKA.CZ,DNS:LABKA.CZ,IP:192.168.1.1
EOT
 
# 6> Create LDAPS CSR:
$ openssl req -out myCSR.csr -newkey rsa:4096 -nodes -keyout myCSR.key \
 -subj "/C=CZ/L=Ostrava/O=Labka/OU=Infra/CN=ldap.labka.cz/emailAddress=admin@admin"
 
# 7> Create signing request using LDAPS required attribute
$ openssl x509 -CA myCA.pem -CAkey myCA_nopass.key -CAcreateserial -req -in myCSR.csr -days 3650 \
 -extfile myCSR.cnf -out myCSR.pem
 
# 8> Export signed LDAPS certificate bundle in PFX format:
$ openssl pkcs12 -export -in myCSR.pem -inkey myCSR.key -out ldaps.pfx -passout file:passwd
 
# 9> Do the security clean-up
$ rm -f passwd
 
# 10> Import Root Certificate
$ openssl pkcs12 -in CA.pfx -nocerts -out myCA.key
$ openssl rsa -in myCA.key -out myCA.decrypted.key
$ openssl pkcs12 -in CA.pfx -clcerts -nokeys -out myCA.crt
$ update-ca-trust enable
$ cp myCA.crt /etc/pki/ca-trust/source/anchors/
$ update-ca-trust extract
$ openssl verify myCA.crt
 
# 11> Import LDAPS Certificate
$ openssl pkcs12 -in ldaps.pfx -nocerts -out ldaps.key
$ openssl rsa -in ldaps.key -out ldaps.decrypted.key
$ openssl pkcs12 -in ldaps.pfx -clcerts -nokeys -out ldaps.crt
$ cp /etc/pki/tls/certs/server.key \
 /etc/pki/tls/certs/server.crt \
 /etc/pki/tls/certs/ca-bundle.crt \
 /etc/openldap/certs/ 
$ update-ca-certificates
$ openssl verify ldaps.crt
 
# 12> Verify LDAPS connection
$ adtool list 'CN=Users,DC=labka,DC=cz'

1)
Certificate Signing Request
2)
Certificate Authority
3)
Certificate Revocation List
  • project/pki.1504541252.txt.gz
  • Last modified: 2017/09/04 18:07
  • by licho