ЁЯФТ рдзрдбрд╛ 08 тАФ TLS рдЖрдгрд┐ certificates: рд╕реАрд▓ рдХреЗрд▓реЗрд▓рд╛ рд▓рдЦреЛрдЯрд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 08 ┬╖ рдкреБрдвреЗ: lesson-09-routing
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ08. Certificates, рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╡рд░ рд╕рд╣реА рдХрд░рдгрд╛рд░реА authority, handshake, рдЖрдгрд┐ Python рдордзреНрдпреЗ рдЦрд░реЗ certificate рд╡рд╛рдЪрдгреЗ.
- net/demo.py тАФ
tls: example.com:443 рд╕реЛрдмрдд handshake; protocol, cipher, subject, issuer, expiry, рдкрд░реНрдпрд╛рдпреА рдирд╛рд╡реЗ
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╕рд╛рдзрд╛ рд▓рдЦреЛрдЯрд╛ corridor рдордзрд▓рд╛ рдХреЛрдгреАрд╣реА рдЙрдШрдбреВ рд╢рдХрддреЛ. рд╕реАрд▓ рдХреЗрд▓реЗрд▓рд╛ рд▓рдЦреЛрдЯрд╛ рдЙрдШрдбрддрд╛ рдпреЗрдд рдирд╛рд╣реА тАФ рдкрдг рд╕реАрд▓ рдХреЛрдгрд╛рдЪреЗ рдЖрд╣реЗ рд╣реЗ рдорд╛рд╣реАрдд рдЕрд╕реЗрд▓ рддрд░рдЪ рддреНрдпрд╛рдЪрд╛ рдЙрдкрдпреЛрдЧ. рдореНрд╣рдгреВрди server рдПрдХ рдУрд│рдЦрдкрддреНрд░ (certificate) рджрд╛рдЦрд╡рддреЛ: "рдореА example.com рдЖрд╣реЗ", рдЬреНрдпрд╛рд╡рд░ рд╕рдЧрд│реНрдпрд╛рдВрдЪрд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдЪреА (certificate authority) рд╕рд╣реА рдЕрд╕рддреЗ. рддреБрдордЪрд╛ browser рд╕рд╣реА рдЖрдгрд┐ рдирд╛рд╡ рддрдкрд╛рд╕рддреЛ, рдордЧ рддреБрдореНрд╣реА рджреЛрдШреЗ рдпрд╛рдкреБрдврдЪрд╛ рдкреНрд░рддреНрдпреЗрдХ рд▓рдЦреЛрдЯрд╛ рд╕реАрд▓ рдХрд░рдгреНрдпрд╛рдЪреА рдПрдХ рдЧреБрдкреНрдд рдкрджреНрдзрдд рдард░рд╡рддрд╛. рд╣реЗрдЪ TLS рдЖрд╣реЗ; HTTPS рдореНрд╣рдгрдЬреЗ рддреНрдпрд╛рдЪреНрдпрд╛ рдЖрддрд▓реЗ HTTP.
ЁЯЧ║я╕П рдЖрдХреГрддреА
sequenceDiagram
participant B as browser
participant S as example.com :443
B->>S: ClientHello (SNI: example.com, ciphers I speak)
S->>B: ServerHello + certificate (signed by a CA) + key share
B->>B: verify chain ┬╖ check name ┬╖ check dates
B->>S: Finished тАФ session keys agreed
Note over B,S: everything after is encrypted and tamper-proof
тЭУ рдХрд╛рдп
- certificate рдПрдХрд╛ public key рд▓рд╛ рдирд╛рд╡рд╛рдВрд╢реА (
CN,subjectAltName) рдмрд╛рдВрдзрддреЗ, рд╡реИрдзрддреЗрдЪреНрдпрд╛ рддрд╛рд░рдЦрд╛рдВрд╕рд╣, рдЖрдгрд┐ рддреНрдпрд╛рд╡рд░ CA рдЪреА рд╕рд╣реА рдЕрд╕рддреЗ. Browsers рд╕реЛрдмрдд рд╡рд┐рд╢реНрд╡рд╛рд╕реВ CAs рдЪреА рдпрд╛рджреА рдпреЗрддреЗ. - chain: leaf тЖТ intermediate тЖТ root. server leaf рдЖрдгрд┐ intermediates рдкрд╛рдард╡рддреЛ; root рддреБрдордЪреНрдпрд╛ machine рд╡рд░ рдЖрдзреАрдЪ рдЕрд╕рддреЛ.
- SNI: client рдкрд╣рд┐рд▓реНрдпрд╛рдЪ рд╕рдВрджреЗрд╢рд╛рдд рддреНрдпрд╛рд▓рд╛ рдХреЛрдгрддреЗ рдирд╛рд╡ рд╣рд╡реЗ рддреЗ рд╕рд╛рдВрдЧрддреЛ, рддреНрдпрд╛рдореБрд│реЗ рдПрдХрд╛ рдкрддреНрддреНрдпрд╛рд╡рд░ рдЕрдиреЗрдХ certificates рдареЗрд╡рддрд╛ рдпреЗрддрд╛рдд.
- TLS 1.3: рдПрдХ round trip, рдлрдХреНрдд рдордЬрдмреВрдд ciphers, forward secrecy. рдЬреБрдиреЗ versions рдмрдВрдж рдХрд░рдгреНрдпрд╛рд╕рд╛рдареАрдЪ рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЖрд╣реЗрдд.
- TLS рдХрд╛рдп рд╕рд┐рджреНрдз рдХрд░рддреЗ: рддреБрдореНрд╣реА рддреНрдпрд╛ рдирд╛рд╡рд╛рдЪреА key рдЕрд╕рд▓реЗрд▓реНрдпрд╛рд╢реА рдмреЛрд▓рдд рдЖрд╣рд╛рдд, рдЖрдгрд┐ рдордзрд▓рд╛ рдХреЛрдгреАрд╣реА рд╡рд╛рдЪреВ рдХрд┐рдВрд╡рд╛ рдмрджрд▓реВ рд╢рдХрдд рдирд╛рд╣реА. рдХрд╛рдп рд╕рд┐рджреНрдз рдХрд░рдд рдирд╛рд╣реА: site рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдЖрд╣реЗ, рдХрд┐рдВрд╡рд╛ content рд╕реБрд░рдХреНрд╖рд┐рдд рдЖрд╣реЗ.
ЁЯдФ рдХрд╛
рдХреЛрдгреАрд╣реА рди рдЖрдЦрд▓реЗрд▓реНрдпрд╛ outages рдЪреНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рддреАрди рдХрд╛рд░рдгрд╛рдВрдкреИрдХреА рдПрдХ рдореНрд╣рдгрдЬреЗ expire рдЭрд╛рд▓реЗрд▓реЗ certificates. рдЪреБрдХреАрдЪреА рдирд╛рд╡реЗ, рдЧрд╣рд╛рд│ intermediates рдЖрдгрд┐ production рдордзрд▓реЗ self-signed certificates рд╣реА рдмрд╛рдХреАрдЪреА. рдПрдХрджрд╛ рдХреЗрд▓реЗ рдХреА certificate рд╡рд╛рдЪрд╛рдпрд▓рд╛ рджрд╣рд╛ seconds рд▓рд╛рдЧрддрд╛рдд.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
tls() рдПрдХ TCP socket ssl.create_default_context() рдиреЗ рдЧреБрдВрдбрд╛рд│рддреЛ (рдЬреЛ рд╡рд┐рд╢реНрд╡рд╛рд╕реВ CAs
load рдХрд░рддреЛ рдЖрдгрд┐ рдирд╛рд╡ рддрдкрд╛рд╕рддреЛ), рдордЧ version(), cipher(), рдЖрдгрд┐ getpeercert() рдордзрд▓реА
fields рдЫрд╛рдкрддреЛ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 net/demo.py tls
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | grep -E 'subject=|issuer=|Verify'
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
curl -sv https://expired.badssl.com 2>&1 | grep -iE 'expired|SSL certificate' | head -2 # what a broken seal looks like
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
protocol TLSv1.3 (рдХрд┐рдВрд╡рд╛ 1.2), issuer рд╕рдВрд╕реНрдерд╛, рднрд╡рд┐рд╖реНрдпрд╛рддрд▓реА valid until рддрд╛рд░реАрдЦ, рдЖрдгрд┐
also valid for: ['example.com', '*.example.com']. badssl рдЪреА рддрдкрд╛рд╕рдгреА expiry error
рджреЗрдКрди fail рд╣реЛрддреЗ тАФ рдореБрджреНрджрд╛рдо.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдПрдЦрд╛рджреНрдпрд╛ site рдЪреА рд╣рдореА рдХреЛрдг рджреЗрддреЛ рдЖрдгрд┐ рдХрдзреАрдкрд░реНрдпрдВрдд рд╣реЗ рддреБрдореНрд╣реА рд╡рд╛рдЪреВ рд╢рдХрддрд╛ тАФ рдЖрдгрд┐ рд╕реАрд▓ рддреБрдЯрдгреНрдпрд╛рдЪреЗ рддреАрди рдкреНрд░рдХрд╛рд░ рдУрд│рдЦреВ рд╢рдХрддрд╛.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- "рдЪрд╛рд▓рд╛рд╡реЗ рдореНрд╣рдгреВрди" verification рдмрдВрдж рдХрд░рдгреЗ (
verify=False,-k). рддреБрдореНрд╣реА рддреЗ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдХреЗрд▓реЗ. - intermediate certificate рд╡рд┐рд╕рд░рдгреЗ: рдПрдХрд╛ browser рдордзреНрдпреЗ рдЪрд╛рд▓рддреЗ, рджреБрд╕рд▒реНрдпрд╛рдд fail рд╣реЛрддреЗ.
- automation рд╢рд┐рд╡рд╛рдп 90 рджрд┐рд╡рд╕рд╛рдВрдЪреЗ Let's Encrypt certificate. 91 рд╡рд╛ рджрд┐рд╡рд╕ рдореНрд╣рдгрдЬреЗ outage.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: certificate expiry monitoring, load balancers рд╡рд░рдЪреЗ SNI, services рдордзрд▓реЗ mTLS (API рд╢рд╛рд│рд╛ рдзрдбрд╛ 14) рдЖрдгрд┐ рд╕реНрд╡рд╛рдЧрдд рдХрдХреНрд╖рд╛рд╡рд░ рд╣реЛрдгрд╛рд░реЗ TLS termination (рдзрдбрд╛ 11) тАФ рд╣реЗ рд╕рдЧрд│реЗ рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рд╡рд░рдЪрд╛ рд╣рд╛рдЪ handshake рдЖрд╣реЗрдд.
тПня╕П рдкреБрдвреЗ
рдзрдбрд╛ 09 тАФ routing рдЖрдгрд┐ internet: рдХреЛрдгрд╛рдХрдбреЗрдЪ рдкреВрд░реНрдг рдирдХрд╛рд╢рд╛ рдирд╕рд▓реЗрд▓реА рдЗрдорд╛рд░рдд рдкрд┐рд╢рд╡реА рдХрд╢реА рд╢реЛрдзрддреЗ.