{"id":2386,"date":"2024-07-25T08:21:00","date_gmt":"2024-07-25T07:21:00","guid":{"rendered":"https:\/\/jalvo.eu\/lets-encrypt-konczy-ocsp-stapling-na-nginx\/"},"modified":"2024-07-25T08:21:00","modified_gmt":"2024-07-25T07:21:00","slug":"lets-encrypt-konczy-ocsp-stapling-na-nginx","status":"publish","type":"post","link":"https:\/\/jalvo.eu\/pl\/lets-encrypt-konczy-ocsp-stapling-na-nginx\/","title":{"rendered":"Let&#8217;s Encrypt ko\u0144czy z OCSP: naprawa OCSP stapling na NGINX"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Let&#8217;s Encrypt og\u0142osi\u0142 23 lipca 2024 r., \u017ce zamierza zako\u0144czy\u0107 obs\u0142ug\u0119 OCSP na rzecz list uniewa\u017cnionych certyfikat\u00f3w. OCSP stapling na NGINX z tymi certyfikatami pr\u0119dzej czy p\u00f3\u017aniej nie b\u0119dzie wi\u0119c mia\u0142 czego do\u0142\u0105cza\u0107. Czy Twoja strona przestanie obs\u0142ugiwa\u0107 TLS? Nie. Ale dyrektywy staplingu w konfiguracji powoli zamieniaj\u0105 si\u0119 w balast. Poni\u017cej: co og\u0142oszono, co to oznacza dla konfiguracji z <code>ssl_stapling<\/code> i co warto ju\u017c teraz sprawdzi\u0107 na w\u0142asnym serwerze.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Co Let&#8217;s Encrypt og\u0142osi\u0142 w sprawie OCSP?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">W skr\u00f3cie: urz\u0105d certyfikacji chce jak najszybciej odej\u015b\u0107 od protoko\u0142u Online Certificate Status Protocol i przej\u015b\u0107 na listy uniewa\u017cnionych certyfikat\u00f3w. Wed\u0142ug <a href=\"https:\/\/letsencrypt.org\/2024\/07\/23\/replacing-ocsp-with-crls\" rel=\"nofollow noopener\" target=\"_blank\">og\u0142oszenia Let&#8217;s Encrypt o zast\u0105pieniu OCSP<\/a> urz\u0105d utrzymuje responder OCSP od startu prawie dziesi\u0119\u0107 lat temu, a obs\u0142ug\u0119 CRL doda\u0142 w 2022 roku. Nast\u0119pnie w sierpniu 2023 roku CA\/Browser Forum przyj\u0119\u0142o w g\u0142osowaniu zmian\u0119, po kt\u00f3rej us\u0142ugi OCSP s\u0105 opcjonalne dla publicznie zaufanych urz\u0119d\u00f3w certyfikacji. Zosta\u0142 jeden wyj\u0105tek: Microsoft Root Program.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Konkretne daty? Jeszcze ich nie ma. Szczeg\u00f3\u0142owy harmonogram pojawi si\u0119, gdy Microsoft r\u00f3wnie\u017c uzna OCSP za opcjonalny, a urz\u0105d liczy, \u017ce nast\u0105pi to w ci\u0105gu najbli\u017cszych sze\u015bciu do dwunastu miesi\u0119cy. Ostatni\u0105 odpowied\u017a chce wys\u0142a\u0107 od trzech do sze\u015bciu miesi\u0119cy po tym, jak opublikuje harmonogram wy\u0142\u0105czenia us\u0142ugi. Aktualizacje b\u0119d\u0105 trafia\u0107 do kategorii API Announcements na forum Discourse projektu. Zapisz si\u0119 tam - to jedyny pewny spos\u00f3b, \u017ceby si\u0119 o tym dowiedzie\u0107.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">CRL a OCSP: dlaczego urz\u0105d zmienia mechanizm<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">OCSP to zapytanie o status pojedynczego certyfikatu wysy\u0142ane do respondera urz\u0119du. CRL to publikowana lista wszystkich certyfikat\u00f3w, kt\u00f3re urz\u0105d uniewa\u017cni\u0142. G\u0142\u00f3wnym powodem zmiany jest prywatno\u015b\u0107. Zapytanie OCSP m\u00f3wi urz\u0119dowi, kt\u00f3ra strona jest odwiedzana i z jakiego adresu IP, a nawet urz\u0105d, kt\u00f3ry celowo nie przechowuje takich zapis\u00f3w, m\u00f3g\u0142by zosta\u0107 prawnie zmuszony do ich gromadzenia. Listy uniewa\u017cnie\u0144 nie maj\u0105 tego problemu, bo klient pobiera ca\u0142\u0105 list\u0119, zamiast pyta\u0107 o jedn\u0105 stron\u0119.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Drugi pow\u00f3d to zwyk\u0142e utrzymanie. W tym samym og\u0142oszeniu czytamy, \u017ce mo\u017cliwie prosta infrastruktura urz\u0119du ma znaczenie dla zgodno\u015bci z wymogami, niezawodno\u015bci i wydajno\u015bci, \u017ce utrzymywanie OCSP co roku poch\u0142ania\u0142o znaczne zasoby, a sama us\u0142uga sta\u0142a si\u0119 zb\u0119dna, odk\u0105d obs\u0142ugiwane s\u0105 listy CRL. Trudno si\u0119 nie zgodzi\u0107.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jak dzi\u015b dzia\u0142a OCSP stapling na NGINX<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Przy staplingu serwer WWW sam pobiera odpowied\u017a OCSP i do\u0142\u0105cza j\u0105 do uzgadniania TLS. Klient odwiedzaj\u0105cego w og\u00f3le nie musi kontaktowa\u0107 si\u0119 z urz\u0119dem. W NGINX odpowiadaj\u0105 za to trzy dyrektywy: <code>ssl_stapling<\/code>, <code>ssl_stapling_verify<\/code> i <code>ssl_trusted_certificate<\/code>, wszystkie opisane w <a href=\"https:\/\/nginx.org\/en\/docs\/http\/ngx_http_ssl_module.html\" rel=\"nofollow noopener\" target=\"_blank\">dokumentacji modu\u0142u ssl nginx<\/a>. Ta strona stawia jeden wym\u00f3g (i to na nim ludzie si\u0119 potykaj\u0105): certyfikat wystawcy musi by\u0107 znany. Je\u015bli wi\u0119c plik <code>ssl_certificate<\/code> nie zawiera certyfikat\u00f3w po\u015brednich, certyfikat wystawcy musi znale\u017a\u0107 si\u0119 w pliku <code>ssl_trusted_certificate<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Typowy blok server dla Let&#8217;s Encrypt z w\u0142\u0105czonym staplingiem wygl\u0105da tak:<\/p>\n\n\n\n<pre><code>server {\n    listen 443 ssl;\n    server_name example.com;\n\n    ssl_certificate         \/etc\/letsencrypt\/live\/example.com\/fullchain.pem;\n    ssl_certificate_key     \/etc\/letsencrypt\/live\/example.com\/privkey.pem;\n\n    ssl_stapling            on;\n    ssl_stapling_verify     on;\n    ssl_trusted_certificate \/etc\/letsencrypt\/live\/example.com\/chain.pem;\n}<\/code><\/pre>\n\n<h2>Co si\u0119 zmienia dla konfiguracji ssl_stapling w nginx<\/h2>\n<p class=\"wp-block-paragraph\">Stapling zale\u017cy w ca\u0142o\u015bci od respondera urz\u0119du. Gdy odpowiedzi przestan\u0105 by\u0107 wysy\u0142ane, NGINX nie b\u0119dzie mia\u0142 czego pobra\u0107 ani do\u0142\u0105czy\u0107. W og\u0142oszeniu zaznaczono, \u017ce wi\u0119kszo\u015b\u0107 implementacji OCSP dzia\u0142a w trybie fail open, czyli brak mo\u017cliwo\u015bci pobrania odpowiedzi nie psuje systemu. Twoja strona dalej obs\u0142uguje TLS. Uzgadnianie po prostu odbywa si\u0119 bez do\u0142\u0105czonego statusu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W praktyce dyrektywy staj\u0105 si\u0119 martw\u0105 konfiguracj\u0105, kt\u00f3ra mo\u017ce co najwy\u017cej za\u015bmieca\u0107 logi. To porz\u0105dki do zrobienia, a nie sytuacja awaryjna. Jedno sprawdzi\u0142bym jednak w pierwszej kolejno\u015bci: gdzie w Twojej infrastrukturze faktycznie ko\u0144czy si\u0119 po\u0142\u0105czenie TLS? Przy <a href=\"https:\/\/jalvo.eu\/pl\/wordpress-za-reverse-proxy-przekierowania-i-https\/\">HTTPS za reverse proxy<\/a> ustawienia staplingu mog\u0105 le\u017ce\u0107 na innej maszynie ni\u017c ta, o kt\u00f3rej my\u015blisz w pierwszej chwili.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zastosowania poza przegl\u0105dark\u0105 to inna sprawa i wymagaj\u0105 wi\u0119kszej uwagi. Je\u015bli zabezpieczasz tymi certyfikatami na przyk\u0142ad VPN, urz\u0105d radzi upewni\u0107 si\u0119, \u017ce Twoje oprogramowanie dzia\u0142a poprawnie, gdy certyfikat nie zawiera adresu URL OCSP.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Lista kontrolna: przygotowanie serwera na koniec OCSP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Zasadniczo chodzi o to, \u017ceby znale\u017a\u0107 ka\u017cde miejsce, kt\u00f3re polega na OCSP, i zaplanowa\u0107, jak si\u0119 go pozby\u0107. Przejd\u017a te kroki na w\u0142asnym ho\u015bcie:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Znajd\u017a dyrektywy.<\/strong> Przeszukaj ka\u017cdy blok server pod k\u0105tem <code>ssl_stapling<\/code> i <code>ssl_stapling_verify<\/code>, tak\u017ce wsp\u00f3\u0142dzielone snippety i pliki do\u0142\u0105czane przez include: <code>grep -rn \"ssl_stapling\" \/etc\/nginx\/<\/code>.<\/li>\n<li><strong>Obejrzyj certyfikat.<\/strong> Czy nadal zawiera adres URL OCSP? Sprawd\u017a poleceniem <code>openssl x509 -in fullchain.pem -noout -ocsp_uri<\/code>.<\/li>\n<li><strong>Przetestuj uzgadnianie.<\/strong> Uruchom <code>openssl s_client -connect example.com:443 -servername example.com -status<\/code> i poszukaj sekcji z odpowiedzi\u0105 OCSP, \u017ceby zobaczy\u0107, czy wraca do\u0142\u0105czona odpowied\u017a.<\/li>\n<li><strong>Przejrzyj monitoring i skrypty wdro\u017ceniowe.<\/strong> Ka\u017cdy test, kt\u00f3ry traktuje brak do\u0142\u0105czonej odpowiedzi jako b\u0142\u0105d, zacznie zg\u0142asza\u0107 fa\u0142szywe alarmy.<\/li>\n<li><strong>Wska\u017c twarde zale\u017cno\u015bci.<\/strong> Wszystko, co do dzia\u0142ania wymaga odpowiedzi OCSP, potrzebuje planu odej\u015bcia od tej zale\u017cno\u015bci, zgodnie z zaleceniem urz\u0119du, \u017ceby zacz\u0105\u0107 jak najszybciej.<\/li>\n<li><strong>Zaplanuj usuni\u0119cie.<\/strong> Gdy harmonogram wy\u0142\u0105czenia zostanie opublikowany, usu\u0144 dyrektywy staplingu, uruchom <code>nginx -t<\/code> i prze\u0142aduj konfiguracj\u0119.<\/li>\n<li><strong>Zapisz si\u0119 na API Announcements.<\/strong> To tam pojawi si\u0119 szczeg\u00f3\u0142owy harmonogram.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Kt\u00f3re kontrole certyfikatu TLS nadal maj\u0105 znaczenie po zmianie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sprawdzanie uniewa\u017cnie\u0144 przenosi si\u0119 na stron\u0119 klienta i przegl\u0105darki, przez listy CRL. Na serwerze WWW nie ma tu nic do skonfigurowania. W Twoich r\u0119kach zostaje reszta cyklu \u017cycia certyfikatu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>pe\u0142ny \u0142a\u0144cuch serwowany z pliku <code>ssl_certificate<\/code>,<\/li>\n<li>automatyczne odnawianie, kt\u00f3re dzia\u0142a i potem prze\u0142adowuje NGINX,<\/li>\n<li>monitoring wa\u017cno\u015bci, kt\u00f3ry ostrzega, zanim certyfikat wyga\u015bnie,<\/li>\n<li>test uzgadniania po ka\u017cdej zmianie konfiguracji.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Wszystko to wida\u0107 z zewn\u0105trz. Ka\u017cdy mo\u017ce sprawdzi\u0107, <a href=\"https:\/\/jalvo.eu\/pl\/ssl-cdn-slady-ktore-zostawiaja\/\">co zdradzaj\u0105 konfiguracje TLS<\/a> o serwerze, wi\u0119c sp\u00f3jna konfiguracja jest warta wysi\u0142ku. Czysta konfiguracja s\u0142u\u017cy te\u017c robotom tak samo jak odwiedzaj\u0105cym, co ma znaczenie, gdy <a href=\"https:\/\/jalvo.eu\/pl\/czy-googlebot-uzywa-http2-co-zmienia-dla-serwera\/\">Googlebot crawluje przez HTTP\/2<\/a> na po\u0142\u0105czeniach negocjowanych w tym samym uzgadnianiu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dop\u00f3ki responder nie zostanie wy\u0142\u0105czony, OCSP stapling dzia\u0142a dok\u0142adnie tak jak dzi\u015b. Jaki ruch ma wi\u0119c sens w lipcu 2024 roku? Zr\u00f3b audyt konfiguracji, zapisz ka\u017cd\u0105 zale\u017cno\u015b\u0107 od do\u0142\u0105czanej odpowiedzi i usu\u0144 je spokojnie, gdy pojawi si\u0119 harmonogram. Bez po\u015bpiechu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">FAQ<\/h2>\n\n\n<div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-question-1790879540533-0\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Czy moja strona przestanie dzia\u0142a\u0107, gdy OCSP w Let&#8217;s Encrypt zostanie wy\u0142\u0105czony?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Nie powinna. W og\u0142oszeniu podano, \u017ce wi\u0119kszo\u015b\u0107 implementacji OCSP dzia\u0142a w trybie fail open, wi\u0119c nieudane pobranie odpowiedzi nie psuje systemu. NGINX dalej b\u0119dzie ko\u0144czy\u0142 uzgadnianie TLS, tylko bez do\u0142\u0105czonego statusu.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1790879540533-1\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Czy powinienem wy\u0142\u0105czy\u0107 ssl_stapling ju\u017c teraz?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Jeszcze nie. Odpowiedzi nadal s\u0105 wysy\u0142ane i stapling wci\u0105\u017c dzia\u0142a. Wykorzystaj ten czas na audyt: gdzie le\u017c\u0105 dyrektywy i co od nich zale\u017cy, a potem usu\u0144 je, gdy urz\u0105d opublikuje szczeg\u00f3\u0142owy harmonogram.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1790879540533-2\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Czy musz\u0119 konfigurowa\u0107 listy uniewa\u017cnionych certyfikat\u00f3w w NGINX?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>Nie. W przypadku publicznej strony WWW z list CRL korzystaj\u0105 klienci i przegl\u0105darki, a nie serwer przedstawiaj\u0105cy certyfikat. Twoje zadanie si\u0119 nie zmienia: serwuj poprawny \u0142a\u0144cuch i pilnuj, \u017ceby odnawianie dzia\u0142a\u0142o.<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Let&#8217;s Encrypt og\u0142osi\u0142 23 lipca 2024 r., \u017ce zamierza zako\u0144czy\u0107 obs\u0142ug\u0119 OCSP na rzecz list uniewa\u017cnionych certyfikat\u00f3w. OCSP stapling na NGINX z tymi certyfikatami pr\u0119dzej czy p\u00f3\u017aniej nie b\u0119dzie wi\u0119c mia\u0142 czego do\u0142\u0105cza\u0107. Czy Twoja strona przestanie obs\u0142ugiwa\u0107 TLS? Nie. Ale dyrektywy staplingu w konfiguracji powoli zamieniaj\u0105 si\u0119 w balast. Poni\u017cej: co og\u0142oszono, co to [&hellip;]<\/p>\n","protected":false},"author":25,"featured_media":2362,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[182],"tags":[476,481,344,247,469,257],"class_list":["post-2386","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-seo-pl","tag-bezpieczenstwo-serwera","tag-certyfikaty-ssl","tag-lets-encrypt-x","tag-nginx-x","tag-ocsp-x","tag-tls-x"],"acf":[],"_links":{"self":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts\/2386","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/users\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/comments?post=2386"}],"version-history":[{"count":0,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts\/2386\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/media\/2362"}],"wp:attachment":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/media?parent=2386"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/categories?post=2386"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/tags?post=2386"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}