#language cs
## 20190921 AK
----
 '''česky''' | [[HowToDocuments/FingerprintsViaDNSSEC|english]]
----
= Ověření "otisků prstů" pomocí DNSSEC =

K ověření, zda jsou "otisky prstů" (fingerprints) stažených kořenových certifikátů správné, lze použít TXT záznamy v DNS domény cacert.org, chráněné zabezpečením DNSSEC.

Informace o "otiscích prstů" (fingerprints) jsou uloženy v zóně DNS s názvem _fp.cacert.org - znak podtržítko indikuje ne-hostitelskou informaci. Pro každou generaci kořenových certifikátů bude vytvořen nový podadresář. Ten současný se nazývá "g1". K získání seznamu všech dostupných certifikátů určité generace se můžete dotázat návěstí _certs onoho podadresáře dotazem na DNS pro _certs.g1._fp.cacert.org, což poskytne dva názvy certifikátů "root_X0F class3_X0E". Každý z těchto odkazů zase poskytne jak URL ("_url"), tak sadu "otisků prstů" (algoritmy _md5, _sha1, _sha256) potřebnou pro ověřené stažení příslušného certifikátu. Ke stažení současného (g1) kořenového certifikátu byste tedy měli vyhledat URL pro stažení na _url.root_X0F.g1._fp.cacert.org a ověřit "otisk prstu" SHA2-256 na _sha256.root_X0F.g1._fp.cacert.org. "Otisky prstů" jsou vždy psány písmeny velké abecedy a bez oddělovačů.

/!\ Při používání příkazů a skriptů vždy začínejte záznamem záhlaví _certs.g1._fp.cacert.org, který v současné době dává „root_X0F class3_X0E“. Pokud materiál místo toho používá „root class3“, je zastaralý a měl by být implementován první dotaz.

Pro krátký test v Linuxu provede kontrolu následující kód. Pro použití v provozu zajistěte, aby byly odpovědi DNS ověřeny. Toho lze dosáhnout instalací ověřovacího vyhodnocovače (resolveru) [1, 2]. Pro správné nastavení DNSSEC v případě potřeby jednejte podle pokynů k distribucím.
 . [Po znaku $ je vždy uveden příkaz, ostatní řádky jsou odpovědi.]
{{{

$ host -t TXT _url.root_X0F.g1._fp.cacert.org.
_url.root_X0F.g1._fp.cacert.org descriptive text "http://www.cacert.org/certs/root_X0F.crt"
$ host -t TXT _sha256.root_X0F.g1._fp.cacert.org.
_sha256.root_X0F.g1._fp.cacert.org descriptive text "07EDBD824A4988CFEF4215DA20D48C2B41D71529D7C900F570926F277CC230C5"
$ wget -O root_X0F.crt 'http://www.cacert.org/certs/root_X0F.crt'
$ openssl x509 -in root_X0F.crt -noout -fingerprint -sha256 | tr -d :
SHA256 Fingerprint=07EDBD824A4988CFEF4215DA20D48C2B41D71529D7C900F570926F277CC230C5

}}}

V systému Windows lze tytéž údaje zjistit programem "nslookup":
{{{

>nslookup
Default Server:  my.dnssrv.eu
Address:  2001:470:6f:458:c56d:5931:992:4708
> set type=TXT
> _url.root_X0F.g1._fp.cacert.org.
Server:  my.dnssrv.eu
Address:  2001:470:6f:458:c56d:5931:992:4708
Non-authoritative answer:
_url.root_X0F.g1._fp.cacert.org     text =
        "http://www.cacert.org/certs/root_X0F.crt"
> _sha256.root_X0F.g1._fp.cacert.org.
Server:  my.dnssrv.eu
Address:  2001:470:6f:458:c56d:5931:992:4708
Non-authoritative answer:
_sha256.root_X0F.g1._fp.cacert.org  text =
        "07EDBD824A4988CFEF4215DA20D48C2B41D71529D7C900F570926F277CC230C5"
> _url.class3_X0E.g1._fp.cacert.org.
Server:  my.dnssrv.eu
Address:  2001:470:6f:458:c56d:5931:992:4708
Non-authoritative answer:
_url.class3_X0E.g1._fp.cacert.org   text =
        "http://www.cacert.org/certs/class3_X0E.crt"
> _sha256.class3_X0E.g1._fp.cacert.org.
Server:  my.dnssrv.eu
Address:  2001:470:6f:458:c56d:5931:992:4708
Non-authoritative answer:
_sha256.class3_X0E.g1._fp.cacert.org        text =
        "F6873D70D67596C2ACBA34401E69738B52701DD6AB06B49749BC55150936D544"
> exit

}}}

