http://nginx.org/cn/docs/http/cconfiguring_https_servers.html
HTTPSサーバーの構成
翻訳されたコンテンツは古い可能性があります。 最新のアップデートは英語版でご覧いただけます。 +HTTPS ホストを設定するには、サーバー設定ブロックで SSL プロトコルを開き、サーバー側の証明書とキー ファイルの場所を指定する必要があります:
server { listen 443; server_name www.example.com; ssl on; ssl_certificate www.example.com.crt; ssl_certificate_key www.example.com.key; ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; ... }ログイン後にコピーサーバー証明書は公開されており、接続されているすべてのクライアントに送信されますサーバー側に。秘密キーは公開されていないため、アクセスが制限されたファイルに保存する必要があります。もちろん、nginx のメイン プロセスにはキーを読み取る権限が必要です。秘密鍵と証明書は同じファイルに保存できます:
ssl_certificate www.example.com.cert; ssl_certificate_key www.example.com.cert;ログイン後にコピーこの場合、証明書ファイルにもアクセス制限を設定する必要があります。もちろん、証明書とキーは同じファイルに保存されますが、クライアントに送信されるのは証明書のみであり、キーは送信されません。
ssl_protocols ディレクティブと ssl_ciphers ディレクティブを使用すると、ユーザー接続に SSL/TLS の強力なプロトコル バージョンと強力な暗号化アルゴリズムのみを導入するように強制できます。バージョン 1.0.5 以降、nginx はデフォルトで「
ssl_protocols」を使用します SSLv3 TLSv1
" と "ssl_ciphers HIGH:!aNULL:!MD5
”,所以只有在之前的版本,明确地配置它们才是有意义的。从1.1.13和1.0.12版本开始,nginx默认使用“ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2
”。CBC模式的加密算法容易受到一些攻击,尤其是BEAST攻击(参见CVE-2011-3389)。可以通过下面配置调整为优先使用RC4-SHA加密算法:
ssl_ciphers RC4:HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on;ログイン後にコピーHTTPS服务器优化
SSL操作需要消耗CPU资源,所以在多处理器的系统,需要启动多个工作进程,而且数量需要不少于可用CPU的个数。最消耗CPU资源的SSL操作是SSL握手,有两种方法可以将每个客户端的握手操作数量降到最低:第一种是保持客户端长连接,在一个SSL连接发送多个请求,第二种是在并发的连接或者后续的连接中重用SSL会话参数,这样可以避免SSL握手的操作。会话缓存用于保存SSL会话,这些缓存在工作进程间共享,可以使用ssl_session_cache指令进行配置。1M缓存可以存放大约4000个会话。默认的缓存超时是5分钟,可以使用ssl_session_timeout加大它。下面是一个针对4核系统的配置优化的例子,使用10M的共享会话缓存:
worker_processes 4; http { ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; server { listen 443; server_name www.example.com; keepalive_timeout 70; ssl on; ssl_certificate www.example.com.crt; ssl_certificate_key www.example.com.key; ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5; ...ログイン後にコピーSSL证书链
有些浏览器不接受那些众所周知的证书认证机构签署的证书,而另外一些浏览器却接受它们。这是由于证书签发使用了一些中间认证机构,这些中间机构被众所周知的证书认证机构授权代为签发证书,但是它们自己却不被广泛认知,所以有些客户端不予识别。针对这种情况,证书认证机构提供一个证书链的包裹,用来声明众所周知的认证机构和自己的关系,需要将这个证书链包裹与服务器证书合并成一个文件。在这个文件里,服务器证书需要出现在认证方证书链的前面:
$ cat www.example.com.crt bundle.crt > www.example.com.chained.crtログイン後にコピー这个文件需要使用ssl_certificate指令来引用:
server { listen 443; server_name www.example.com; ssl on; ssl_certificate www.example.com.chained.crt; ssl_certificate_key www.example.com.key; ... }ログイン後にコピー如果服务器证书和认证方证书链合并时顺序弄错了,nginx就不能正常启动,而且会显示下面的错误信息:
SSL_CTX_use_PrivateKey_file(" ... /www.example.com.key") failed (SSL: error:0B080074:x509 certificate routines: X509_check_private_key:key values mismatch)ログイン後にコピー因为nginx首先需要用私钥去解密服务器证书,而遇到的却是认证方的证书。
浏览器通常会将那些被受信的认证机构认证的中间认证机构保存下来,那么这些浏览器以后在遇到使用这些中间认证机构但不包含证书链的情况时,因为已经保存了这些中间认证机构的信息,所以不会报错。可以使用
openssl
命令行工具来确认服务器发送了完整的证书链:$ openssl s_client -connect www.godaddy.com:443 ... Certificate chain 0 s:/C=US/ST=Arizona/L=Scottsdale/1.3.6.1.4.1.311.60.2.1.3=US /1.3.6.1.4.1.311.60.2.1.2=AZ/O=GoDaddy.com, Inc /OU=MIS Department/CN=www.GoDaddy.com /serialNumber=0796928-7/2.5.4.15=V1.0, Clause 5.(b) i:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc. /OU=http://certificates.godaddy.com/repository /CN=Go Daddy Secure Certification Authority /serialNumber=07969287 1 s:/C=US/ST=Arizona/L=Scottsdale/O=GoDaddy.com, Inc. /OU=http://certificates.godaddy.com/repository /CN=Go Daddy Secure Certification Authority /serialNumber=07969287 i:/C=US/O=The Go Daddy Group, Inc. /OU=Go Daddy Class 2 Certification Authority 2 s:/C=US/O=The Go Daddy Group, Inc. /OU=Go Daddy Class 2 Certification Authority i:/L=ValiCert Validation Network/O=ValiCert, Inc. /OU=ValiCert Class 2 Policy Validation Authority /CN=http://www.valicert.com//emailAddress=info@valicert.com ...ログイン後にコピー在这个例子中,www.GoDaddy.com的服务器证书(#0)的受签者(“s”)是被签发机构(“i”)签名的,而这个签发机构又是证书(#1)的受签者,接着证书(#1)的签发机构又是证书(#2)的受签者,最后证书(#2)是被众所周知的签发机构ValiCert, Inc签发。ValiCert, Inc的证书内嵌在浏览器中,被浏览器自动识别(这段话神似英国诗《在Jack盖的房子里》里面的内容)。
如果没有加入认证方证书链,就只会显示服务器证书(#0)。
合并HTTP/HTTPS主机
如果HTTP和HTTPS虚拟主机的功能是一致的,可以配置一个虚拟主机,既处理HTTP请求,又处理HTTPS请求。 配置的方法是删除
ssl on
的指令,并在*:443端口添加参数ssl
:server { listen 80; listen 443 ssl; server_name www.example.com; ssl_certificate www.example.com.crt; ssl_certificate_key www.example.com.key; ... }ログイン後にコピー在0.8.21版本以前,只有添加了"。default
参数的监听端口才能添加ssl
ssl_ciphers HIGH:!aNULL:!MD5" であるため、以前のバージョンでのみ、これらを明示的に設定することが合理的です。バージョン 1.1.13 および 1.0.12 以降、nginx は "ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2CBC モードの暗号化アルゴリズムは、一部の攻撃、特に BEAST 攻撃 (CVE-2011-3389 を参照) に対して脆弱です。以下を通じて RC4-SHA 暗号化を優先的に使用するように調整できます。構CPU。CPU リソースの SSL 操作は SSL ハンドシェイクです。各クライアントのハンドシェイク操作の数を最小限に抑えるには、2 つの方法があります。1 つ目は、クライアントを長時間接続し、1 つの SSL 接続で複数のリクエストを送信することです。同時接続または後続の接続で SSL セッション パラメータを再利用し、SSL ハンドシェイク操作を回避します。これらのキャッシュはワーカー プロセス間で共有され、1M キャッシュには約 4000 個のキャッシュを保存できます。デフォルトのキャッシュ タイムアウトは 5 分ですが、ssl_session_timeout を使用してそれを増やすことができます。10M の共有セッション キャッシュを使用した構成の最適化の例を次に示します。ブラウザーは既知の認証局によって署名された証明書を受け入れませんが、他のブラウザーは受け入れます。これは、証明書の発行では、既知の認証局に代わって証明書を発行することを許可されているいくつかの中間認証局が使用されるためです。 、それら自体は広く認識されていないため、一部のクライアントはそれらを認識しません。この場合、証明書証明機関は、既知の証明機関とそれ自体との関係を宣言する証明書チェーン パッケージを提供する必要があります。パッケージはサーバー証明書と結合されて 1 つのファイルになります:
このファイルは、ssl_certificate ディレクティブを使用して参照される必要があります。listen 443 default ssl;ログイン後にコピー🎜🎜サーバー証明書と証明書のマージ時にパーティ証明書チェーンの順序が間違っている場合、nginx は正常に起動できず、次のエラー メッセージが表示されます。サーバー証明書を復号化しますが、遭遇するのは認証者の証明書です。🎜🎜ブラウザは通常、信頼できる認証局によって認証された中間認証局を保存しますが、これらの中間認証局を使用する状況に遭遇すると、その証明書は含まれません。チェーンでは、中間認証局の情報がすでに保存されているため、エラーは報告されません。 🎜openssl🎜 コマンド ライン ツールを使用して、サーバーが完全な証明書チェーンを送信したことを確認できます: 🎜🎜server { listen 443; server_name www.example.com; ssl on; ssl_certificate www.example.com.crt; ... } server { listen 443; server_name www.example.org; ssl on; ssl_certificate www.example.org.crt; ... }ログイン後にコピーログイン後にコピー🎜🎜 この例では、www.GoDaddy のサーバー証明書 (#0) の署名者 (「s」) です。 com は、証明書の署名者 (#1) である発行局 (「i」) によって署名され、次に証明書の発行局 (#1) が証明書の署名者 (#2) となり、最後に証明書 (#2) は、有名な発行機関である ValiCert, Inc によって発行されます。 ValiCert, Inc の証明書はブラウザに埋め込まれており、ブラウザによって自動的に認識されます (この一節はイギリスの詩「In the House That Jack Built」の内容に似ています)。 🎜🎜オーセンティケータ証明書チェーンが追加されていない場合は、サーバー証明書(#0)のみが表示されます。 🎜🎜🎜HTTP/HTTPS ホストのマージ🎜🎜🎜 HTTP 仮想ホストと HTTPS 仮想ホストの機能に一貫性がある場合は、HTTP リクエストと HTTPS リクエストの両方を処理するように仮想ホストを構成できます。 設定方法は、🎜ssl on🎜 コマンドを削除し、パラメータ 🎜ssl🎜 を *:443 ポートに追加することです: 🎜🎜server { listen 192.168.1.1:443; server_name www.example.com; ssl on; ssl_certificate www.example.com.crt; ... } server { listen 192.168.1.2:443; server_name www.example.org; ssl on; ssl_certificate www.example.org.crt; ... }ログイン後にコピーログイン後にコピー🎜🎜 バージョン 0.8.21 より前では、🎜default🎜 パラメータが追加されたリスニング ポートのみが追加できます🎜ssl 🎜パラメータ: 🎜ssl_certificate common.crt; ssl_certificate_key common.key; server { listen 443; server_name www.example.com; ssl on; ... } server { listen 443; server_name www.example.org; ssl on; ... }ログイン後にコピーログイン後にコピー🎜🎜🎜🎜 名前ベースの HTTPS ホスト 🎜🎜🎜 同じ IP 上で複数の HTTPS ホストを構成すると、非常に一般的な問題が発生します: 🎜$ nginx -V ... TLS SNI support enabled ...ログイン後にコピーログイン後にコピーserver { listen 443; server_name www.example.com; ssl on; ssl_certificate www.example.com.crt; ... } server { listen 443; server_name www.example.org; ssl on; ssl_certificate www.example.org.crt; ... }ログイン後にコピーログイン後にコピー使用上面的配置,不论浏览器请求哪个主机,都只会收到默认主机
www.example.com
的证书。这是由SSL协议本身的行为引起的——先建立SSL连接,再发送HTTP请求,所以nginx建立SSL连接时不知道所请求主机的名字,因此,它只会返回默认主机的证书。最古老的也是最稳定的解决方法就是每个HTTPS主机使用不同的IP地址:
server { listen 192.168.1.1:443; server_name www.example.com; ssl on; ssl_certificate www.example.com.crt; ... } server { listen 192.168.1.2:443; server_name www.example.org; ssl on; ssl_certificate www.example.org.crt; ... }ログイン後にコピーログイン後にコピー带有多个主机名的SSL证书
也有其他一些方法可以实现多个HTTPS主机共享一个IP地址,但都有不足。其中一种方法是使用在“SubjectAltName”字段中存放多个名字的证书,比如
www.example.com
和www.example.org
。但是,“SubjectAltName”字段的长度有限制。另一种方式是使用主机名中含有通配符的证书,比如
*.example.org
。这个证书匹配www.example.org
,但是不匹配example.org
和www.sub.example.org
。这两种方法可以结合在一起——使用在“SubjectAltName”字段中存放的多个名字的证书,这些名字既可以是确切的名字,也可以是通配符,比如example.org
和*.example.org
。最好将带有多个名字的证书和它的密钥文件配置在http配置块中,这样可以只保存一份内容拷贝,所有主机的配置都从中继承:
ssl_certificate common.crt; ssl_certificate_key common.key; server { listen 443; server_name www.example.com; ssl on; ... } server { listen 443; server_name www.example.org; ssl on; ... }ログイン後にコピーログイン後にコピー主机名指示
在一个IP上运行多个HTTPS主机的更通用的方案是TLS主机名指示扩展(SNI,RFC6066),它允许浏览器和服务器进行SSL握手时,将请求的主机名传递给服务器,因此服务器可以知道使用哪一个证书来服务这个连接。但SNI只得到有限的浏览器的支持。下面列举支持SNI的浏览器最低版本和平台信息:
- Opera 8.0;
- MSIE 7.0(仅在Windows Vista操作系统及后续操作系统);
- Firefox 2.0和使用Mozilla平台1.8.1版本的其他浏览器;
- Safari 3.2.1(Windows版需要最低Vista操作系统);
- Chrome(Windows版需要最低Vista操作系统)。
通过SNI只能传递域名,但是,当请求中包含可读的IP地址时,某些浏览器将服务器的IP地址作为服务器的名字进行了传送。这是一个错误,大家不应该依赖于这个。为了在nginx中使用SNI,那么无论是在编译nginx时使用的OpenSSL类库,还是在运行nginx时使用的OpenSSL运行库,都必须支持SNI。从0.9.8f版本开始,OpenSSL通过
“--enable-tlsext” 配置选项加入SNI支持,从0.9.8j版本开始,此选项成为默认选项。当nginx被编译成支持SNI时,在使用“-V”选项运行时会显示如下信息:$ nginx -V ... TLS SNI support enabled ...ログイン後にコピーログイン後にコピー但是,当开启SNI支持的nginx被动态链接到不支持SNI的OpenSSL库上时,nginx会显示如下警告:
nginx was built with SNI support, however, now it is linked dynamically to an OpenSSL library which has no tlsext support, therefore SNI is not availableログイン後にコピー兼容性
- 从0.8.21和0.7.62版本开始,使用“-V”选项运行nginx时,将显示SNI支持状态信息。
- 从0.7.14版本开始,listen指令支持
ssl
参数。- 从0.5.32版本开始,支持SNI。
- 从0.5.6版本开始,支持SSL会话缓存,并可在工作进程间共享。
- 0.7.65、0.8.19及以后版本,默认SSL协议是SSLv3、TLSv1、TLSc1.1和TLSv1.2(如果OpenSSL库支持)。
- 0.7.64、0.8.18及以前版本,默认SSL协议是SSLv2、SSLv3和TLSv1。
- 1.0.5及以后版本,默认SSL密码算法是
HIGH:!aNULL:!MD5
。- 0.7.65、0.8.20及以后版本,默认SSL密码算法是
HIGH:!ADH:!MD5
。- 0.8.19版本,默认SSL密码算法是
ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM
。- 0.7.64、0.8.18及以前版本,默认SSL密码算法是
ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
。
作者: Igor Sysoev
编辑: Brian Mercer
翻译: cfsego
以上就介绍了nginx 配置HTTPS服务器,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。