Esempio pratico
Ottenere un certificato per giocare con
Utilizzo di comandi di basso livello openssl
:
mkdir /tmp/ssltests
cd $_
openssl s_client -connect www.google.com:443 -ign_eof \
<<<$'HEAD / HTTP/1.0\r\n\r' 2>/dev/null |
sed -ne '/^Server certificate/,${
/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/{
//{/END/{p;q}};p}}' >www.google.com.crt
Forse non è il modo più semplice, ma tra man openssl
e man sed
, ho fatto una scelta ...
Quindi potresti vedere cos'è un certificato SSL :
cat www.google.com.crt
-----BEGIN CERTIFICATE-----
MIIEdjCCA16gAwIBAgIIRYUpUVjSfHQwDQYJKoZIhvcNAQEFBQAwSTELMAkGA1UE
BhMC ... AVzv0
OtGjXuOdSfB4nURA7INNYvx8ULMECg5Sj8Gan8kIOfeW3jt9vdxsZrbn0Cu/bcTm
OEK3nH1sBk2Hy5ZBcyludHyUzqTHsXSjnIjwZNPpihVmFrs5I1Ma7iEj
-----END CERTIFICATE-----
sed '1d;$d' www.google.com.crt | tr -d \n | wc -c
1528
echo $(( 1528 * 6 ))
9168
echo $(( 9168 / 8 ))
1146
C'è un mucchio di 9168 bit (o 1146 byte), che contengono molti dettagli:
Nel contenuto del certificato
Un certificato x509 contiene molte informazioni come oggetto, emittente, date valide, altri certificati firmati ...
Potresti recuperare informazioni specifiche per:
openssl x509 -in www.google.com.crt -noout -subject
subject= /C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com
o
openssl x509 -in www.google.com.crt -noout -issuer
issuer= /C=US/O=Google Inc/CN=Google Internet Authority G2
oppure:
openssl x509 -in www.google.com.crt -noout -text
scaricherà tutti i dettagli, inclusa la chiave pubblica, gli algoritmi delle firme ...
Le impronte digitali
Sono come md5sum
per la convalida di un file: per verificare (per esempio: per telefono), potresti usare un tipo di impronta digitale.
Le impronte digitali non contengono più informazioni leggibili! È solo checksum !!
openssl x509 -in www.google.com.crt -noout -fingerprint
SHA1 Fingerprint=03:30:78:7E:9B:7E:11:4E:66:2E:77:ED:AC:99:71:09:F8:E5:F0:6F
openssl x509 -in www.google.com.crt -noout -md5 -fingerprint
MD5 Fingerprint=5A:4C:B2:35:C4:F2:2E:3A:72:6A:49:F6:BC:EA:5B:20
openssl x509 -in www.google.com.crt -noout -sha256 -fingerprint
SHA256 Fingerprint=E8:55:E1:CC:31:97:F3:36:92:D7:C9:3E:46:B4:47:FB:21:CD:6C:7A:93:CB:B1:AE:58:CF:21:43:DF:24:FC:42
È meglio scrivere l'intero certificato.
In effetti, questo è veramente uguale all'uso di md5sum
sui dati non elaborati:
uudecode < <(
sed '1s/^.*$/begin-base64 644 www.google.com.raw/;
$s/^.*$/====/' www.google.com.crt
)
ls -ltr
total 8
-rw-r--r-- 1 user user 1606 Nov 30 13:06 www.google.com.crt
-rw-r--r-- 1 user user 1146 Nov 30 16:30 www.google.com.raw
sha1sum www.google.com.raw
0330787e9b7e114e662e77edac997109f8e5f06f www.google.com.raw
md5sum www.google.com.raw
5a4cb235c4f22e3a726a49f6bcea5b20 www.google.com.raw
Ci sono gli stessi risultati.
Un'altra occasione:
openssl s_client -connect security.stackexchange.com:443 -ign_eof \
<<<$'HEAD / HTTP/1.0\r\n\r' 2>/dev/null |
sed -ne '
/^Server certificate/,${
/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/{
//{/END/{p;q}};p}}' >security.stackexchange.com.crt
openssl x509 -in security.stackexchange.com.crt -noout -sha256 -fingerprint
SHA256 Fingerprint=73:D8:42:9A:38:78:4D:21:98:29:DD:58:8C:52:6F:23:18:6A:58:99:AD:69:3A:DA:97:98:49:D4:FB:5A:A0:09
openssl x509 -in security.stackexchange.com.crt |
sed '1s/^.*$/begin-base64 644 -/;$s/^.*$/====/' |
uudecode |
sha256sum |
sed 'y|abcdef|ABCDEF|;
:a;
s/^\(\([0-9A-F]\{2\}:\)*\)\([0-9A-F]\{2\}\)\([0-9A-F]\)/:/g;
ta'
73:D8:42:9A:38:78:4D:21:98:29:DD:58:8C:52:6F:23:18:6A:58:99:AD:69:3A:DA:97:98:49:D4:FB:5A:A0:09 -
Le impronte digitali sono solo checksum.