Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nginx
GitHub Repository: nginx/nginx.org
Path: blob/main/xml/ja/docs/http/configuring_https_servers.xml
1 views
1
<!DOCTYPE article SYSTEM "../../../../dtd/article.dtd">
2
3
<article name="HTTPS サーバの設定"
4
link="/ja/docs/http/configuring_https_servers.html"
5
lang="ja"
6
author="Igor Sysoev"
7
translator="DigitalCube Co. Ltd., wokamoto">
8
9
<section>
10
11
<para>
12
HTTPS サーバを設定するには server ブロックで SSL プロトコルを有効にして、サーバ証明書ファイルと秘密鍵ファイルの場所を指定する必要があります:
13
14
<programlisting>
15
server {
16
listen 443;
17
server_name www.example.com;
18
ssl on;
19
ssl_certificate www.example.com.crt;
20
ssl_certificate_key www.example.com.key;
21
ssl_protocols SSLv3 TLSv1;
22
ssl_ciphers HIGH:!ADH:!MD5;
23
...
24
}
25
</programlisting>
26
27
サーバ証明書とはドメインの所有者情報や、送信情報の暗号化に必要な公開鍵を含む電子証明書です。そのサーバに接続するすべてのクライアントに送られます。秘密鍵はサーバ証明書に含まれる公開鍵で暗号化された情報を復号するために必要な鍵で、秘匿する必要が有ります。アクセスを制限したファイルに保存するようにしてください。ただし、nginx のマスタープロセスからは読めるようにする必要があります。もうひとつの方法として、秘密鍵は証明書と同じファイルに保存することもできます:
28
29
<programlisting>
30
ssl_certificate www.example.com.cert;
31
ssl_certificate_key www.example.com.cert;
32
</programlisting>
33
34
この場合もファイルのアクセス権は制限するようにします。証明書と秘密鍵がひとつのファイルに保存されていても、証明書だけがクライアントに送られます。
35
</para>
36
37
<para>
38
SSL プロトコルの強力なバージョンと暗号に接続を制限するには、ディレクティブ <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 のバージョンでのみ設定してください。
39
</para>
40
41
</section>
42
43
44
<section id="optimization" name="HTTPS サーバの最適化">
45
46
<para>
47
SSL の工程は CPU リソースを余計に消費します。マルチプロセッサシステムでは(利用できる CPU コアの数よりも大きい数の)複数のワーカープロセスを走らせるといいでしょう。最も CPU に負荷がかかる工程は SSL ハンドシェイクです。クライアント毎のこの工程数を最小化するには2つの方法があります。最初の方法はキープアライブ接続を有効にして、ひとつの接続経由で複数のリクエストを送るようにする方法です。二つ目の方法は SSL セッションパラメータを再利用して、並行かつ順次接続のための SSL ハンドシェイクを避ける方法です。セッションはワーカー間で共有される SSL セッションキャッシュに保持され、<literal>ssl_session_cache</literal> ディレクティブで設定されています。1メガバイトのキャッシュには約4000のセッションが含まれます。キャッシュのデフォルトタイムアウトは5分です。この値は <literal>ssl_session_timeout</literal> ディレクティブを使用して増やすことができます。次の例は10Mの共有セッションキャッシュをもったクアッドコアシステムに最適化された設定例です:
48
49
50
<programlisting>
51
<b>worker_processes 4</b>;
52
53
http {
54
<b>ssl_session_cache shared:SSL:10m</b>;
55
<b>ssl_session_timeout 10m</b>;
56
57
server {
58
listen 443;
59
server_name www.example.com;
60
<b>keepalive_timeout 70</b>;
61
62
ssl on;
63
ssl_certificate www.example.com.crt;
64
ssl_certificate_key www.example.com.key;
65
ssl_protocols SSLv3 TLSv1;
66
ssl_ciphers HIGH:!ADH:!MD5;
67
...
68
</programlisting>
69
</para>
70
71
</section>
72
73
74
<section id="chains" name="SSL 連鎖証明書">
75
76
<para>
77
ブラウザによっては有名な認証局によって署名された証明書にエラーをだすことがあります。その一方でその証明書を他のブラウザでは問題なく受け入れることもあります。これは発行している認証局が、有名で信用されている認証局の認証基盤には含まれない特定のブラウザで配布されている中間証明書を使ったサーバ証明書に署名しているからです。このケースでは、認証局は署名されたサーバ証明書に連結されているはずの連鎖証明書のバンドルを提供しています。サーバ証明書は、かならず結合されたファイル内の連鎖証明書に存在している必要があります:
78
79
<programlisting>
80
$ cat www.example.com.crt bundle.crt > www.example.com.chained.crt
81
</programlisting>
82
83
この結合されたファイルを <literal>ssl_certificate</literal> ディレクティブで使われるようにします:
84
85
<programlisting>
86
server {
87
listen 443;
88
server_name www.example.com;
89
ssl on;
90
ssl_certificate www.example.com.chained.crt;
91
ssl_certificate_key www.example.com.key;
92
...
93
}
94
</programlisting>
95
96
サーバ証明書とバンドルされたものが間違った順序で連結されていた場合、nginx は起動に失敗して次のエラーメッセージを表示します:
97
98
<programlisting>
99
SSL_CTX_use_PrivateKey_file(" ... /www.example.com.key") failed
100
(SSL: error:0B080074:x509 certificate routines:
101
X509_check_private_key:key values mismatch)
102
</programlisting>
103
104
これは、nginx がサーバ証明書ではなくバンドルされた最初の証明書で秘密鍵を使おうとするからです。
105
</para>
106
107
<para>
108
ブラウザは通常、信頼されている認証局によって署名されている受信した中間証明書を保存します。したがって、よく使われているブラウザは要求された中間証明書をすでに保持しているかもしれませんし、連鎖バンドルなしで送られた証明書にエラーを出すかもしれません。サーバに完全な連鎖証明書を送信させるには <literal>openssl</literal> コマンドラインユーティリティを使うといいでしょう。例えば:
109
110
<programlisting>
111
$ openssl s_client -connect www.godaddy.com:443
112
...
113
Certificate chain
114
0 s:/C=US/ST=Arizona/L=Scottsdale/1.3.6.1.4.1.311.60.2.1.3=US
115
/1.3.6.1.4.1.311.60.2.1.2=AZ/O=GoDaddy.com, Inc
116
/OU=MIS Department/<b>CN=www.GoDaddy.com</b>
117
/serialNumber=0796928-7/2.5.4.15=V1.0, Clause 5.(b)
118
i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.
119
/OU=http://certificates.godaddy.com/repository
120
/CN=Go Daddy Secure Certification Authority
121
/serialNumber=07969287
122
1 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc.
123
/OU=http://certificates.godaddy.com/repository
124
/CN=Go Daddy Secure Certification Authority
125
/serialNumber=07969287
126
i:/C=US/O=The Go Daddy Group, Inc.
127
/OU=Go Daddy Class 2 Certification Authority
128
2 s:/C=US/O=The Go Daddy Group, Inc.
129
/OU=Go Daddy Class 2 Certification Authority
130
i:/L=ValiCert Validation Network/O=<b>ValiCert, Inc.</b>
131
/OU=ValiCert Class 2 Policy Validation Authority
132
/CN=http://www.valicert.com//[email protected]
133
...
134
</programlisting>
135
136
この例では、<literal>www.GoDaddy.com</literal> サーバ証明書 #0 の対象 (&ldquo;<i>s</i>&rdquo;) はそれ自身が証明書 #1 の対象である発行者 (&ldquo;<i>i</i>&rdquo;) によって署名されています。そして、証明書 #1はそれ自身が証明書 #2 の対象である発行者によって署名され、証明書 #2 は有名な発行者である <i>ValiCert, Inc.</i> によって署名されていて、<i>ValiCert, Inc.</i> の証明書はブラウザに組み込まれている証明書ベースに保持されています(こうして連鎖します)。
137
</para>
138
139
<para>
140
もし証明書バンドルを追加していなければ、サーバ証明書 #0 しか見れません。
141
</para>
142
143
</section>
144
145
146
<section id="single_http_https_server" name="単一の HTTP/HTTPS サーバ">
147
148
<para>
149
最初の段階から HTTP と HTTPS プロトコル用にサーバを分けて設定するのは優れた実践です。現時点では両者の機能性としては等しいかもしれませんが、将来的に大きな変更があるかもしれず、統合されたサーバの使用が問題になるかもしれません。とはいえ、HTTP と HTTPS のサーバが等しく、将来のことを考えたくないのなら、ディレクティブ <literal>ssl on</literal> を削除して *:443 ポートに <literal>ssl</literal> パラメータを追加することによって HTTP と HTTPS リクエストの両者を扱う単一のサーバを設定することができます:
150
151
<programlisting>
152
server {
153
listen 80;
154
listen 443 ssl;
155
server_name www.example.com;
156
ssl_certificate www.example.com.crt;
157
ssl_certificate_key www.example.com.key;
158
...
159
}
160
</programlisting>
161
162
<note>
163
0.8.21 以前では、nginx は <literal>default</literal> パラメータで待ち受けているソケットに <literal>ssl</literal> パラメータをセットすることしかできませんでした:
164
<programlisting>
165
listen 443 default ssl;
166
</programlisting>
167
</note>
168
</para>
169
170
</section>
171
172
173
<section id="name_based_https_servers" name="名前ベースの HTTPS サーバ">
174
175
<para>
176
単一の IP アドレスを2つ以上の HTTPS サーバで待ち受けるように設定するとよく発生する問題があります:
177
178
<programlisting>
179
server {
180
listen 443;
181
server_name www.example.com;
182
ssl on;
183
ssl_certificate www.example.com.crt;
184
...
185
}
186
187
server {
188
listen 443;
189
server_name www.example.org;
190
ssl on;
191
ssl_certificate www.example.org.crt;
192
...
193
}
194
</programlisting>
195
196
この設定では、ブラウザはリクエストされたサーバ名に関わらずデフォルトサーバ、すなわちここでは <literal>www.example.com</literal> の証明書を受信します。これは SSL プロトコルの作用によるものです。この SSL 接続はブラウザが HTTP リクエストを送る前に確立されるので、nginx にはリクエストされたサーバ名は分かりません。したがって、デフォルトサーバの証明書を送ることしかできません。
197
</para>
198
199
<para>
200
この問題を解決するもっとも古くてもっとも堅実な方法は、各 HTTPS サーバに別個の IP アドレスを割り当てることです:
201
202
<programlisting>
203
server {
204
listen 192.168.1.1:443;
205
server_name www.example.com;
206
ssl on;
207
ssl_certificate www.example.com.crt;
208
...
209
}
210
211
server {
212
listen 192.168.1.2:443;
213
server_name www.example.org;
214
ssl on;
215
ssl_certificate www.example.org.crt;
216
...
217
}
218
</programlisting>
219
</para>
220
221
</section>
222
223
224
<section id="certificate_with_several_names"
225
name="複数サーバ名をもつ SSL 証明書">
226
227
<para>
228
単一の IP アドレスを複数の HTTPS サーバ間で共有する方法は他にもありますが、どれも欠点があります。ひとつは、SubjectAltName フィールドに複数サーバ名(例えば、<literal>www.example.com</literal> <literal>www.example.org</literal>)をもつ単一の証明書を使用する方法です。しかし、SubjectAltName の長さには制限があります。
229
</para>
230
231
<para>
232
もうひとつの方法は、例えば <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 フィールドに完全一致名とワイルドカード名を含ませることができます。
233
</para>
234
235
<para>
236
すべてのサーバでひとつのメモリーコピーを継承するためには、複数サーバ名を持つ証明書ファイルとその秘密鍵ファイルを設定の <i>http</i> レベルに置くとよいでしょう:
237
238
<programlisting>
239
ssl_certificate common.crt;
240
ssl_certificate_key common.key;
241
242
server {
243
listen 443;
244
server_name www.example.com;
245
ssl on;
246
...
247
}
248
249
server {
250
listen 443;
251
server_name www.example.org;
252
ssl on;
253
...
254
}
255
</programlisting>
256
</para>
257
258
</section>
259
260
261
<section id="sni" name="サーバ名指示(Server Name Indication – SNI)">
262
263
<para>
264
単一の IP アドレス上で複数の HTTPS サーバを動かすときのさらに包括的な解決方法として <link url="http://en.wikipedia.org/wiki/Server_Name_Indication">TLSv1.1 Server Name Indication extension(サーバ名指示拡張)</link> (SNI, RFC3546) があります。これは、ブラウザが SSL ハンドシェイクの間にリクエストされたサーバ名を渡せるようにするもので、それによりサーバはその接続でどの証明書を使用するべきかが分かります。しかし、SNI は限られたブラウザしかサポートしていません。現時点では次のブラウザのバージョン以降のものがサポートされています:
265
</para>
266
267
<list type="bullet">
268
269
<listitem>
270
Opera 8.0
271
</listitem>
272
273
<listitem>
274
MSIE 7.0 (Windows Vista 以降のみ)
275
</listitem>
276
277
<listitem>
278
Firefox 2.0 および Mozilla Platform rv:1.8.1 を使用している他のブラウザ
279
</listitem>
280
281
<listitem>
282
Safari 3.2.1 (Windows バージョンでは Vista 以降)
283
</listitem>
284
285
<listitem>
286
Chrome (Windows バージョンでは Vista 以降)
287
</listitem>
288
289
</list>
290
291
<para>
292
nginx で SNI を使用するためには、nginx バイナリがビルドされたときの OpenSSL ライブラリとランタイムで動的にリンクされるライブラリの両方でサポートされていることが必要です。OpenSSL は設定オプション <nobr>&ldquo;--enable-tlsext&rdquo;.</nobr> でビルドされていれば、バージョン 0.9.8f 以降で SNI をサポートしています。OpenSSL 0.9.8j 以降ではこのオプションはデフォルトで有効になっています。nginx が SNI サポート付きでビルドされていれば、&ldquo;-V&rdquo; スイッチとともに起動すると nginx が次のように表示します:
293
294
<programlisting>
295
$ nginx -V
296
...
297
TLS SNI support enabled
298
...
299
</programlisting>
300
301
しかし、SNI が有効になっている nginx が SNI サポート無しの OpenSSL ライブラリに動的にリンクされている場合、nginx は次の警告を表示します:
302
303
<programlisting>
304
nginx was built with SNI support, however, now it is linked
305
dynamically to an OpenSSL library which has no tlsext support,
306
therefore SNI is not available
307
</programlisting>
308
</para>
309
310
</section>
311
312
313
<section id="compatibility" name="Compatibility">
314
315
<para>
316
<list type="bullet">
317
318
<listitem>
319
&ldquo;-V&rdquo; スイッチでの SNI サポートステータス表示は 0.8.21 以降と 0.7.62 でサポートされています。
320
</listitem>
321
322
<listitem>
323
<literal>listen</literal> ディレクティブの <literal>ssl</literal> パラメータは 0.7.14 以降からサポートされています。
324
</listitem>
325
326
<listitem>
327
SNI は 0.5.32 以降からサポートされています。
328
</listitem>
329
330
<listitem>
331
共有 SSL セッションキャッシュは 0.5.6 以降からサポートされています。
332
</listitem>
333
334
</list>
335
</para>
336
337
<para>
338
<list type="bullet">
339
340
<listitem>
341
バージョン 0.7.65 と 0.8.19 以降のデフォルトの SSL プロトコルは SSLv3 と TLSv1 です。
342
</listitem>
343
344
<listitem>
345
バージョン 0.7.64 と 0.8.18 以前のデフォルトの SSL プロトコルは SSLv2、SSLv3、TLSv1 です。
346
</listitem>
347
348
</list>
349
</para>
350
351
<para>
352
<list type="bullet">
353
354
<listitem>
355
バージョン 0.7.65 と 0.8.20 以降のデフォルトの SSL 暗号は <literal>HIGH:!ADH:!MD5</literal> です。
356
</listitem>
357
358
<listitem>
359
バージョン 0.8.19 のデフォルトの SSL 暗号は <literal>ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM</literal> です。
360
</listitem>
361
362
<listitem>
363
バージョン 0.7.64 と 0.8.18 以前のデフォルトの SSL 暗号は <literal>ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP</literal> です。
364
</listitem>
365
366
</list>
367
</para>
368
369
370
</section>
371
372
373
</article>
374
375