オンライン セキュリティに対する人々の意識が高まり、大手インターネット企業が HTTPS の普及を推進するにつれ、現在では HTTPS SSL が Web サイト構築の基本的な標準となっています。 Let’s Encrypt、Digicert、TrustAsia、Symantec などが提供する無料の SSL 証明書のおかげで、個人 Web サイトであっても企業 Web サイトであっても、HTTPS の使用コストは無視できるほどになりました。
セキュリティのために HTTPS を使用する必要がありますが、SSL を有効にすると、メモリ、CPU、ネットワーク帯域幅のオーバーヘッドが増加します。 TCP スリーウェイ ハンドシェイクを使用して接続を確立する http と比較すると、クライアントとサーバーは TCP の 3 パケットに加えて、SSL ハンドシェイクに必要な 9 パケットの合計 12 パケットを交換する必要があります。パケット。したがって、HTTPS が大幅に最適化されると、パフォーマンスが低下する傾向があります。
もちろん、HTTPS や SSL によるサーバーのオーバーヘッドの増加は基本的に感じられないと考える人もいるかもしれません。これは、Web サイトのトラフィックが比較的少なく、サーバーのパフォーマンス構成が現在のトラフィックをサポートするのに十分であるためです。ただし、Baidu、Google、人気のあるアプリなどの大規模な Web サイトの場合、HTTPS パフォーマンスを最適化し、リソース消費を削減することは依然として非常に役立ちます。
この記事では、HTTPS と SSL の使用を最適化するためのいくつかの経験を共有します。SSL 証明書と HTTPS に関するさらに多くの経験に関するチュートリアルがあります。
- 無料の SSL 証明書の収集と概要 - Web サイトへの HTTPS で安全な暗号化アクセスを無料で追加します
- あなたが知らないかもしれない CloudFlare の無料 CDN 高速化に関する 10 のヒント - SSLDDOSCache
- HSTS を有効にして HSTS プリロード リストに参加し、Web サイトへの HTTPS アクセスをより安全にします - HSTS を削除する方法を使用します。
追記: 2018 年 9 月 6 日更新。有料の DNS 解決サービスを使用したい場合は、個人に適した 2 つの安価な DNS サービスをご紹介します。 個人使用に適した 2 つの DNS 製品: ClouDNS と DNSドメイン名解決が簡単になりました。
追記: 2019 年 1 月 15 日更新、 SSL アクセスの速度とパフォーマンスを向上させたい場合は、TLSV1.3 と Brotli 圧縮を試すことができます: Web サイト最適化の高速化 - TLSV1.3 と Brotli 圧縮をオンにします-ワンインスタック、LNMP、パゴダパネル。
1. 無料の SSL 証明書を選択するにはどうすればよいですか?
「暗号化しましょう」を選択することをお勧めします。 Let’s Encrypt の無料 SSL 証明書の有効期間はわずか 90 日ですが、無期限に更新でき、手動および自動更新をサポートしています。 Let’s Encrypt SSL はすべての主要なブラウザで認識され、無料の SSL 証明書の第一の選択肢です。チュートリアル: Let’s Encrypt Wildcard の無料ドメイン名 SSL 証明書のワンクリック アプリケーションと SSL の使用方法のチュートリアル。
Let’s Encrypt は、VPS などの独立した IP を持つホストに適しています。それ以外の場合は、Let’s Encrypt API を使用して開発された一部のオンライン SSL 証明書アプリケーションのみを使用できます。もちろん、ある程度の経済力がある場合は、有料 SSL 証明書を選択する方が現実的です。その他の SSL 証明書については、「無料 SSL 証明書の収集と概要」を参照してください。
2. サーバー上で HSTS を有効にする
HSTS プロトコルを使用する Web サイトでは、ユーザーが URL アドレスバーに https://
を含む暗号化されたアドレスを手動で入力する必要がなく、ブラウザーが常に Web サイトの HTTPS バージョンに接続するようになります。 Nginx サーバーを使用します。必要な作業は、Nginx 構成ファイル (/usr/local/nginx/conf/nginx.conf など) を編集し、HTTPS 構成のサーバー ブロックに次の行を追加することだけです。
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
Apache、Lighttpd などで HSTS を有効にする方法の詳細については、「サーバーで HSTS を有効にする」を参照してください。
3. HSTS プリロード リスト プランにドメイン名を追加します。
ユーザーが常に HTTPS 接続にアクセスできるように上記で HSTS プロトコルが有効になっていますが、一般に、初めて Web サイトにアクセスするユーザーは習慣的に非 https ドメイン名を入力するため、初めて Web サイトにアクセスするときに http ハイジャックの問題が発生します。時間。 HSTS プリロード リスト計画は、この問題を解決するものです。これは、chromeFirefoxEdge などのブラウザーに組み込まれたリストです。
HSTS プリロード リストに参加する方法: HSTS を有効にして HSTS プリロード リストに参加し、Web サイトへの HTTPS アクセスをより安全にします - HSTS を削除する方法を添付します。現在、wzfou.com は HSTS プリロード リストに正常に追加されています。Chrome または Firefox を使用している場合、このサイトに初めてアクセスするときは、デフォルトで HTTPS を使用して接続します。
Nginx でOCSP Stapling を有効化します。 (ssl_certificate ディレクティブで完全な証明書チェーンを指定する場合は、ssl_trusted_certificate を省略できます)
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/certs/chained.pem;
Apache でOCSP ステープリングを有効にする:
<VirtualHost></VirtualHost>
に以下を追加します。
SSLUseStapling on
<VirtualHost></VirtualHost>
の外側に次を追加します。
SSLStaplingCache shmcb:/tmp/stapling_cache(128000)
5. ECC と RSA の二重証明書を使用する
RSA 証明書には最も幅広い互換性があるため、デフォルトではすべて RSA 証明書を使用します。ただし、ECC 証明書には、サイズが小さく、計算速度が速く、セキュリティが高いという特徴があります (256 ビットの ECC キー
は、3072 ビットの RSA キー
と同じセキュリティを提供できます)。ある程度の HTTPS パフォーマンスを提供できます。
Let’s Encrypt はすでに ECC 証明書の生成をサポートしています。acme.sh を使用して SSL 証明書を発行し、証明書タイプを ECC に変更します。
acme.sh --issue -w /data/wwwroot/wzfou.com -d wzfou.com -d www.wzfou.com --keylength ec-256
現時点では、ECC は Windows XP では互換性がないことに注意してください。つまり、ECC 証明書がサポートされていない場合、Nginx は自動的に RSA 証明書をユーザーに表示します。 nginx のバージョンが 1.11
より大きい場合は、wzfou.com で次のように構成ファイルに ECC および RSA デュアル証明書のパスを直接書き込むことができます。
#ECC
ssl_certificate /root/.acme.sh/wzfou.com_ecc/fullchain.cer;
ssl_certificate_key /root/.acme.sh/wzfou.com_ecc/wzfou.com.key;
#RSA
ssl_certificate /usr/local/nginx/conf/ssl/wzfou.com.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/wzfou.com.key;
Nginxを再起動します。XPなどECC証明書をサポートしていないユーザーがWebサイトにアクセスすると、RSA証明書が表示されます。
他のユーザーは ECC 証明書の使用を好みます。
ECC が優先的に表示されない場合は、ssl_prefer_server_ciphers
が有効になっているかどうか、および ssl_ciphers
が正しく設定されているかどうかを確認してください。 wzfou.com で使用される設定は次のとおりです。
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
さらに、次の 3 つのいずれかを選択できます (テストのみ)。
ssl_ciphers 'EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5';
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK';
6.DNS CAAを有効にする
DNS CAA の機能は、レコードにリストされている CA のみがそのドメイン名 (またはサブドメイン名) の証明書を発行できるようにすることで、誰かが SSL 証明書を偽造するのを防ぐと同時に、CAA レコードは単一ドメインの発行を制御できます。 SSL 証明書に名前を付け、ワイルドカード証明書を制御することもできます。詳細な方法については、「JD Cloud DNS 設定 CAA」を参照してください。
問題:DNS CAA を有効にすると、エラーが発生します: Verify error: CAA Record for *.wzfou.comprevents 発行。解決策は、 issuewild
レコードを追加することです: 0 issuewild "letsencrypt.org"
。 さらに、CAA 設定が正しいかどうかを確認するための 2 つの Web サイトが提供されています。
- HTTPS://CAA test.co.UK/
- HTTPS://New Year's Eve friends.IO/labs/CAA-validator
7. SSL 証明書を定期的に自動更新する
手動で更新する場合は、次のようにします。
# RSA
$ acme.sh --renew -d wzfou.com –d www.wzfou.com --force
# ECC
acme.sh --renew -d wzfou.com –d www.wzfou.com --force --ecc
通常、acme.sh は、Let’s Encrypt 証明書を定期的に更新するためのスケジュールされたタスクを自動的に追加します。証明書が定期的に更新されていないことが判明した場合は、Cron タスクが正しいかどうかを確認して、強制的に更新することもできます。
"/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" --force
8. SSL 証明書の構成を確認する
一般的に使用されるテスト Web サイトには次のものがあります。
- HTTPS://wuwuwu.SSL labs.com/SSL test/analyze.HTML
- https://nokill.com/
ssllabs.com を使用することを強くお勧めします。次のように、テスト結果は非常に正確です。
9. 包括的
上記の最適化戦略に基づいて、Nginx 構成ファイルの具体的な最適化は次のとおりです。
server {
listen 443 ssl http2;
#使用HTTP/2,需要Nginx1.9.7以上版本
add_header Strict-Transport-Security "max-age=6307200; includeSubdomains; preload";
#开启HSTS,并设置有效期为“6307200秒”(6个月),包括子域名(根据情况可删掉),预加载到浏览器缓存(根据情况可删掉)
add_header X-Frame-Options DENY;
#禁止被嵌入框架
add_header X-Content-Type-Options nosniff;
#防止在IE9、Chrome和Safari中的MIME类型混淆攻击
ssl_certificate /usr/local/nginx/conf/vhost/sslkey/www.linpx.com.crt;
ssl_certificate_key /usr/local/nginx/conf/vhost/sslkey/www.linpx.com.key;
#SSL证书文件位置
ssl_trusted_certificate /usr/local/nginx/conf/vhost/sslkey/chaine.pem;
#OCSP Stapling的证书位置
ssl_dhparam /usr/local/nginx/conf/vhost/sslkey/dhparam.pem;
#DH-Key交换密钥文件位置
#SSL优化配置
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
#只允许TLS协议
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
#加密套件,这里用了CloudFlare's Internet facing SSL cipher configuration
ssl_prefer_server_ciphers on;
#由服务器协商最佳的加密算法
ssl_session_cache builtin:1000 shared:SSL:10m;
#Session Cache,将Session缓存到服务器,这可能会占用更多的服务器资源
ssl_session_tickets on;
#开启浏览器的Session Ticket缓存
ssl_session_timeout 10m;
#SSL session过期时间
ssl_stapling on;
#OCSP Stapling开启,OCSP是用于在线查询证书吊销情况的服务,使用OCSP Stapling能将证书有效状态的信息缓存到服务器,提高TLS握手速度
ssl_stapling_verify on;
#OCSP Stapling验证开启
resolver 8.8.8.8 8.8.4.4 valid=300s;
#用于查询OCSP服务器的DNS
resolver_timeout 5s;
#查询域名超时时间
···
}
実際に使用すると、各自のニーズに応じて個別の「最適化」を決定する必要があることがわかります。以下は、wzfou.com で現在使用されている Nginx 構成です (参考のみ)。
listen 80;
listen 443 ssl http2;
#ECC
ssl_certificate /root/.acme.sh/wzfou.com_ecc/fullchain.cer;
ssl_certificate_key /root/.acme.sh/wzfou.com_ecc/wzfou.com.key;
#RSA
ssl_certificate /usr/local/nginx/conf/ssl/wzfou.com.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/wzfou.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_timeout 10m;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_buffer_size 1400;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
ssl_stapling on;
ssl_stapling_verify on;
追記: 2018 年 8 月 5 日に更新されました。リマインダーを提供してくれた xiaoz に感謝します。Mozilla の SSL 設定をオンラインで生成するための Web サイトは非常に参考になります。
- https://Mozilla.GitHub.IO/server-dead-torres/rateds-config-generator/