Path: blob/main/xml/ja/docs/http/configuring_https_servers.xml
1 views
<!DOCTYPE article SYSTEM "../../../../dtd/article.dtd">12<article name="HTTPS サーバの設定"3link="/ja/docs/http/configuring_https_servers.html"4lang="ja"5author="Igor Sysoev"6translator="DigitalCube Co. Ltd., wokamoto">78<section>910<para>11HTTPS サーバを設定するには server ブロックで SSL プロトコルを有効にして、サーバ証明書ファイルと秘密鍵ファイルの場所を指定する必要があります: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>2526サーバ証明書とはドメインの所有者情報や、送信情報の暗号化に必要な公開鍵を含む電子証明書です。そのサーバに接続するすべてのクライアントに送られます。秘密鍵はサーバ証明書に含まれる公開鍵で暗号化された情報を復号するために必要な鍵で、秘匿する必要が有ります。アクセスを制限したファイルに保存するようにしてください。ただし、nginx のマスタープロセスからは読めるようにする必要があります。もうひとつの方法として、秘密鍵は証明書と同じファイルに保存することもできます:2728<programlisting>29ssl_certificate www.example.com.cert;30ssl_certificate_key www.example.com.cert;31</programlisting>3233この場合もファイルのアクセス権は制限するようにします。証明書と秘密鍵がひとつのファイルに保存されていても、証明書だけがクライアントに送られます。34</para>3536<para>37SSL プロトコルの強力なバージョンと暗号に接続を制限するには、ディレクティブ <literal>ssl_protocols</literal> と <literal>ssl_ciphers</literal> を使用します。バージョン 0.8.20 以降、nginx は <literal>ssl_protocols SSLv3 TLSv1</literal> と <literal>ssl_ciphers HIGH:!ADH:!MD5</literal> をデフォルトとして使用しているので、これより古い nginx のバージョンでのみ設定してください。38</para>3940</section>414243<section id="optimization" name="HTTPS サーバの最適化">4445<para>46SSL の工程は CPU リソースを余計に消費します。マルチプロセッサシステムでは(利用できる CPU コアの数よりも大きい数の)複数のワーカープロセスを走らせるといいでしょう。最も CPU に負荷がかかる工程は SSL ハンドシェイクです。クライアント毎のこの工程数を最小化するには2つの方法があります。最初の方法はキープアライブ接続を有効にして、ひとつの接続経由で複数のリクエストを送るようにする方法です。二つ目の方法は SSL セッションパラメータを再利用して、並行かつ順次接続のための SSL ハンドシェイクを避ける方法です。セッションはワーカー間で共有される SSL セッションキャッシュに保持され、<literal>ssl_session_cache</literal> ディレクティブで設定されています。1メガバイトのキャッシュには約4000のセッションが含まれます。キャッシュのデフォルトタイムアウトは5分です。この値は <literal>ssl_session_timeout</literal> ディレクティブを使用して増やすことができます。次の例は10Mの共有セッションキャッシュをもったクアッドコアシステムに最適化された設定例です:474849<programlisting>50<b>worker_processes 4</b>;5152http {53<b>ssl_session_cache shared:SSL:10m</b>;54<b>ssl_session_timeout 10m</b>;5556server {57listen 443;58server_name www.example.com;59<b>keepalive_timeout 70</b>;6061ssl on;62ssl_certificate www.example.com.crt;63ssl_certificate_key www.example.com.key;64ssl_protocols SSLv3 TLSv1;65ssl_ciphers HIGH:!ADH:!MD5;66...67</programlisting>68</para>6970</section>717273<section id="chains" name="SSL 連鎖証明書">7475<para>76ブラウザによっては有名な認証局によって署名された証明書にエラーをだすことがあります。その一方でその証明書を他のブラウザでは問題なく受け入れることもあります。これは発行している認証局が、有名で信用されている認証局の認証基盤には含まれない特定のブラウザで配布されている中間証明書を使ったサーバ証明書に署名しているからです。このケースでは、認証局は署名されたサーバ証明書に連結されているはずの連鎖証明書のバンドルを提供しています。サーバ証明書は、かならず結合されたファイル内の連鎖証明書に存在している必要があります:7778<programlisting>79$ cat www.example.com.crt bundle.crt > www.example.com.chained.crt80</programlisting>8182この結合されたファイルを <literal>ssl_certificate</literal> ディレクティブで使われるようにします:8384<programlisting>85server {86listen 443;87server_name www.example.com;88ssl on;89ssl_certificate www.example.com.chained.crt;90ssl_certificate_key www.example.com.key;91...92}93</programlisting>9495サーバ証明書とバンドルされたものが間違った順序で連結されていた場合、nginx は起動に失敗して次のエラーメッセージを表示します:9697<programlisting>98SSL_CTX_use_PrivateKey_file(" ... /www.example.com.key") failed99(SSL: error:0B080074:x509 certificate routines:100X509_check_private_key:key values mismatch)101</programlisting>102103これは、nginx がサーバ証明書ではなくバンドルされた最初の証明書で秘密鍵を使おうとするからです。104</para>105106<para>107ブラウザは通常、信頼されている認証局によって署名されている受信した中間証明書を保存します。したがって、よく使われているブラウザは要求された中間証明書をすでに保持しているかもしれませんし、連鎖バンドルなしで送られた証明書にエラーを出すかもしれません。サーバに完全な連鎖証明書を送信させるには <literal>openssl</literal> コマンドラインユーティリティを使うといいでしょう。例えば:108109<programlisting>110$ openssl s_client -connect www.godaddy.com:443111...112Certificate chain1130 s:/C=US/ST=Arizona/L=Scottsdale/1.3.6.1.4.1.311.60.2.1.3=US114/1.3.6.1.4.1.311.60.2.1.2=AZ/O=GoDaddy.com, Inc115/OU=MIS Department/<b>CN=www.GoDaddy.com</b>116/serialNumber=0796928-7/2.5.4.15=V1.0, Clause 5.(b)117i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.118/OU=http://certificates.godaddy.com/repository119/CN=Go Daddy Secure Certification Authority120/serialNumber=079692871211 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.122/OU=http://certificates.godaddy.com/repository123/CN=Go Daddy Secure Certification Authority124/serialNumber=07969287125i:/C=US/O=The Go Daddy Group, Inc.126/OU=Go Daddy Class 2 Certification Authority1272 s:/C=US/O=The Go Daddy Group, Inc.128/OU=Go Daddy Class 2 Certification Authority129i:/L=ValiCert Validation Network/O=<b>ValiCert, Inc.</b>130/OU=ValiCert Class 2 Policy Validation Authority131/CN=http://www.valicert.com//[email protected]132...133</programlisting>134135この例では、<literal>www.GoDaddy.com</literal> サーバ証明書 #0 の対象 (“<i>s</i>”) はそれ自身が証明書 #1 の対象である発行者 (“<i>i</i>”) によって署名されています。そして、証明書 #1はそれ自身が証明書 #2 の対象である発行者によって署名され、証明書 #2 は有名な発行者である <i>ValiCert, Inc.</i> によって署名されていて、<i>ValiCert, Inc.</i> の証明書はブラウザに組み込まれている証明書ベースに保持されています(こうして連鎖します)。136</para>137138<para>139もし証明書バンドルを追加していなければ、サーバ証明書 #0 しか見れません。140</para>141142</section>143144145<section id="single_http_https_server" name="単一の HTTP/HTTPS サーバ">146147<para>148最初の段階から HTTP と HTTPS プロトコル用にサーバを分けて設定するのは優れた実践です。現時点では両者の機能性としては等しいかもしれませんが、将来的に大きな変更があるかもしれず、統合されたサーバの使用が問題になるかもしれません。とはいえ、HTTP と HTTPS のサーバが等しく、将来のことを考えたくないのなら、ディレクティブ <literal>ssl on</literal> を削除して *:443 ポートに <literal>ssl</literal> パラメータを追加することによって HTTP と HTTPS リクエストの両者を扱う単一のサーバを設定することができます:149150<programlisting>151server {152listen 80;153listen 443 ssl;154server_name www.example.com;155ssl_certificate www.example.com.crt;156ssl_certificate_key www.example.com.key;157...158}159</programlisting>160161<note>1620.8.21 以前では、nginx は <literal>default</literal> パラメータで待ち受けているソケットに <literal>ssl</literal> パラメータをセットすることしかできませんでした:163<programlisting>164listen 443 default ssl;165</programlisting>166</note>167</para>168169</section>170171172<section id="name_based_https_servers" name="名前ベースの HTTPS サーバ">173174<para>175単一の IP アドレスを2つ以上の HTTPS サーバで待ち受けるように設定するとよく発生する問題があります:176177<programlisting>178server {179listen 443;180server_name www.example.com;181ssl on;182ssl_certificate www.example.com.crt;183...184}185186server {187listen 443;188server_name www.example.org;189ssl on;190ssl_certificate www.example.org.crt;191...192}193</programlisting>194195この設定では、ブラウザはリクエストされたサーバ名に関わらずデフォルトサーバ、すなわちここでは <literal>www.example.com</literal> の証明書を受信します。これは SSL プロトコルの作用によるものです。この SSL 接続はブラウザが HTTP リクエストを送る前に確立されるので、nginx にはリクエストされたサーバ名は分かりません。したがって、デフォルトサーバの証明書を送ることしかできません。196</para>197198<para>199この問題を解決するもっとも古くてもっとも堅実な方法は、各 HTTPS サーバに別個の IP アドレスを割り当てることです:200201<programlisting>202server {203listen 192.168.1.1:443;204server_name www.example.com;205ssl on;206ssl_certificate www.example.com.crt;207...208}209210server {211listen 192.168.1.2:443;212server_name www.example.org;213ssl on;214ssl_certificate www.example.org.crt;215...216}217</programlisting>218</para>219220</section>221222223<section id="certificate_with_several_names"224name="複数サーバ名をもつ SSL 証明書">225226<para>227単一の IP アドレスを複数の HTTPS サーバ間で共有する方法は他にもありますが、どれも欠点があります。ひとつは、SubjectAltName フィールドに複数サーバ名(例えば、<literal>www.example.com</literal> と <literal>www.example.org</literal>)をもつ単一の証明書を使用する方法です。しかし、SubjectAltName の長さには制限があります。228</para>229230<para>231もうひとつの方法は、例えば <literal>*.example.org</literal> のようにワイルドカード名を持った証明書を使用する方法です。この証明書は <literal>www.example.org</literal> にマッチしますが <literal>example.org</literal> や <literal>www.sub.example.org</literal> にはマッチしません。以上の二つの方法は組み合わせることもできます。証明書には、例えば <literal>example.org</literal> と <literal>*.example.org</literal> のように SubjectAltName フィールドに完全一致名とワイルドカード名を含ませることができます。232</para>233234<para>235すべてのサーバでひとつのメモリーコピーを継承するためには、複数サーバ名を持つ証明書ファイルとその秘密鍵ファイルを設定の <i>http</i> レベルに置くとよいでしょう:236237<programlisting>238ssl_certificate common.crt;239ssl_certificate_key common.key;240241server {242listen 443;243server_name www.example.com;244ssl on;245...246}247248server {249listen 443;250server_name www.example.org;251ssl on;252...253}254</programlisting>255</para>256257</section>258259260<section id="sni" name="サーバ名指示(Server Name Indication – SNI)">261262<para>263単一の IP アドレス上で複数の HTTPS サーバを動かすときのさらに包括的な解決方法として <link url="http://en.wikipedia.org/wiki/Server_Name_Indication">TLSv1.1 Server Name Indication extension(サーバ名指示拡張)</link> (SNI, RFC3546) があります。これは、ブラウザが SSL ハンドシェイクの間にリクエストされたサーバ名を渡せるようにするもので、それによりサーバはその接続でどの証明書を使用するべきかが分かります。しかし、SNI は限られたブラウザしかサポートしていません。現時点では次のブラウザのバージョン以降のものがサポートされています:264</para>265266<list type="bullet">267268<listitem>269Opera 8.0270</listitem>271272<listitem>273MSIE 7.0 (Windows Vista 以降のみ)274</listitem>275276<listitem>277Firefox 2.0 および Mozilla Platform rv:1.8.1 を使用している他のブラウザ278</listitem>279280<listitem>281Safari 3.2.1 (Windows バージョンでは Vista 以降)282</listitem>283284<listitem>285Chrome (Windows バージョンでは Vista 以降)286</listitem>287288</list>289290<para>291nginx で SNI を使用するためには、nginx バイナリがビルドされたときの OpenSSL ライブラリとランタイムで動的にリンクされるライブラリの両方でサポートされていることが必要です。OpenSSL は設定オプション <nobr>“--enable-tlsext”.</nobr> でビルドされていれば、バージョン 0.9.8f 以降で SNI をサポートしています。OpenSSL 0.9.8j 以降ではこのオプションはデフォルトで有効になっています。nginx が SNI サポート付きでビルドされていれば、“-V” スイッチとともに起動すると nginx が次のように表示します:292293<programlisting>294$ nginx -V295...296TLS SNI support enabled297...298</programlisting>299300しかし、SNI が有効になっている nginx が SNI サポート無しの OpenSSL ライブラリに動的にリンクされている場合、nginx は次の警告を表示します:301302<programlisting>303nginx was built with SNI support, however, now it is linked304dynamically to an OpenSSL library which has no tlsext support,305therefore SNI is not available306</programlisting>307</para>308309</section>310311312<section id="compatibility" name="Compatibility">313314<para>315<list type="bullet">316317<listitem>318“-V” スイッチでの SNI サポートステータス表示は 0.8.21 以降と 0.7.62 でサポートされています。319</listitem>320321<listitem>322<literal>listen</literal> ディレクティブの <literal>ssl</literal> パラメータは 0.7.14 以降からサポートされています。323</listitem>324325<listitem>326SNI は 0.5.32 以降からサポートされています。327</listitem>328329<listitem>330共有 SSL セッションキャッシュは 0.5.6 以降からサポートされています。331</listitem>332333</list>334</para>335336<para>337<list type="bullet">338339<listitem>340バージョン 0.7.65 と 0.8.19 以降のデフォルトの SSL プロトコルは SSLv3 と TLSv1 です。341</listitem>342343<listitem>344バージョン 0.7.64 と 0.8.18 以前のデフォルトの SSL プロトコルは SSLv2、SSLv3、TLSv1 です。345</listitem>346347</list>348</para>349350<para>351<list type="bullet">352353<listitem>354バージョン 0.7.65 と 0.8.20 以降のデフォルトの SSL 暗号は <literal>HIGH:!ADH:!MD5</literal> です。355</listitem>356357<listitem>358バージョン 0.8.19 のデフォルトの SSL 暗号は <literal>ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM</literal> です。359</listitem>360361<listitem>362バージョン 0.7.64 と 0.8.18 以前のデフォルトの SSL 暗号は <literal>ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP</literal> です。363</listitem>364365</list>366</para>367368369</section>370371372</article>373374375