{"id":2219,"date":"2026-02-02T10:17:00","date_gmt":"2026-02-02T09:17:00","guid":{"rendered":"https:\/\/jalvo.eu\/lets-encrypt-za-reverse-proxy-wydawanie-certyfikatow\/"},"modified":"2026-09-25T03:46:35","modified_gmt":"2026-09-25T02:46:35","slug":"lets-encrypt-za-reverse-proxy-wydawanie-certyfikatow","status":"publish","type":"post","link":"https:\/\/jalvo.eu\/pl\/lets-encrypt-za-reverse-proxy-wydawanie-certyfikatow\/","title":{"rendered":"Let&#8217;s Encrypt za reverse proxy: jak uzyska\u0107 certyfikat"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Gdy Let&#8217;s Encrypt dzia\u0142a za reverse proxy, certyfikaty zwykle przestaj\u0105 si\u0119 wystawia\u0107 z jednego nudnego powodu: \u017c\u0105danie walidacyjne trafia teraz na proxy, a nie na serwer \u017ar\u00f3d\u0142owy. S\u0105 trzy rozwi\u0105zania. Przekaza\u0107 \u015bcie\u017ck\u0119 wyzwania ACME do serwera \u017ar\u00f3d\u0142owego, przenie\u015b\u0107 certyfikat na proxy albo przej\u015b\u0107 na walidacj\u0119 DNS-01.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Historia prawie zawsze wygl\u0105da tak samo. Odnawianie przez miesi\u0105ce dzia\u0142a\u0142o bez zarzutu. Potem kto\u015b skierowa\u0142 rekord A domeny na proxy i nast\u0119pna pr\u00f3ba si\u0119 wy\u0142o\u017cy\u0142a. Poni\u017cej znajdziesz, jak namierzy\u0107 przyczyn\u0119, gdzie certyfikat powinien w\u0142a\u015bciwie by\u0107, jak skonfigurowa\u0107 NGINX pod \u015bcie\u017ck\u0119 wyzwania oraz DNS-01 (spos\u00f3b, kt\u00f3ry dzia\u0142a tak samo, niezale\u017cnie od tego, czy przed stron\u0105 stoi proxy).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dlaczego odnowienie certyfikatu nie dzia\u0142a po przej\u015bciu za proxy?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bo walidacja HTTP-01 pobiera plik z adresu IP, na kt\u00f3ry rozwi\u0105zuje si\u0119 domena. A ten adres nale\u017cy teraz do proxy. Token zapisany przez serwer \u017ar\u00f3d\u0142owy nigdy wi\u0119c nie zostaje zwr\u00f3cony. <a href=\"https:\/\/letsencrypt.org\/docs\/challenge-types\/\" rel=\"nofollow noopener\" target=\"_blank\">Dokumentacja typ\u00f3w wyzwa\u0144 Let&#8217;s Encrypt<\/a> opisuje mechanizm: klient ACME zapisuje plik z tokenem pod <code>http:\/\/&lt;domain&gt;\/.well-known\/acme-challenge\/&lt;TOKEN&gt;<\/code>, a Let&#8217;s Encrypt go pobiera, czasem kilka razy i z kilku lokalizacji. Co\u015b mi\u0119dzy publiczn\u0105 nazw\u0105 hosta a tym plikiem zachowuje si\u0119 inaczej? Walidacja si\u0119 sypie.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Log klienta powie ci, z kt\u00f3rym wariantem masz do czynienia. B\u0142\u0105d 404 albo \u201eunauthorized\u201d. Przekierowanie na HTTPS, kt\u00f3rego proxy nie potrafi obs\u0142u\u017cy\u0107. Albo zwyk\u0142y timeout. Jeszcze jedno: nieudana walidacja oznacza start od nowa z nowym zam\u00f3wieniem, wi\u0119c najpierw napraw \u015bcie\u017ck\u0119, a dopiero potem pon\u00f3w pr\u00f3b\u0119, nie odwrotnie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Najpierw zdecyduj: certyfikat na serwerze \u017ar\u00f3d\u0142owym czy na proxy?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Miejsce, w kt\u00f3rym ko\u0144czy si\u0119 TLS, decyduje o tym, gdzie jest certyfikat i kt\u00f3re wyzwanie ma sens. Zostawiasz certyfikat na serwerze \u017ar\u00f3d\u0142owym: proxy tylko przepuszcza ruch, serwer \u017ar\u00f3d\u0142owy zachowuje swojego klienta ACME, a \u015bcie\u017cka wyzwania musi do niego dociera\u0107. Przenosisz go na proxy: ten, kto obs\u0142uguje tam TLS, obs\u0142uguje te\u017c klienta ACME. Serwer \u017ar\u00f3d\u0142owy nie wystawia wtedy publicznie niczego do walidacji.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Kto odnawia:<\/strong> ty na serwerze \u017ar\u00f3d\u0142owym albo operator proxy na proxy.<\/li>\n<li><strong>Co si\u0119 psuje przy zmianie proxy:<\/strong> certyfikat na serwerze \u017ar\u00f3d\u0142owym zale\u017cy od tego, czy proxy przekazuje \u015bcie\u017ck\u0119 wyzwania, a certyfikat na proxy trzeba wystawi\u0107 ponownie wsz\u0119dzie tam, gdzie przenosi si\u0119 TLS.<\/li>\n<li><strong>Wildcardy:<\/strong> potrzebujesz takiego? Tak czy inaczej planuj DNS-01.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Wyb\u00f3r nale\u017cy do ciebie. Zanim si\u0119 zdecydujesz, zapytaj operatora proxy, jak obs\u0142uguje TLS i \u015bcie\u017ck\u0119 <code>\/.well-known<\/code> (zdziwi\u0142by\u015b si\u0119, jak cz\u0119sto nikt o to nie pyta). A je\u015bli nadal nie masz pewno\u015bci, czy proxy w og\u00f3le powinno sta\u0107 przed stron\u0105, najpierw rozwa\u017c <a href=\"https:\/\/jalvo.eu\/reverse-proxy-right-answer-or-hidden-problem\/\">argumenty za reverse proxy<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Kierowanie \u015bcie\u017cki wyzwania ACME w NGINX dla HTTP-01<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Na serwerze \u017ar\u00f3d\u0142owym udost\u0119pnij <code>\/.well-known\/acme-challenge\/<\/code> przez zwyk\u0142e HTTP i umie\u015b\u0107 t\u0119 regu\u0142\u0119 przed jakimkolwiek przekierowaniem na HTTPS. Wtedy \u017c\u0105danie przekazane przez proxy faktycznie znajdzie token. Na w\u0142asnym serwerze \u017ar\u00f3d\u0142owym:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Dodaj blok location dla \u015bcie\u017cki wyzwania, wskazuj\u0105cy na katalog webroot.<\/li>\n<li>Wy\u0142\u0105cz ten blok z przekierowania z HTTP na HTTPS.<\/li>\n<li>Skieruj klienta ACME na ten sam webroot, na przyk\u0142ad <code>certbot certonly --webroot -w \/var\/www\/acme -d example.com<\/code>.<\/li>\n<li>Sprawd\u017a konfiguracj\u0119 poleceniem <code>nginx -t<\/code> i prze\u0142aduj NGINX.<\/li>\n<\/ol>\n\n\n\n<pre><code>server {\n    listen 80;\n    server_name example.com;\n\n    location ^~ \/.well-known\/acme-challenge\/ {\n        root \/var\/www\/acme;\n        default_type text\/plain;\n    }\n\n    location \/ {\n        return 301 https:\/\/$host$request_uri;\n    }\n}<\/code><\/pre>\n<p class=\"wp-block-paragraph\">Test jest prosty. Wrzu\u0107 plik do <code>\/var\/www\/acme\/.well-known\/acme-challenge\/<\/code>, pobierz go przez publiczn\u0105 nazw\u0119 hosta z innej sieci i sprawd\u017a, czy access log serwera \u017ar\u00f3d\u0142owego odnotowa\u0142 \u017c\u0105danie. Haczyk: to dzia\u0142a tylko wtedy, gdy proxy przekazuje zwyk\u0142e \u017c\u0105dania HTTP dla tej \u015bcie\u017cki bez zmian. Sprawd\u017a wi\u0119c tak\u017ce stron\u0119 proxy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wyzwanie DNS-01: walidacja, kt\u00f3rej proxy nie przeszkadza<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">DNS-01 potwierdza kontrol\u0119 nad domen\u0105 rekordem TXT pod <code>_acme-challenge.&lt;domain&gt;<\/code>, wi\u0119c routing HTTP przez proxy przestaje mie\u0107 znaczenie. Czy konfiguracja jest trudniejsza ni\u017c przy HTTP-01? Tak. Ale obs\u0142uguje przypadki, z kt\u00f3rymi HTTP-01 sobie nie radzi, i pozwala wystawia\u0107 certyfikaty wildcard. Potrzebujesz dostawcy DNS z API albo delegujesz <code>_acme-challenge<\/code> przez CNAME lub NS do strefy, kt\u00f3ra szybko si\u0119 aktualizuje.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Na propagacji ludzie najcz\u0119\u015bciej si\u0119 przeje\u017cd\u017caj\u0105. Klient powinien poczeka\u0107, a\u017c rekord b\u0119dzie widoczny wsz\u0119dzie, zanim uruchomi walidacj\u0119. Zgodnie z <a href=\"https:\/\/letsencrypt.org\/docs\/challenge-types\/\" rel=\"nofollow noopener\" target=\"_blank\">sekcj\u0105 DNS-01 w dokumentacji<\/a>, je\u015bli dostawca nie daje sposobu na sprawdzenie propagacji, czasem trzeba czeka\u0107 nawet godzin\u0119. Aha, i usuwaj stare rekordy TXT, bo Let&#8217;s Encrypt odrzuca zbyt du\u017c\u0105 odpowied\u017a.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Co sprawdzi\u0107 przed nast\u0119pnym odnowieniem<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Zr\u00f3b pr\u00f3bne odnowienie i sprawd\u017a \u015bcie\u017ck\u0119 wyzwania albo rekord TXT spoza swojej sieci, du\u017co wcze\u015bniej, ni\u017c certyfikat zbli\u017cy si\u0119 do ko\u0144ca wa\u017cno\u015bci. <code>certbot renew --dry-run<\/code> przechodzi ca\u0142y proces na \u015brodowisku testowym i nie rusza dzia\u0142aj\u0105cego certyfikatu.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>DNS rozwi\u0105zuje si\u0119 tam, gdzie oczekujesz: na proxy albo na serwer \u017ar\u00f3d\u0142owy.<\/li>\n<li>Adres wyzwania zwraca token przez zwyk\u0142e HTTP z zewn\u0119trznej sieci.<\/li>\n<li>Nie ma p\u0119tli przekierowa\u0144 mi\u0119dzy proxy a serwerem \u017ar\u00f3d\u0142owym.<\/li>\n<li>Deploy hook prze\u0142adowuje NGINX po odnowieniu, na przyk\u0142ad <code>--deploy-hook \"systemctl reload nginx\"<\/code>.<\/li>\n<li>Monitoring wa\u017cno\u015bci wysy\u0142a alerty niezale\u017cnie od klienta ACME.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ka\u017cdy wystawiony certyfikat trafia do publicznych log\u00f3w, wi\u0119c twoje nazwy host\u00f3w zostawiaj\u0105 <a href=\"https:\/\/jalvo.eu\/ssl-cdn-footprints\/\">\u015blady w logach Certificate Transparency<\/a>, kt\u00f3rym warto si\u0119 czasem przyjrze\u0107. Dopiero planujesz warstw\u0119 proxy? Por\u00f3wnaj <a href=\"https:\/\/jalvo.eu\/services\/\">plany reverse proxy Jalvo<\/a> i rozwa\u017c <a href=\"https:\/\/jalvo.eu\/shared-vs-dedicated-ip-hosting-seo\/\">wsp\u00f3\u0142dzielone i dedykowane adresy IP<\/a> dla adres\u00f3w stoj\u0105cych przed twoim serwerem \u017ar\u00f3d\u0142owym.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Jak wybra\u0107 konfiguracj\u0119 Let&#8217;s Encrypt za reverse proxy, kt\u00f3ra nie przestanie si\u0119 odnawia\u0107<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dzia\u0142aj\u0105 trzy opcje. Zostawi\u0107 certyfikat na serwerze \u017ar\u00f3d\u0142owym i przekazywa\u0107 \u015bcie\u017ck\u0119 wyzwania. Zarz\u0105dza\u0107 certyfikatem na proxy. Albo wybra\u0107 DNS-01, gdy nie masz kontroli nad routingiem HTTP lub potrzebujesz wildcarda. Moja rada: wybierz t\u0119 opcj\u0119, kt\u00f3rej elementy naprawd\u0119 kontrolujesz, i przetestuj j\u0105 przed oknem odnowienia, a nie w jego trakcie. Konfiguracj\u0119 wok\u00f3\u0142 tego opisujemy w <a href=\"https:\/\/jalvo.eu\/category\/seo\/\">artyku\u0142ach o konfiguracji hostingu<\/a>. Let&#8217;s Encrypt za reverse proxy odnawia si\u0119 niezawodnie, gdy walidacja ma \u015bcie\u017ck\u0119, kt\u00f3ra nie opiera si\u0119 na zgadywaniu.<\/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-1790304018480-0\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Czy mog\u0119 zosta\u0107 przy HTTP-01, je\u015bli proxy wymusza HTTPS?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>u003cpu003eTak, o ile \u015bcie\u017cka wyzwania pozostaje osi\u0105galna. Let&#8217;s Encrypt pod\u0105\u017ca za przekierowaniem, ale walidacja udaje si\u0119 tylko wtedy, gdy cel faktycznie zwraca token. Uszkodzony certyfikat albo p\u0119tla przekierowa\u0144 po stronie HTTPS nadal j\u0105 zablokuje. Bezpieczniej jest wy\u0142\u0105czy\u0107 t\u0119 \u015bcie\u017ck\u0119 z przekierowania.u003c\/pu003e<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1790304018480-1\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Czy do certyfikatu wildcard potrzebuj\u0119 DNS-01?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>u003cpu003eTak. Dokumentacja wyzwa\u0144 Let&#8217;s Encrypt przypisuje wystawianie wildcard\u00f3w do DNS-01, a HTTP-01 nie zwaliduje nazwy wildcard. Zaplanuj API DNS albo delegowan\u0105 stref\u0119 u003ccodeu003e_acme-challengeu003c\/codeu003e.u003c\/pu003e<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-question-1790304018480-2\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Dlaczego walidacja przesz\u0142a na jednym serwerze, a przez proxy nie?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>u003cpu003eBo Let&#8217;s Encrypt sprawdza publiczn\u0105 nazw\u0119 hosta z kilku lokalizacji. Lokalny curl na serwerze \u017ar\u00f3d\u0142owym nic nie m\u00f3wi o trasie przez proxy. Testuj przez publiczn\u0105 nazw\u0119 DNS z zewn\u0119trznej sieci i upewnij si\u0119, \u017ce \u017c\u0105danie pojawia si\u0119 w access logu serwera \u017ar\u00f3d\u0142owego.u003c\/pu003e<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Gdy Let&#8217;s Encrypt dzia\u0142a za reverse proxy, certyfikaty zwykle przestaj\u0105 si\u0119 wystawia\u0107 z jednego nudnego powodu: \u017c\u0105danie walidacyjne trafia teraz [&hellip;]<\/p>\n","protected":false},"author":25,"featured_media":2191,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[182],"tags":[],"class_list":["post-2219","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-seo-pl"],"acf":[],"_links":{"self":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts\/2219","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=2219"}],"version-history":[{"count":1,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts\/2219\/revisions"}],"predecessor-version":[{"id":2229,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/posts\/2219\/revisions\/2229"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/media\/2191"}],"wp:attachment":[{"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/media?parent=2219"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/categories?post=2219"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jalvo.eu\/pl\/wp-json\/wp\/v2\/tags?post=2219"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}