Níže je vypsán malý skript pro Linux, který provede ověření (je-li systémový resolver [součást operačního systému, řešící převod názvu DNS na IP-adresy a výpis záznamů DNS] správně konfigurován). Návratový stav je 0 při úspěšném ověření, jinak je nenulový (chyby 3, 4 a 5 mohou indikovat, že systémový resolver nepracuje se záznamy DNSSEC).

/!\ Skript není funkční, alespoň na Ubuntu 15.10 - končí kódem 3 na řádku 8. /!\
 * Upravený skript s původními řádky v poznámce bezprostředně před upravenými: [[attachment:CAcert-roots-fingerprint-test.sh]]. V původním skriptu vypsaném níže jsou to řádky: 8, 10, 24, 26, 33, 35.
 * Příčiny: 
  1. Ve výpisu se (již?) nevyskytuje flag "ad" - nahrazen "rd".
  1. Ve výpisu se nevyskytují žádné řádky obsahující " RRSIG".

{{{
#!highlight bash
#!/bin/bash

# Ziskam seznam dostupnych korenovych certifikatu (nazvy)
TMP_RESPONSE=___root___$$.tmp
dig +nocmd +comments +nostats +norrcomments +dnssec IN TXT _certs.g1._fp.cacert.org. > ${TMP_RESPONSE} || exit 1

grep -q '^;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: ' ${TMP_RESPONSE} || exit 2
grep '^;; flags:' ${TMP_RESPONSE} | cut '-d;' -f3 | cut -d: -f2 | grep -q ad || exit 3
grep '^; EDNS:' ${TMP_RESPONSE} | tr ";," "\n\n" | grep flags | cut -d: -f2 | grep -q do || exit 4
grep -v '^;' ${TMP_RESPONSE} | grep -q RRSIG || exit 5

ROOTS=$(grep -v '^;' "${TMP_RESPONSE}" | grep -v " RRSIG " | grep TXT | cut '-d"' -f2 | head -1)
printf "Nalezeny koreny: %s\n\n" "$ROOTS"

rm -f -- "${TMP_RESPONSE}"

for a in $ROOTS; do
	printf "Stahuji %s ...\n" "$a"

	# Ziskam URL pro stazeni kazdeho certifikatu v seznamu ROOTS
	TMP_ROOT=___root___$$.tmp
	dig +nocmd +comments +nostats +norrcomments +dnssec IN TXT "_url.$a.g1._fp.cacert.org." > ${TMP_ROOT} || exit 11
	grep -q '^;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: ' ${TMP_ROOT} || exit 12
	grep '^;; flags:' ${TMP_ROOT} | cut '-d;' -f3 | cut -d: -f2 | grep -q ad || exit 13
	grep '^; EDNS:' ${TMP_ROOT} | tr ";," "\n\n" | grep flags | cut -d: -f2 | grep -q do || exit 14
	grep -v '^;' ${TMP_ROOT} | grep -q RRSIG || exit 15
	CRT_URL=$(grep -v '^;' ${TMP_ROOT} | grep -v " RRSIG " | grep TXT | cut '-d"' -f2 | head -1)

	# Ziskam otisk SHA2-256 kazdeho certifikatu v seznamu ROOTS
	TMP_ROOT_FP=___root___$$.tmp
	dig +nocmd +comments +nostats +norrcomments +dnssec IN TXT "_sha256.$a.g1._fp.cacert.org." > ${TMP_ROOT_FP} || exit 21
	grep -q '^;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: ' ${TMP_ROOT_FP} || exit 22
	grep '^;; flags:' ${TMP_ROOT_FP} | cut '-d;' -f3 | cut -d: -f2 | grep -q ad || exit 23
	grep '^; EDNS:' ${TMP_ROOT_FP} | tr ";," "\n\n" | grep flags | cut -d: -f2 | grep -q do || exit 24
	grep -v '^;' ${TMP_ROOT_FP} | grep -q RRSIG || exit 25
	CRT_FP=$(grep -v '^;' ${TMP_ROOT_FP} | grep -v " RRSIG " | grep TXT | cut '-d"' -f2 | head -1)

	# Ze ziskaneho URL stahnu certifikat
	wget --quiet -O "___CRT___$a.crt" "$CRT_URL" || exit 31

	# Spocitam otisk ze stazeneho souboru certifikatu
	DL_FP=$(openssl x509 -in "___CRT___$a.crt" -noout -fingerprint -sha256 | cut -d= -f2 | tr -d :)

	printf "Nalezen certifikat pro koren \"%s\":\n- CRT URL:\t%s\n- CRT FP:\t%s\n- DL FP:\t%s\n\n" "$a" "$CRT_URL" "$CRT_FP" "$DL_FP"

	# Porovnam otisk stazeneho certifikatu s hodnotou získanou z DNS
	if [ ! "$CRT_FP" == "$DL_FP" ]; then
		printf 'Verification Failed!'
		exit 32
	fi

	rm -f -- "$TMP_ROOT" "$TMP_ROOT_FP"
done
}}}

