{"id":1656,"date":"2025-11-10T22:20:41","date_gmt":"2025-11-10T19:20:41","guid":{"rendered":"https:\/\/www.dchost.com\/blog\/nginx-ve-caddyde-mtls-nasil-kurulur-mikroservislerde-sertifika-dogrulamanin-tatli-sirlari\/"},"modified":"2025-11-10T22:20:41","modified_gmt":"2025-11-10T19:20:41","slug":"nginx-ve-caddyde-mtls-nasil-kurulur-mikroservislerde-sertifika-dogrulamanin-tatli-sirlari","status":"publish","type":"post","link":"https:\/\/www.dchost.com\/blog\/nginx-ve-caddyde-mtls-nasil-kurulur-mikroservislerde-sertifika-dogrulamanin-tatli-sirlari\/","title":{"rendered":"Nginx ve Caddy\u2019de mTLS Nas\u0131l Kurulur? Mikroservislerde Sertifika Do\u011frulaman\u0131n Tatl\u0131 S\u0131rlar\u0131"},"content":{"rendered":"<div class=\"dchost-blog-content-wrapper\"><div id=\"toc_container\" class=\"toc_transparent no_bullets\"><p class=\"toc_title\">\u0130&ccedil;indekiler<\/p><ul class=\"toc_list\"><li><a href=\"#Ofiste_Kucuk_Bir_Panik_Buyuk_Bir_Aydinlanma_mTLS8217e_Giden_Yol\"><span class=\"toc_number toc_depth_1\">1<\/span> Ofiste K\u00fc\u00e7\u00fck Bir Panik, B\u00fcy\u00fck Bir Ayd\u0131nlanma: mTLS&#8217;e Giden Yol<\/a><\/li><li><a href=\"#mTLS_Nedir_Niye_Bu_Kadar_Rahatlatir\"><span class=\"toc_number toc_depth_1\">2<\/span> mTLS Nedir, Niye Bu Kadar Rahatlat\u0131r?<\/a><\/li><li><a href=\"#Kendi_Kucuk_CAni_Kur_Sertifika_Uretimi_ve_Dagitimin_Ilk_Adimi\"><span class=\"toc_number toc_depth_1\">3<\/span> Kendi K\u00fc\u00e7\u00fck CA\u2019n\u0131 Kur: Sertifika \u00dcretimi ve Da\u011f\u0131t\u0131m\u0131n \u0130lk Ad\u0131m\u0131<\/a><\/li><li><a href=\"#Nginxte_mTLS_Sunucu_Dogrulama_ve_Uygulamaya_Bilgi_Aktarma\"><span class=\"toc_number toc_depth_1\">4<\/span> Nginx\u2019te mTLS: Sunucu, Do\u011frulama ve Uygulamaya Bilgi Aktarma<\/a><\/li><li><a href=\"#Caddyde_mTLS_Caddyfile_ile_Dogal_Yalin_ve_Tatli\"><span class=\"toc_number toc_depth_1\">5<\/span> Caddy\u2019de mTLS: Caddyfile ile Do\u011fal, Yal\u0131n ve Tatl\u0131<\/a><\/li><li><a href=\"#API_ve_Mikroservislerde_mTLSi_Gunluk_Hayata_Katmak\"><span class=\"toc_number toc_depth_1\">6<\/span> API ve Mikroservislerde mTLS\u2019i G\u00fcnl\u00fck Hayata Katmak<\/a><\/li><li><a href=\"#Sertifika_Rotasyonu_Iptal_Listeleri_ve_Kucuk_Tuzaklar\"><span class=\"toc_number toc_depth_1\">7<\/span> Sertifika Rotasyonu, \u0130ptal Listeleri ve K\u00fc\u00e7\u00fck Tuzaklar<\/a><\/li><li><a href=\"#Test_Log_ve_Alarm_Oldu_mu_Sorusu_Icin_Pratik_Adimlar\"><span class=\"toc_number toc_depth_1\">8<\/span> Test, Log ve Alarm: \u201cOldu mu?\u201d Sorusu \u0130\u00e7in Pratik Ad\u0131mlar<\/a><\/li><li><a href=\"#Gercek_Hayattan_Kucuk_Bir_Ornek_Yonetim_Panelleri_ve_Sakin_Uykular\"><span class=\"toc_number toc_depth_1\">9<\/span> Ger\u00e7ek Hayattan K\u00fc\u00e7\u00fck Bir \u00d6rnek: Y\u00f6netim Panelleri ve Sakin Uykular<\/a><\/li><li><a href=\"#Operasyon_Ipuclari_Dagitim_Otomasyon_ve_Kucuk_Aliskanliklar\"><span class=\"toc_number toc_depth_1\">10<\/span> Operasyon \u0130pu\u00e7lar\u0131: Da\u011f\u0131t\u0131m, Otomasyon ve K\u00fc\u00e7\u00fck Al\u0131\u015fkanl\u0131klar<\/a><\/li><li><a href=\"#Sorun_Giderme_El_Sikisamadik_Dediginde_Ne_Yapmali\"><span class=\"toc_number toc_depth_1\">11<\/span> Sorun Giderme: \u201cEl S\u0131k\u0131\u015famad\u0131k\u201d Dedi\u011finde Ne Yapmal\u0131?<\/a><\/li><li><a href=\"#Kapanis_mTLS_ile_Iciniz_Rahat_Trafik_Akisiniz_Sakin\"><span class=\"toc_number toc_depth_1\">12<\/span> Kapan\u0131\u015f: mTLS ile \u0130\u00e7iniz Rahat, Trafik Ak\u0131\u015f\u0131n\u0131z Sakin<\/a><\/li><\/ul><\/div>\n<h2 id=\"section-1\"><span id=\"Ofiste_Kucuk_Bir_Panik_Buyuk_Bir_Aydinlanma_mTLS8217e_Giden_Yol\">Ofiste K\u00fc\u00e7\u00fck Bir Panik, B\u00fcy\u00fck Bir Ayd\u0131nlanma: mTLS&#8217;e Giden Yol<\/span><\/h2>\n<p>Hi\u00e7 ba\u015f\u0131n\u0131za geldi mi? Bir sabah API\u2019lerden birinin grafi\u011fi deliler gibi oynamaya ba\u015flar, loglar \u015fi\u015fer, uykunuzdan uyan\u0131p ekrana bakars\u0131n\u0131z. \u0130\u015fte o sabahlardan birinde, i\u00e7eride sadece bizim konu\u015fmas\u0131 gereken bir mikroservisin, d\u0131\u015far\u0131dan bir istekle tetiklendi\u011fini g\u00f6rd\u00fc\u011f\u00fcmde i\u00e7im hafif\u00e7e s\u0131zlad\u0131. G\u00fcvenlik duvar\u0131 vard\u0131, IP k\u0131s\u0131tlar\u0131 vard\u0131, ama yine de i\u00e7eri s\u0131zman\u0131n bir yolunu bulmu\u015flard\u0131. O g\u00fcn karar verdim: Sunucu sertifikas\u0131 tek ba\u015f\u0131na yetmiyor, istemcinin de ger\u00e7ekten &#8220;o&#8221; oldu\u011fundan emin olmal\u0131y\u0131z. K\u0131sacas\u0131, mTLS\u2019e ge\u00e7me zaman\u0131yd\u0131.<\/p>\n<p>Bug\u00fcn bu yaz\u0131da, Nginx ve Caddy ile <strong>mTLS (Kar\u015f\u0131l\u0131kl\u0131 TLS)<\/strong> kurulumunu ba\u015ftan sona konu\u015faca\u011f\u0131z. Kendi k\u00fc\u00e7\u00fck sertifika otoritenizi nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, istemci sertifikalar\u0131n\u0131 nas\u0131l da\u011f\u0131taca\u011f\u0131n\u0131z\u0131 ve API ile mikroservislerin birbirini nas\u0131l do\u011frulayaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m anlataca\u011f\u0131m. Mesela d\u00fc\u015f\u00fcn\u00fcn, sipari\u015f servisi sadece stok servisine konu\u015fabiliyor; ba\u015fka kimseye de\u011fil. \u0130mza gibi \u00e7al\u0131\u015fan sertifikalarla bunu tatl\u0131 tatl\u0131 nas\u0131l sa\u011flad\u0131\u011f\u0131m\u0131z\u0131 g\u00f6receksiniz. Arada ger\u00e7ek hayattan k\u00fc\u00e7\u00fck ipu\u00e7lar\u0131, bazen de \u201c\u015furada t\u0131kand\u0131m, \u015f\u00f6yle \u00e7\u00f6zd\u00fcm\u201d diyece\u011fim. Hadi ba\u015flayal\u0131m.<\/p>\n<h2 id=\"section-2\"><span id=\"mTLS_Nedir_Niye_Bu_Kadar_Rahatlatir\">mTLS Nedir, Niye Bu Kadar Rahatlat\u0131r?<\/span><\/h2>\n<p>mTLS\u2019i g\u00fcvenlikteki \u00e7ift y\u00f6nl\u00fc tokala\u015fma gibi d\u00fc\u015f\u00fcn\u00fcn. Normal TLS\u2019te sunucu kendini kan\u0131tlar, istemci sadece \u201ctamam, sensin\u201d der. mTLS\u2019te ise istemci de kendini kan\u0131tlar; sunucu \u201csen kimsin?\u201d diye sorar ve sertifikan\u0131n imzas\u0131n\u0131, ge\u00e7erlilik s\u00fcresini ve hangi otorite taraf\u0131ndan verildi\u011fini kontrol eder. B\u00f6ylece sadece sunucuyu de\u011fil, kar\u015f\u0131s\u0131ndaki konu\u015fma partnerini de do\u011fruluyoruz. Mikroservislerin birbirine f\u0131s\u0131ldad\u0131\u011f\u0131 bir mimaride bu his, ger\u00e7ekten i\u00e7ini rahatlat\u0131yor.<\/p>\n<p>Avantaj\u0131 \u00e7ok net: \u0130\u00e7erideki servisler yanl\u0131\u015f kimlikle konu\u015fam\u0131yor, d\u0131\u015far\u0131daki birisi i\u00e7eri s\u0131zsa bile imzas\u0131z kal\u0131yor. Dezavantaj\u0131 ise gayet insani: Sertifikalar y\u00f6netilmek ister, s\u00fcreleri dolur, yenilenmesi gerekir, rotasyon ister. Biraz sevgi ve d\u00fczenle bu gayet ak\u0131c\u0131 hale geliyor. Mesela bak\u0131m pencerelerini planlad\u0131\u011f\u0131n\u0131z gibi, sertifika yenilemelerini de k\u00fc\u00e7\u00fck ad\u0131mlarla ve otomasyonla halledince mTLS g\u00fcnl\u00fck hayat\u0131n do\u011fal bir par\u00e7as\u0131na d\u00f6n\u00fc\u015f\u00fcyor.<\/p>\n<h2 id=\"section-3\"><span id=\"Kendi_Kucuk_CAni_Kur_Sertifika_Uretimi_ve_Dagitimin_Ilk_Adimi\">Kendi K\u00fc\u00e7\u00fck CA\u2019n\u0131 Kur: Sertifika \u00dcretimi ve Da\u011f\u0131t\u0131m\u0131n \u0130lk Ad\u0131m\u0131<\/span><\/h2>\n<p>\u0130lk i\u015f, bir <strong>\u00f6zel CA (Certificate Authority)<\/strong> olu\u015fturmak. Sunucu sertifikas\u0131n\u0131 Let\u2019s Encrypt gibi bir sa\u011flay\u0131c\u0131dan alabilirsiniz; ama istemci sertifikalar\u0131nda genellikle kendi CA\u2019n\u0131zla ilerlersiniz. B\u00f6ylece kimin i\u00e7eri girece\u011fine siz karar verirsiniz. Mesela ekipteki her mikroservise birer istemci sertifikas\u0131 da\u011f\u0131t\u0131rs\u0131n\u0131z; devrede olmayan bir servisi emekliye ay\u0131r\u0131rken sadece sertifikas\u0131n\u0131 iptal edersiniz.<\/p>\n<p>Basit bir OpenSSL ak\u0131\u015f\u0131yla gidelim. A\u015fa\u011f\u0131daki komutlar test ortam\u0131 i\u00e7in \u015fahane. \u00dcretimde anahtar izinleri, g\u00fcvenli saklama ve rotasyon s\u00fcre\u00e7lerine daha \u00f6zen g\u00f6sterin.<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\"># 1) CA i\u00e7in \u00f6zel anahtar ve self-signed sertifika\nopenssl genrsa -out ca.key 4096\nopenssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 \n  -subj &quot;\/C=TR\/ST=Istanbul\/O=OrnekCA\/CN=Ornek Root CA&quot; \n  -out ca.crt\n\n# 2) Sunucu sertifikas\u0131 (\u00f6r. api.ornek.local)\nopenssl genrsa -out server.key 2048\nopenssl req -new -key server.key -out server.csr \n  -subj &quot;\/C=TR\/ST=Istanbul\/O=Ornek\/CN=api.ornek.local&quot;\n\n# Subject Alternative Name (SAN) dosyas\u0131\ncat &gt; san.cnf &lt;&lt;EOF\nsubjectAltName = @alt_names\n[alt_names]\nDNS.1 = api.ornek.local\nDNS.2 = api\nEOF\n\nopenssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \n  -out server.crt -days 825 -sha256 -extfile san.cnf\n\n# 3) \u0130stemci sertifikas\u0131 (\u00f6r. stok-servisi)\nopenssl genrsa -out client.key 2048\nopenssl req -new -key client.key -out client.csr \n  -subj &quot;\/C=TR\/ST=Istanbul\/O=Ornek\/CN=stok-servisi&quot;\n\necho &quot;extendedKeyUsage = clientAuth&quot; &gt; client-ext.cnf\nopenssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \n  -out client.crt -days 365 -sha256 -extfile client-ext.cnf\n<\/code><\/pre>\n<p>Burada \u00f6nemli olan, istemci sertifikas\u0131nda <strong>clientAuth<\/strong> uzant\u0131s\u0131n\u0131n bulunmas\u0131. Sunucu taraf\u0131nda da <strong>serverAuth<\/strong> beklendi\u011fini unutmay\u0131n. Ayr\u0131ca SAN alanlar\u0131, sunucu ad\u0131n\u0131n do\u011fru e\u015fle\u015fmesi i\u00e7in kritik. K\u00fc\u00e7\u00fck bir not: \u00dcretimde k\u00f6k CA\u2019y\u0131 \u00e7evrimd\u0131\u015f\u0131 tutup bir ara CA ile imzalama yapmak iyi bir al\u0131\u015fkanl\u0131k. Daha temiz bir PKI ak\u0131\u015f\u0131 i\u00e7in <a href=\"https:\/\/smallstep.com\/docs\/step-ca\" rel=\"nofollow noopener\" target=\"_blank\">Smallstep ile k\u00fc\u00e7\u00fck bir CA kurma rehberlerine<\/a> g\u00f6z atmak ho\u015f oluyor.<\/p>\n<h2 id=\"section-4\"><span id=\"Nginxte_mTLS_Sunucu_Dogrulama_ve_Uygulamaya_Bilgi_Aktarma\">Nginx\u2019te mTLS: Sunucu, Do\u011frulama ve Uygulamaya Bilgi Aktarma<\/span><\/h2>\n<p>Nginx taraf\u0131nda iki farkl\u0131 ak\u0131\u015f var. Birincisi do\u011frudan Nginx\u2019in terminasyon yapt\u0131\u011f\u0131 ve istemci sertifikas\u0131n\u0131 kendisinin do\u011frulad\u0131\u011f\u0131 ak\u0131\u015f. \u0130kincisi ise Nginx\u2019in do\u011frulay\u0131p kimlik bilgilerini arka u\u00e7 uygulamaya ba\u015fl\u0131klarla aktarmas\u0131. Ben genellikle ikinci yakla\u015f\u0131m\u0131 seviyorum; uygulama taraf\u0131 kimlik do\u011frulamay\u0131 g\u00f6rmek isteyebiliyor.<\/p>\n<p>A\u015fa\u011f\u0131daki \u00f6rnek, mTLS\u2019i zorunlu k\u0131l\u0131yor ve istemci sertifikas\u0131 kabul edilmezse 400 ile kap\u0131y\u0131 kapat\u0131yor. Bir yandan da uygulamaya konu ile ilgili bilgileri header olarak iletiyor.<\/p>\n<pre class=\"language-nginx line-numbers\"><code class=\"language-nginx\">server {\n    listen 443 ssl http2;\n    server_name api.ornek.local;\n\n    ssl_certificate     \/etc\/ssl\/server.crt;\n    ssl_certificate_key \/etc\/ssl\/server.key;\n\n    # \u0130stemci sertifikalar\u0131n\u0131 do\u011frulamak i\u00e7in CA\n    ssl_client_certificate \/etc\/ssl\/ca.crt;\n    ssl_verify_client on;\n    ssl_verify_depth 2;\n\n    # G\u00fczel k\u0131s\u0131tlar (\u00f6rnek)\n    ssl_protocols TLSv1.2 TLSv1.3;\n    ssl_ciphers HIGH:!aNULL:!MD5;\n\n    # \u0130stemci bilgilerini upstream'e aktar\n    proxy_set_header X-Client-Cert           $ssl_client_cert;\n    proxy_set_header X-Client-Verify         $ssl_client_verify;\n    proxy_set_header X-Client-Subject        $ssl_client_s_dn;\n    proxy_set_header X-Client-Subject-CN     $ssl_client_s_dn_cn;\n    proxy_set_header X-Client-Issuer         $ssl_client_i_dn;\n\n    location \/healthz {\n        # Sa\u011fl\u0131k kontrol\u00fc i\u00e7in mTLS'i opsiyonel yapmay\u0131 isteyebilirsiniz\n        # ssl_verify_client off; # Ya da ayr\u0131 bir server blo\u011fu kullan\u0131n\n        return 200 'ok';\n    }\n\n    location \/ {\n        proxy_pass http:\/\/backend_app;\n    }\n}\n\nupstream backend_app {\n    server 127.0.0.1:3000;\n}\n<\/code><\/pre>\n<p>Baz\u0131 durumlarda mTLS\u2019i opsiyonel yapmak istersiniz. Mesela yaln\u0131zca baz\u0131 endpoint\u2019lerde istiyorsan\u0131z, <strong>ssl_verify_client optional<\/strong> ile gelen sertifika var m\u0131 yok mu bakabilirsiniz, sonra <strong>$ssl_client_verify<\/strong> de\u011fi\u015fkenine g\u00f6re ko\u015fula ba\u011flayabilirsiniz. Ba\u015fka bir ipucu: Sertifika iptallerini y\u00f6netiyorsan\u0131z, Nginx\u2019e CRL dosyas\u0131 g\u00f6stermek i\u00e7in <strong>ssl_crl<\/strong> kullanabilirsiniz. Detayl\u0131 y\u00f6nergeleri <a href=\"http:\/\/nginx.org\/en\/docs\/http\/ngx_http_ssl_module.html\" rel=\"nofollow noopener\" target=\"_blank\">Nginx SSL mod\u00fcl\u00fc belgelerinde<\/a> bulmak rahatlat\u0131r.<\/p>\n<p>Uygulamaya aktard\u0131\u011f\u0131m\u0131z ba\u015fl\u0131klar\u0131 basit\u00e7e kontrol etmek m\u00fcmk\u00fcn. Mesela Express.js ile \u015f\u00f6yle bir kontrol d\u00fc\u015f\u00fcn\u00fcn; sertifika do\u011fruland\u0131ysa gelen CN\u2019ye g\u00f6re rol atars\u0131n\u0131z, de\u011filse iste\u011fi geri \u00e7evirirsiniz. Minik bir \u00f6rnek:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">\/\/ Node.js\/Express \u00f6rne\u011fi\napp.use((req, res, next) =&gt; {\n  const verified = req.headers['x-client-verify'] === 'SUCCESS';\n  const cn = req.headers['x-client-subject-cn'];\n  if (!verified) return res.status(401).json({ error: 'mTLS gerekli' });\n  req.client = { cn };\n  next();\n});\n\napp.get('\/stok', (req, res) =&gt; {\n  if (req.client.cn !== 'stok-servisi') return res.status(403).json({ error: 'izinsiz' });\n  res.json({ durum: 'stok verisi' });\n});\n<\/code><\/pre>\n<p>Bu y\u00f6ntem, a\u011f s\u0131n\u0131r\u0131ndaki mTLS\u2019i uygulama katman\u0131nda ince ayarlarla birle\u015ftirir. \u0130stemcinin kim oldu\u011funu \u00f6\u011frendi\u011finiz an, yetkilendirme oyun alan\u0131 geni\u015fler.<\/p>\n<h2 id=\"section-5\"><span id=\"Caddyde_mTLS_Caddyfile_ile_Dogal_Yalin_ve_Tatli\">Caddy\u2019de mTLS: Caddyfile ile Do\u011fal, Yal\u0131n ve Tatl\u0131<\/span><\/h2>\n<p>Caddy\u2019nin sade yap\u0131s\u0131n\u0131 seviyorum. Tek bir Caddyfile ile sertifikalar\u0131 otomatik al, mTLS ko\u015fulunu koy, reverse proxy ayarla; hepsi birka\u00e7 sat\u0131ra bak\u0131yor. Sunucu sertifikas\u0131n\u0131 ACME ile al\u0131rken, istemci do\u011frulamas\u0131 i\u00e7in kendi CA\u2019n\u0131z\u0131 g\u00f6sterebilirsiniz.<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">api.ornek.local {\n    encode gzip\n\n    # Sunucu sertifikas\u0131n\u0131 otomatik al\u0131r (Let's Encrypt)\n    tls {\n        client_auth {\n            mode require_and_verify\n            trusted_ca_cert_file \/etc\/ssl\/ca.crt\n        }\n    }\n\n    @health path \/healthz\n    handle @health {\n        respond &quot;ok&quot; 200\n    }\n\n    reverse_proxy 127.0.0.1:3000 {\n        header_up X-Client-Verify {tls_client_verified}\n        header_up X-Client-Subject {tls_client_subject}\n        header_up X-Client-Cert {tls_client_cert}\n    }\n}\n<\/code><\/pre>\n<p>Burada <strong>{tls_client_verified}<\/strong> gibi yerle\u015fik de\u011ferlerle istemci do\u011frulamas\u0131n\u0131 uygulamaya ge\u00e7iriyoruz. Sunucu sertifikas\u0131 i\u00e7in ek bir \u015fey yapman\u0131za gerek kalm\u0131yor; Caddy otomatikle\u015ftiriyor. Daha fazla ipucu i\u00e7in <a href=\"https:\/\/caddyserver.com\/docs\/caddyfile\/directives\/tls#client_auth\" rel=\"nofollow noopener\" target=\"_blank\">Caddy tls ve client_auth dok\u00fcmanlar\u0131n\u0131<\/a> okumak iyi geliyor.<\/p>\n<p>Sa\u011fl\u0131k kontrolleri i\u00e7in ben genelde mTLS\u2019i esnetiyorum. \u0130ki \u00e7\u00f6z\u00fcm ho\u015fuma gidiyor: Ya health endpoint\u2019ini ayr\u0131 bir site blo\u011funda, mTLS\u2019siz a\u00e7mak; ya da ayn\u0131 blokta path\u2019e \u00f6zel bir handle yazarak kolayla\u015ft\u0131rmak. Trafi\u011fin kalan\u0131nda ise mTLS\u2019i zorunlu tutmak, i\u00e7eriyi ferahlat\u0131yor.<\/p>\n<h2 id=\"section-6\"><span id=\"API_ve_Mikroservislerde_mTLSi_Gunluk_Hayata_Katmak\">API ve Mikroservislerde mTLS\u2019i G\u00fcnl\u00fck Hayata Katmak<\/span><\/h2>\n<p>Ger\u00e7ek d\u00fcnyada i\u015fin en tatl\u0131 yan\u0131, mTLS\u2019i sadece bir kap\u0131 kilidi gibi de\u011fil; kimlik kart\u0131 gibi kullanmak. Mesela sipari\u015f servisi stok servisine konu\u015ftu\u011funda, stok servisi \u201ckim konu\u015fuyor?\u201d diye sormaz; mTLS zaten konu\u015fan\u0131n <strong>stok-servisi<\/strong> olup olmad\u0131\u011f\u0131n\u0131 kan\u0131tlar. Uygulama katman\u0131 bu kimli\u011fi al\u0131p eri\u015fim kurallar\u0131na d\u00f6kebilir. Bu, gereksiz token do\u011frulamalar\u0131n\u0131 azaltabildi\u011fi gibi, a\u011f trafi\u011fini sadele\u015ftirir.<\/p>\n<p>Bir ba\u015fka ak\u0131\u015f: Harici bir entegrasyonla konu\u015fuyorsunuz ama o tarafa client sertifikas\u0131 veremiyorsunuz. Burada mTLS i\u00e7 a\u011fda devrede kals\u0131n, d\u0131\u015f d\u00fcnyayla ise JWT veya ba\u015fka bir kimlik katman\u0131 kullan\u0131n. Nginx\/Caddy mTLS\u2019i i\u00e7eriye kadar ta\u015f\u0131r, API ge\u00e7idi ise d\u0131\u015f d\u00fcnyayla token konu\u015fur. B\u00f6yle hibrit \u00e7\u00f6z\u00fcmler pratikte \u00e7ok i\u015fe yar\u0131yor.<\/p>\n<p>\u0130\u00e7 servislerin her birine farkl\u0131 bir istemci sertifikas\u0131 vermek g\u00fczel bir izleme disiplini yarat\u0131r. Hangi servis hangi \u00e7a\u011fr\u0131y\u0131 yapm\u0131\u015f, log\u2019larda hangi CN ile giri\u015f yap\u0131lm\u0131\u015f, geriye d\u00f6n\u00fck raporlar nas\u0131l olu\u015fmu\u015f; hepsi daha okunakl\u0131 olur. E\u011fer izlenebilirlik g\u00f6z\u00fcn\u00fcze ho\u015f geliyorsa, servislerinizde istekleri iz s\u00fcrmenin yollar\u0131n\u0131 konu\u015ftu\u011fum <a href=\"https:\/\/www.dchost.com\/blog\/opentelemetry-ile-izlenebilirlik-laravel-ve-node-jste-jaeger-tempoya-uctan-uca-izler-nasil-kurulur\/\">OpenTelemetry ile izlenebilirlik rehberine<\/a> g\u00f6z at\u0131n; mTLS ile birlikte harika bir ikili oluyorlar.<\/p>\n<h2 id=\"section-7\"><span id=\"Sertifika_Rotasyonu_Iptal_Listeleri_ve_Kucuk_Tuzaklar\">Sertifika Rotasyonu, \u0130ptal Listeleri ve K\u00fc\u00e7\u00fck Tuzaklar<\/span><\/h2>\n<p>Sertifikalar\u0131n s\u00fcresi doluyor; bu bir ger\u00e7ek. Bunu dert etmemenin yolu, k\u0131sa \u00f6m\u00fcrl\u00fc sertifikalar ve d\u00fczenli otomasyon. \u0130stemci sertifikalar\u0131n\u0131 3-6 ay aral\u0131\u011f\u0131nda tutup, s\u00fcresi dolmadan birka\u00e7 g\u00fcn \u00f6nce yenileyen k\u00fc\u00e7\u00fck bir i\u015f ak\u0131\u015f\u0131 kurmak \u00e7ok rahatlat\u0131yor. Eski ve yeni sertifika bir s\u00fcre birlikte ge\u00e7erli oldu\u011funda, kesintisiz ge\u00e7i\u015fler m\u00fcmk\u00fcn oluyor.<\/p>\n<p>\u0130ptal konusu bazen \u0131skalan\u0131yor. Yanl\u0131\u015fl\u0131kla s\u0131zm\u0131\u015f bir anahtar varsa, CRL (Certificate Revocation List) yay\u0131nlay\u0131p Nginx\u2019e g\u00f6sterebilirsiniz. \u00d6rnek bir yap\u0131 \u015f\u00f6yle:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\"># \u00d6rnek CRL \u00fcretimi (CA taraf\u0131nda)\n# index.txt ve serial dosyalar\u0131n\u0131 kullanan bir openssl.cnf ak\u0131\u015f\u0131 varsayal\u0131m\nopenssl ca -gencrl -keyfile ca.key -cert ca.crt -out ca.crl\n\n# Nginx'e tan\u0131t\u0131n\nssl_crl \/etc\/ssl\/ca.crl;\n<\/code><\/pre>\n<p>Caddy cephesinde, istemci sertifikas\u0131 do\u011frularken CRL kontrol\u00fcn\u00fc do\u011frudan Caddy\u2019ye de\u011fil; arka taraftaki kurumsal PKI sistemine b\u0131rakmak daha yayg\u0131n bir tercih. Alternatif olarak k\u0131sa \u00f6m\u00fcrl\u00fc istemci sertifikalar\u0131yla iptal ihtiyac\u0131n\u0131 azaltmak pratik bir yakla\u015f\u0131m oluyor.<\/p>\n<p>K\u00fc\u00e7\u00fck tuzaklar her zaman var. Sunucu ad\u0131 e\u015fle\u015fmiyorsa SAN alanlar\u0131n\u0131 tekrar kontrol edin. Zincirde bir eksik varsa ara sertifikay\u0131 sunucuya tan\u0131t\u0131n. Saat fark\u0131 yapabilecek kadar b\u00fcy\u00fckse sertifika \u201chen\u00fcz ge\u00e7erli de\u011fil\u201d der; \u00fcretim makinelerinin saatlerini NTP ile hizalamak bu y\u00fczden \u00f6nemli. G\u00fcn\u00fcn sonunda minik ayr\u0131nt\u0131lar b\u00fcy\u00fck fark yarat\u0131yor.<\/p>\n<h2 id=\"section-8\"><span id=\"Test_Log_ve_Alarm_Oldu_mu_Sorusu_Icin_Pratik_Adimlar\">Test, Log ve Alarm: \u201cOldu mu?\u201d Sorusu \u0130\u00e7in Pratik Ad\u0131mlar<\/span><\/h2>\n<p>mTLS\u2019i test etmenin en ho\u015f yolu, curl ile sertifika tak\u0131p denemek. \u0130stemci sertifikas\u0131n\u0131 ve anahtar\u0131n\u0131 verince \u201cben buyum\u201d diyerek tokala\u015f\u0131yorsunuz. \u00d6rnek bir komut:<\/p>\n<pre class=\"language-bash line-numbers\"><code class=\"language-bash\">curl -v https:\/\/api.ornek.local\/stok \n  --cert client.crt --key client.key \n  --cacert ca.crt\n<\/code><\/pre>\n<p>Bir de istemci sertifikas\u0131 olmadan deneyin; 400 veya 401 gibi bir cevap alman\u0131z normal. Nginx debug log\u2019lar\u0131nda <strong>$ssl_client_verify<\/strong> de\u011ferine bakmak g\u00fczel fikir. Caddy\u2019de ise g\u00fcnl\u00fck loglar a\u00e7\u0131k ve okunakl\u0131; do\u011frulama durumunu net g\u00f6r\u00fcrs\u00fcn\u00fcz.<\/p>\n<p>Loglar demi\u015fken, merkezi loglamay\u0131 seviyorsan\u0131z, uygulama ve reverse proxy loglar\u0131n\u0131 bir araya getirip arama yapman\u0131n rahatl\u0131\u011f\u0131n\u0131 bilirsiniz. Bu konuda <a href=\"https:\/\/www.dchost.com\/blog\/vps-log-yonetimi-nasil-rayina-oturur-grafana-loki-promtail-ile-merkezi-loglama-tutma-sureleri-ve-alarm-kurallari\/\">Grafana Loki + Promtail ile merkezi loglama rehberinde<\/a> pratik bir ak\u0131\u015f var; mTLS i\u00e7in kim hangi CN ile giri\u015f yapt\u0131, hata g\u00fcnlerinde hangi servis t\u00f6kezledi, hepsini tek ekranda g\u00f6rmek i\u00e7i serinletiyor.<\/p>\n<p>Bir de a\u011f katman\u0131n\u0131 ihmal etmeyin. mTLS varken bile gereksiz portlar\u0131 kapatmak, oran s\u0131n\u0131rlamas\u0131 koymak ve IPv6\u2019y\u0131 d\u00fczenli tutmak dayanak noktas\u0131. E\u011fer g\u00fcvenlik duvar\u0131 ayarlar\u0131n\u0131 seviyorsan\u0131z, <a href=\"https:\/\/www.dchost.com\/blog\/nftables-ile-vps-guvenlik-duvari-rehberi-rate-limit-port-knocking-ve-ipv6-kurallari-nasil-tatli-tatli-kurulur\/\">nftables ile VPS g\u00fcvenlik duvar\u0131 rehberindeki<\/a> \u00f6rnekler, mTLS\u2019in \u00fcst\u00fcne g\u00fczel bir \u015femsiye oluyor.<\/p>\n<h2 id=\"section-9\"><span id=\"Gercek_Hayattan_Kucuk_Bir_Ornek_Yonetim_Panelleri_ve_Sakin_Uykular\">Ger\u00e7ek Hayattan K\u00fc\u00e7\u00fck Bir \u00d6rnek: Y\u00f6netim Panelleri ve Sakin Uykular<\/span><\/h2>\n<p>\u0130\u00e7eride en hassas yerlerden biri y\u00f6netim panelleri. Eri\u015fimi sadece bir avu\u00e7 ekip \u00fcyesine verirsiniz ama yine de i\u00e7iniz rahat etmez. Ben mTLS\u2019i ilk kez bir y\u00f6netim panelinde devreye ald\u0131\u011f\u0131mda, IP k\u0131s\u0131tlar\u0131n\u0131 ve VPN\u2019i bozmadan, \u00fcst\u00fcne bir kimlik katman\u0131 daha takt\u0131m. \u0130\u00e7eri sadece bizim ekibin sertifikalar\u0131yla giriliyor, ba\u015fka hi\u00e7bir \u015feyle de\u011fil. Merak edenler i\u00e7in, bu konuda ad\u0131m ad\u0131m \u00f6rneklerin oldu\u011fu detayl\u0131 bir yaz\u0131 da var: <a href=\"https:\/\/www.dchost.com\/blog\/yonetim-panellerini-mtls-ile-nasil-kale-gibi-korursun-nginxte-istemci-sertifikalari-adim-adim\/\">Y\u00f6netim panellerini mTLS ile kale gibi korumak<\/a> ger\u00e7ekten uyku kalitesini art\u0131r\u0131yor.<\/p>\n<h2 id=\"section-10\"><span id=\"Operasyon_Ipuclari_Dagitim_Otomasyon_ve_Kucuk_Aliskanliklar\">Operasyon \u0130pu\u00e7lar\u0131: Da\u011f\u0131t\u0131m, Otomasyon ve K\u00fc\u00e7\u00fck Al\u0131\u015fkanl\u0131klar<\/span><\/h2>\n<p>\u0130stemci sertifikalar\u0131n\u0131 da\u011f\u0131t\u0131rken basit bir ya\u015fam d\u00f6ng\u00fcs\u00fc olu\u015fturun. Sertifikalar\u0131 bir varl\u0131k gibi g\u00f6r\u00fcn; kimde var, ne zaman verilmi\u015f, ne zaman bitecek, iptal durumu ne; hepsi kay\u0131tl\u0131 olsun. K\u00fc\u00e7\u00fck bir envanter dosyas\u0131, hatta basit bir tablo bile kafi. Da\u011f\u0131t\u0131m\u0131 Ansible veya CI\/CD hatt\u0131n\u0131zla yapmak i\u015fleri tatl\u0131la\u015ft\u0131r\u0131yor.<\/p>\n<p>Sunucu taraf\u0131nda Caddy kullan\u0131yorsan\u0131z sertifika yenileme derdi zaten hafifliyor. Nginx taraf\u0131nda ise <strong>certbot<\/strong> veya ba\u015fka bir ACME istemcisiyle yenilemeyi cron\u2019a al\u0131p, yenilendi\u011finde Nginx\u2019i yumu\u015fak\u00e7a reload etmek yeterli. \u0130stemci sertifikalar\u0131nda ise \u201cyenisini \u00fcret, deploy et, eskisini bir s\u00fcre daha ge\u00e7erli tut\u201d y\u00f6ntemini seviyorum. B\u00f6ylece ge\u00e7i\u015fte t\u0131kanma ya\u015fanm\u0131yor.<\/p>\n<p>Bir \u015feyi daha s\u00f6ylemeden ge\u00e7emeyece\u011fim: Test ortam\u0131 ile \u00fcretim ortam\u0131n\u0131 olabildi\u011fince birbirine benzetin. Sertifika zincirleri, CA dosyalar\u0131, dosya izinleri, path\u2019ler; hepsi ayn\u0131 formda durdu\u011funda \u201ctestte \u00e7al\u0131\u015f\u0131yordu\u201d c\u00fcmlesi daha az duyuluyor.<\/p>\n<h2 id=\"section-11\"><span id=\"Sorun_Giderme_El_Sikisamadik_Dediginde_Ne_Yapmali\">Sorun Giderme: \u201cEl S\u0131k\u0131\u015famad\u0131k\u201d Dedi\u011finde Ne Yapmal\u0131?<\/span><\/h2>\n<p>E\u011fer el s\u0131k\u0131\u015fma olmuyorsa, \u00fc\u00e7 \u015feye bakar\u0131m. Bir: Hata sayfas\u0131nda g\u00f6rd\u00fc\u011f\u00fcn\u00fcz mesaj ne? Nginx\u2019te 400 bad certificate mi? Bu genellikle CA\u2019n\u0131n tan\u0131t\u0131lmad\u0131\u011f\u0131 veya istemci sertifikas\u0131n\u0131n kapsam\u0131n\u0131n (clientAuth) uygun olmad\u0131\u011f\u0131 anlam\u0131na gelir. \u0130ki: Sertifikan\u0131n tarihi. Saat fark\u0131 y\u00fcz\u00fcnden \u201chen\u00fcz ge\u00e7erli de\u011fil\u201d veya \u201cs\u00fcresi dolmu\u015f\u201d s\u0131k kar\u015f\u0131ma \u00e7\u0131kar. \u00dc\u00e7: Zincir eksikli\u011fi. Ara CA\u2019y\u0131 sunucuya d\u00fczg\u00fcn vermek gerekiyor.<\/p>\n<p>Komut sat\u0131r\u0131yla te\u015fhis i\u00e7in iki ara\u00e7 \u00e7ok i\u015fe yar\u0131yor. <strong>curl -v<\/strong> ile ayr\u0131nt\u0131l\u0131 g\u00fcnl\u00fck al\u0131rs\u0131n\u0131z; <strong>openssl s_client -connect<\/strong> ile de sunucunun hangi sertifikay\u0131 verdi\u011fini ve zinciri g\u00f6r\u00fcrs\u00fcn\u00fcz. Caddy taraf\u0131nda hata g\u00fcnl\u00fckleri \u00e7o\u011fu zaman neyin eksik oldu\u011funu s\u00f6yleyecek kadar g\u00fczel. T\u0131kand\u0131\u011f\u0131n\u0131z yerde resmi belgelere d\u00f6nmek iyi geliyor; <a href=\"https:\/\/caddyserver.com\/docs\/caddyfile\/directives\/tls\" rel=\"nofollow noopener\" target=\"_blank\">Caddy tls y\u00f6nergeleri<\/a> ve <a href=\"http:\/\/nginx.org\/en\/docs\/http\/ngx_http_ssl_module.html\" rel=\"nofollow noopener\" target=\"_blank\">Nginx SSL mod\u00fcl\u00fc sayfas\u0131<\/a> k\u0131sa zamanda yol g\u00f6steriyor.<\/p>\n<h2 id=\"section-12\"><span id=\"Kapanis_mTLS_ile_Iciniz_Rahat_Trafik_Akisiniz_Sakin\">Kapan\u0131\u015f: mTLS ile \u0130\u00e7iniz Rahat, Trafik Ak\u0131\u015f\u0131n\u0131z Sakin<\/span><\/h2>\n<p>Toparlarsak; mTLS\u2019i bir duvar de\u011fil, bir kimlik kart\u0131 gibi d\u00fc\u015f\u00fcnmek i\u015finizi kolayla\u015ft\u0131r\u0131yor. Nginx\u2019te veya Caddy\u2019de birka\u00e7 ayarla istemciyi do\u011fruluyor, uygulamaya kimlik bilgisini nazik\u00e7e ta\u015f\u0131yorsunuz. Mikroservisler aras\u0131 konu\u015fma daha sakin, daha g\u00fcvenli ve daha izlenebilir hale geliyor. En \u00e7ok sevdi\u011fim his \u015fu: \u0130\u00e7erideki trafi\u011fe bakt\u0131\u011f\u0131mda, kim konu\u015fuyor net; kap\u0131ya yakla\u015fan her iste\u011fin kimli\u011fi var ya da yok. Bu netlik operasyonda huzur veriyor.<\/p>\n<p>Pratik birka\u00e7 tavsiyeyi b\u0131rakay\u0131m. Sertifikalar\u0131 k\u0131sa \u00f6m\u00fcrl\u00fc yap\u0131n, otomasyonu benimseyin, iptal listesini unutmay\u0131n. Loglar\u0131 merkezile\u015ftirin, alarmlar\u0131 ger\u00e7ek\u00e7i kurun. Sa\u011fl\u0131k kontrollerini sade tutun, ama g\u00fcvenli\u011fi oradan esnetmeyin. ve mTLS\u2019i tek ba\u015f\u0131na kahraman yapmay\u0131n; g\u00fcvenlik duvar\u0131, oran s\u0131n\u0131rlama ve uygulama katman\u0131 kontrolleriyle birlikte bir b\u00fct\u00fcn olsun. Umar\u0131m bu yaz\u0131 akl\u0131n\u0131zdaki soru i\u015faretlerini azaltm\u0131\u015ft\u0131r. Bir sonraki yaz\u0131da g\u00f6r\u00fc\u015fmek \u00fczere, g\u00f6nl\u00fcn\u00fcz ve loglar\u0131n\u0131z hep ferah kals\u0131n.<\/p>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>\u0130&ccedil;indekiler1 Ofiste K\u00fc\u00e7\u00fck Bir Panik, B\u00fcy\u00fck Bir Ayd\u0131nlanma: mTLS&#8217;e Giden Yol2 mTLS Nedir, Niye Bu Kadar Rahatlat\u0131r?3 Kendi K\u00fc\u00e7\u00fck CA\u2019n\u0131 Kur: Sertifika \u00dcretimi ve Da\u011f\u0131t\u0131m\u0131n \u0130lk Ad\u0131m\u01314 Nginx\u2019te mTLS: Sunucu, Do\u011frulama ve Uygulamaya Bilgi Aktarma5 Caddy\u2019de mTLS: Caddyfile ile Do\u011fal, Yal\u0131n ve Tatl\u01316 API ve Mikroservislerde mTLS\u2019i G\u00fcnl\u00fck Hayata Katmak7 Sertifika Rotasyonu, \u0130ptal Listeleri ve [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1657,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26],"tags":[],"class_list":["post-1656","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-teknoloji"],"_links":{"self":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/1656","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/comments?post=1656"}],"version-history":[{"count":0,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/posts\/1656\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media\/1657"}],"wp:attachment":[{"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/media?parent=1656"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/categories?post=1656"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dchost.com\/blog\/wp-json\/wp\/v2\/tags?post=1656"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}