Path: blob/main/xml/tr/docs/http/configuring_https_servers.xml
1 views
<!DOCTYPE article SYSTEM "../../../../dtd/article.dtd">12<article name="HTTPS sunucularının yapılandırılması"3link="/tr/docs/http/configuring_https_servers.html"4lang="tr"5author="Igor Sysoev"6translator="Altan Tanrıverdi">78<section>910<para>11Bir HTTPS sunucusunu yapılandırmak için, server bloğu içerisinde SSL’i etkin hale getirmeli ve sunucu sertifikası ve özel anahtar dosyaları belirtmelisiniz:1213<programlisting>14server {15listen 443;16server_name www.example.com;17ssl on;18ssl_certificate www.example.com.crt;19ssl_certificate_key www.example.com.key;20ssl_protocols SSLv3 TLSv1;21ssl_ciphers HIGH:!ADH:!MD5;22...23}24</programlisting>2526Sunucu sertifikası herkese açık bir birimdir. Sunucuya bağlanan her istemciye gönderilir. Özel anahtar ise gizli bir birimdir ve erişimi engellenmiş bir alanda saklanır. Ancak nginx’in ana işlemi tarafından okunabilir olmalıdır. Özel anahtar, alternatif olarak sertifika ile aynı dosya içerisinde saklanabilir:2728<programlisting>29ssl_certificate www.example.com.cert;30ssl_certificate_key www.example.com.cert;31</programlisting>3233Bu durumda dosya erişimi kısıtlanmalıdır. Aynı dosyada yer alsalar da istemciye sadece sertifika gönderilir.34</para>3536<para>37<literal>ssl_protocols</literal> ve <literal>ssl_ciphers</literal> yönergeleri, güçlü SSL protokol ve şifrelere (cipher) yapılan bağlantılara limit koymak için kullanılır. Versiyon 0.8.20 ile birlikte nginx, <literal>ssl_protocols SSLv3 TLSv1</literal> ve <literal>ssl_ciphers HIGH:!ADH:!MD5</literal> yönergelerini varsayılan olarak kullanır, bu nedenle sadece daha önceki versiyonlarda yapılandırmaya eklenmelidir.38</para>3940</section>414243<section id="optimization" name="HTTPS sunucu optimizasyonu">4445<para>46SSL işlemleri ekstra işlemci (CPU) kaynakları tüketir. Çok-işlemcili sistemlerde birçok işçi işlemler yürütmelisiniz: Mevcut işlemci çekirdek sayısından az olmamalı. En yoğun işlemci-yoğun işlem SSL el sıkışmalarıdır (ÇN: SSL Handshake, kısaca sunucuda bulunan sertifikanın istemci bilgisayar tarafından onaylanması ve tekrar sunucuya bildirilmesi sürecidir). Her bir istemci için mevcut bu işlemlerin sayısını azaltmanın iki yolu vardır: İlki, keep-alive bağlantıları olanaklı kılarak bir çok talebi sadece bir bağlantı ile göndermek ve ikincisi ise SSL oturum parametrelerini tekrar kullanarak paralel ve izleyen (subsequent) bağlantılar için SSL el sıkışmalarından kaçınmaktır.4748Oturumlar, bir <literal>ssl_session_cache</literal> yönergesi tarafından yapılandırılan ve işçiler arasında paylaştırılmış bir SSL oturum önbelleğinde yer alır. Bir megabyte önbellek yaklaşık 4000 oturum içerir. Varsayılan önbellek zaman aşımı 5 dakikadır. <literal>ssl_session_timeout</literal> yönergesi ile bu süre arttırılabilir. 10M paylaşımlı oturum önbelleğine sahip bir quad core sistem için örnek yapılandırma:4950<programlisting>51<b>worker_processes 4</b>;5253http {54<b>ssl_session_cache shared:SSL:10m</b>;55<b>ssl_session_timeout 10m</b>;5657server {58listen 443;59server_name www.example.com;60<b>keepalive_timeout 70</b>;6162ssl on;63ssl_certificate www.example.com.crt;64ssl_certificate_key www.example.com.key;65ssl_protocols SSLv3 TLSv1;66ssl_ciphers HIGH:!ADH:!MD5;67...68</programlisting>69</para>7071</section>727374<section id="chains" name="SSL sertifika zincirleri">7576<para>77Bazı tarayıcılar popüler bir sertifika otoritesi tarafından imzalanmış sertifikaları sorunsuz kabul ederken, diğerleri sorun çıkarabilir. Bunun nedeni sertifika otoritesinin, sunucu sertifikasını, güvenilir sertifika veri tabanında yer almayan aracı bir sertifikayı kullanarak imzalamış olmasıdır. Bu durumda otorite, imzalanmış sertifikaya art arda bağlanması gereken bir dizi sertifika zinciri sunar. Bir araya geldikleri dosyada ilk önce sunucu sertifikası daha sonra zincirlenmiş sertifikalar yer almalıdır:7879<programlisting>80$ cat www.example.com.crt bundle.crt > www.example.com.chained.crt81</programlisting>8283Oluşan dosya <literal>ssl_certificate</literal> yönergesi içinde kullanılmalıdır:8485<programlisting>86server {87listen 443;88server_name www.example.com;89ssl on;90ssl_certificate www.example.com.chained.crt;91ssl_certificate_key www.example.com.key;92...93}94</programlisting>9596Eğer bu art arda diziliş yanlış yapılmış olursa, nginx başlamayacak ve aşağıdakine benzer bir hata mesajını verecektir:9798<programlisting>99SSL_CTX_use_PrivateKey_file(" ... /www.example.com.key") failed100(SSL: error:0B080074:x509 certificate routines:101X509_check_private_key:key values mismatch)102</programlisting>103104Bu durum, nginx’in sunucu sertifikası yerine zincirlenmiş sertifikaların ilkinin özel anahtarını kullanmaya çalışması sonucu oluşur.105</para>106107<para>108Tarayıcılar, güvenilir otoriteler tarafından imzalanmış aracı sertifikaları genellikle depolarlar. Bu nedenle tarayıcı aracı sertifikaları daha önceden depolamış olabileceğinden zincirlenmiş sertifikalara ihtiyaç duymadan sertifika hakkında uyarı vermezler. Diğer taraftan sunucunun sertifika zincir dizisini tam olarak gönderdiğinden emin olmak için <path>openssl</path> komutunu kullanabilirsiniz:109110<programlisting>111$ openssl s_client -connect www.godaddy.com:443112...113Certificate chain1140 s:/C=US/ST=Arizona/L=Scottsdale/1.3.6.1.4.1.311.60.2.1.3=US115/1.3.6.1.4.1.311.60.2.1.2=AZ/O=GoDaddy.com, Inc116/OU=MIS Department/<b>CN=www.GoDaddy.com</b>117/serialNumber=0796928-7/2.5.4.15=V1.0, Clause 5.(b)118i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.119/OU=http://certificates.godaddy.com/repository120/CN=Go Daddy Secure Certification Authority121/serialNumber=079692871221 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.123/OU=http://certificates.godaddy.com/repository124/CN=Go Daddy Secure Certification Authority125/serialNumber=07969287126i:/C=US/O=The Go Daddy Group, Inc.127/OU=Go Daddy Class 2 Certification Authority1282 s:/C=US/O=The Go Daddy Group, Inc.129/OU=Go Daddy Class 2 Certification Authority130i:/L=ValiCert Validation Network/O=<b>ValiCert, Inc.</b>131/OU=ValiCert Class 2 Policy Validation Authority132/CN=http://www.valicert.com//[email protected]133...134</programlisting>135136Bu örnekte <literal>www.GoDaddy.com</literal> sunucu sertifikasının (server certificate #0) “<i>s</i>” ile belirtilen konusu (subject), “<i>i</i>” ile gösterilen ve aynı zamanda kendisi de sonraki sertifikanın (certificate #1) konusu (subject) olan, sertifikayı veren/yayınlayan (issuer) tarafından imzalanır. Sonraki sertifika (certificate #1) ise bir sonraki sertifika (certificate #2) tarafından imzalanmıştır ve bu son sertifika <i>ValiCert, Inc.</i> tarafından imzalanmıştır. Bu firmanın sertifikası, tarayıcının kurulumuyla gelen sertifika veritabanında bulunur.137</para>138139<para>140Eğer sertifika dizisi eklemediyseniz, yalnızca bir sunucu sertifikası görürsünüz (server certificate #0).141</para>142143</section>144145146<section id="single_http_https_server" name="Tekil HTTP/HTTPS sunucusu">147148<para>149En baştan HTTP ve HTTPS protokollerini ayrı yapılandırmak en iyisidir. Mevcut durumda fonksiyonellikleri aynı gözükmekle birlikte, bu gelecekte önemli bir şekilde değişebilir ve birleştirilmiş bir sunucu problemli olabilir. Ancak, eğer HTTP ve HTTPS sunucuları eşit ise ve geleceği düşünmek istemiyorsanız, <literal>ssl on</literal> yönergesini silerek ve *:443 portu için <literal>ssl</literal> parametresi ekleyerek, HTTP ve HTTPS taleplerini tutan yalnızca bir sunucu yapılandırabilirsiniz:150151<programlisting>152server {153listen 80;154listen 443 ssl;155server_name www.example.com;156ssl_certificate www.example.com.crt;157ssl_certificate_key www.example.com.key;158...159}160</programlisting>161162<note>163Versiyon 0.8.21 öncesi, nginx yalnızca <literal>default</literal> parametresine sahip listen soketlerinde <literal>ssl</literal> parametresinin eklenmesine izin veriyordu:164<programlisting>165listen 443 default ssl;166</programlisting>167</note>168</para>169170</section>171172173<section id="name_based_https_servers" name="Ad tabanlı HTTPS sunucuları">174175<para>176Bir IP adresini dinleyen iki veya daha fazla HTTPS sunucusunu yapılandırdığınız zaman genel bir problem ortaya çıkar:177178<programlisting>179server {180listen 443;181server_name www.example.com;182ssl on;183ssl_certificate www.example.com.crt;184...185}186187server {188listen 443;189server_name www.example.org;190ssl on;191ssl_certificate www.example.org.crt;192...193}194</programlisting>195196Bu yapılandırmada, bir tarayıcı talep edilen sunucuya bakmadan, varsayılan sunucunun sertifikasını alır, örneğin: <literal>www.example.com</literal>. Bu SSL protokolüne özgü bir durumdan kaynaklanır. SSL bağlantısı, tarayıcının HTTP talebi göndermesinden önce kurulur ve nginx talep edilen sunucunun adını bilmez. Bu nedenle yalnızca varsayılan sunucunun sertifikasını önerir.197</para>198199<para>200Bu problemi çözmenin en eski ve sağlam methodu HTTPS sunucularının her birine ayrı IP adresleri atamaktır:201202<programlisting>203server {204listen 192.168.1.1:443;205server_name www.example.com;206ssl on;207ssl_certificate www.example.com.crt;208...209}210211server {212listen 192.168.1.2:443;213server_name www.example.org;214ssl on;215ssl_certificate www.example.org.crt;216...217}218</programlisting>219</para>220221</section>222223224<section id="certificate_with_several_names"225name="Birçok ad içeren SSL sertifikası">226227<para>228Bir tekil IP’yi birçok HTTPS sunucu arasında paylaştırmanın başka yolları da vardır, ancak bunların hepsi dezavantajlara sahiptir. Bunlardan biri, birçok ad içeren bir sertifikanın, SubjectAltName sertifika alanında kullanılmasıdır. Örneğin: <literal>www.example.com</literal> ve <literal>www.example.org</literal>. Ancak SubjectAltName alan uzunluğu sınırlandırılmıştır.229</para>230231<para>232Diğer bir yol ise bir sertifikayı bir wildcard adı ile birlikte kullanmaktır. Örneğin: <literal>*.example.org</literal>. Bu sertifika <literal>www.example.org</literal> ile eşleşir ancak <literal>example.org</literal> ve <literal>www.sub.example.org</literal> ile eşleşmez. Bu iki method birlikte de kullanılabilir. Bir sertifika SubjectAltName alanı içerisinde gerçek ve wildcard adlarını içerebilir. Örneğin: <literal>example.org</literal> ve <literal>*.example.org</literal>.233</para>234235<para>236Tüm sunuculardaki tekil hafıza kopyalarını devralması için, birçok ad içeren bir sertifika dosyası ve onun özel anahtar dosyasını, yapılandırmanın <i>http</i> düzeyinde bulundurmak en iyisidir:237238<programlisting>239ssl_certificate common.crt;240ssl_certificate_key common.key;241242server {243listen 443;244server_name www.example.com;245ssl on;246...247}248249server {250listen 443;251server_name www.example.org;252ssl on;253...254}255</programlisting>256</para>257258</section>259260261<section id="sni" name="Server Name Indication">262263<para>264Bir IP adresi üzerinde birçok HTTPS sunucusu yürütebilmenin en genel yollarından biri, bir SSL el sıkışması (handshake) sırasında, tarayıcının talep edilmiş bir sunucu adını iletmesine izin veren ve böylece sunucunun varsayılan bağlantı için hangi sertifikayı kullanacağını bilmesini sağlayan <link url="http://en.wikipedia.org/wiki/Server_Name_Indication">TLSv1.1 Server Name Indication eklentisidir</link> (SNI, RFC3546). Ancak SNI, kısıtlı bir tarayıcı desteğine sahiptir. Mevcut destekleyen tarayıcılar ve versiyonları:265</para>266267<list type="bullet">268269<listitem>270Opera 8.0;271</listitem>272273<listitem>274MSIE 7.0 (sadece Windows Vista ve üstü);275</listitem>276277<listitem>278Firefox 2.0 ve Mozilla Platform rv:1.8.1 platformunu kullanan diğer tarayıcılar;279</listitem>280281<listitem>282Safari 3.2.1 (Windows Vista ve üstü);283</listitem>284285<listitem>286Chrome (Windows Vista ve üstü).287</listitem>288289</list>290291<para>292nginx içerisinde SNI kullanabilmek için, hem nginx ile birlikte yüklenen OpenSSL kütüphanesi hem de yürütüm süresi (run time) üzerinde dinamik olarak bağlatılanmış diğer kütüphaneler tarafından desteklenmiş olmalıdır. Versiyon 0.9.8f itibari ile <nobr>“--enable-tlsext”</nobr> yapılandırma opsiyonu ile birlikte OpenSSL, SNI desteği sunmaktadır. OpenSSL 0.9.8j itibari ile varsayılan olarak etkindir. Eğer nginx, SNI desteği ile yüklenirse “-V” anahtarını girdiğinizde aşağıdaki çıktı ile karşılaşırsınız:293294<programlisting>295$ nginx -V296...297TLS SNI support enabled298...299</programlisting>300301Ama eğer SNI-etkin nginx, SNI desteği olmadan dinamik olarak OpenSSL’e bağlantılanırsa, aşağıdaki hata ile karşılaşırsınız:302303<programlisting>304nginx was built with SNI support, however, now it is linked305dynamically to an OpenSSL library which has no tlsext support,306therefore SNI is not available307</programlisting>308</para>309310</section>311312313<section id="compatibility" name="Uygunluk">314315<para>316<list type="bullet">317318<listitem>319Versiyon 0.8.21 ve 0.7.62 ile birlikte SNI destek statüsü “-V” anahtarı ile birlikte görüntülenmeye başlandı.320</listitem>321322<listitem>323Versiyon 0.7.14 ile birlikte <literal>listen</literal> yönergesinin <literal>ssl</literal> parametresi desteklenmeye başlandı.324</listitem>325326<listitem>327Versiyon 0.5.32 ile birlikte SNI desteği gelmiştir.328</listitem>329330<listitem>331Versiyon 0.5.6 ile birlikte paylaşımlı SSL otorum önbelleği desteği gelmiştir.332</listitem>333334</list>335</para>336337<para>338<list type="bullet">339340<listitem>341Versiyon 0.7.65, 0.8.19 ve sonrası varsayılan SSL protokolleri: SSLv3 ve TLSv1.342</listitem>343344<listitem>345Versiyon 0.7.64, 0.8.18 ve öncesi varsayılan SSL protokolleri: SSLv2, SSLv3 ve TLSv1.346</listitem>347348</list>349</para>350351<para>352<list type="bullet">353354<listitem>355Versiyon 0.7.65, 0.8.20 ve sonrası varsayılan SSL şifreleri (cipher):356<literal>HIGH:!ADH:!MD5</literal>.357</listitem>358359<listitem>360Versiyon 0.8.19: varsayılan SSL şifreleri:361<literal>ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM</literal>.362</listitem>363364<listitem>365Versiyon 0.7.64, 0.8.18 ve öncesi varsayılan SSL şifreleri:<br/>366<literal>ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP</literal>.367</listitem>368369</list>370</para>371372373</section>374375376</article>377378379