Výstup z ''upraveného'' skriptu:

{{{
_certs.g1._fp.cacert.org. 21599	IN	TXT	"root_X0F class3_X0E"

Nalezeny koreny: root_X0F class3_X0E

Stahuji root_X0F ...


_url.root_X0F.g1._fp.cacert.org. 20558 IN TXT	"http://www.cacert.org/certs/root_X0F.crt"



_sha256.root_X0F.g1._fp.cacert.org. 20632 IN TXT "07EDBD824A4988CFEF4215DA20D48C2B41D71529D7C900F570926F277CC230C5"

Nalezen certifikat pro koren "root_X0F":
- CRT URL:	http://www.cacert.org/certs/root_X0F.crt
- CRT FP:	07EDBD824A4988CFEF4215DA20D48C2B41D71529D7C900F570926F277CC230C5
- DL FP:	07EDBD824A4988CFEF4215DA20D48C2B41D71529D7C900F570926F277CC230C5

Stahuji class3_X0E ...


_url.class3_X0E.g1._fp.cacert.org. 20651 IN TXT	"http://www.cacert.org/certs/class3_X0E.crt"



_sha256.class3_X0E.g1._fp.cacert.org. 20680 IN TXT "F6873D70D67596C2ACBA34401E69738B52701DD6AB06B49749BC55150936D544"

Nalezen certifikat pro koren "class3_X0E":
- CRT URL:	http://www.cacert.org/certs/class3_X0E.crt
- CRT FP:	F6873D70D67596C2ACBA34401E69738B52701DD6AB06B49749BC55150936D544
- DL FP:	F6873D70D67596C2ACBA34401E69738B52701DD6AB06B49749BC55150936D544
}}}

 .[1] [[http://askubuntu.com/questions/51367/how-do-i-configure-my-caching-nameserver-to-validate-dnssec|Jak konfigurovat nameserver pro práci s DNSSEC]]
 .[2] [[https://wiki.debian.org/DNSSEC|Debian DNSSEC]]

----

 . CategoryTutorials
 . CategoryStepByStep