してみるテストロゴ
Apache 2.4系でHTTP/2サーバを構築してみるテスト。

最新情報

関連ソフトウエアのサポート期間

OpenSSL 1.1.0系のサポート終了まであと、000日です。

(サポート終了予定日:2018年8月31日)

OpenSSL 1.0.2系のサポート終了まであと、000日です。

(サポート終了予定日:2019年12月31日)

サポートが終了したソフトウエア

OpenSSL 1.0.1系のサポートが終了しました。

(サポート終了日:2016年12月31日) OpenSSL 1.0.2系へのアップグレードをお急ぎください。

Apache httpd サーバ 2.2系のセキュリティーパッチ提供を含むメンテナンスが終了しました。

(メンテナンス終了日:2017年12月31日) Apache 2.4系へのアップグレードをお急ぎください。

更新履歴

2018-05-15   NSD 4.1.21がリリースされたで、NSDのインストールを、最新のバージョンにあわせて、更新しました。
2018-05-10   TLS接続の確認」にMicrosoft Edgeを追加しました。
2018-04-23   FreeBSDをバージョンアップしてみる。」を追加しました。
2018-04-18   OpenSSL1.1.1-pre5がリリースされたので、「TLS1.3を設定してみる。」を修正しました。
2018-03-30   Let's EncryptのCertificate Transparency対応」を追加しました。
2018-03-29   TLS接続のHTTP/1.1プロトコルの確認」を追加しました。
2018-03-26   TLSv1.3に対応したOpenSSL1.1.1-pre3がリリースされたので、「TLS1.3を設定してみる。」を追加しました。
Apache HTTPD WebサーバでTLSv1.3を利用する設定をご紹介します。
2018-03-23   Apache HTTP Server 2.4.33がリリースされました。
インストールするもの」を最新のバージョンにあわせました。
2018-03-14 Let's EncryptがACMEv2対応とワイルドカード証明書の発行を開始しました。
ACMEv2を使って、ワイルドカード証明書を取得してみる。を追加しました。
2018-02-28 OpenSSL 1.1.1 pre2がリリースされましたので、OpenSSL1.1.1についてを更新しました。
2018-02-14 OpenSSL1.1.1がリリースされました。早速使ってみたので簡単にまとめてみました。OpenSSL1.1.1について
TLSv1.3の暗号スイートの実装状況や、量子コンピュータ対策の一環と思われるAES-128-CCMのベンチマークをとってみました。
2018-02-04 nghttp2 1.30.0がリリースされました。
インストールするものを最新のバージョンにあわせました。
GOAWAY後に、PINGフレームを送信できるバグが修正されました。
2018-01-16 nsdを使って、Let's Encryptのdns-01認証チャレンジにより証明書を取得してみる。」を追加してみました。
2018-01-11   Let's Encrypt ベストプラクティス」を追加してみました。
2018-01-01   Apache httpd サーバ 2.2系のセキュリティーパッチ提供を含むメンテナンスが、2017年12月31日に終了しました。
Apache 2.4系へのアップグレードをお急ぎください。
>> 2017年の更新履歴 >> 2016年以前の更新履歴

はじめに

このサイトでは、HTTP/2のWebサーバを構築するにあたって、必要となる知識のすべてを、理解していただくことを目標としています。

HTTP/2についてよくわからないという方は、先に以下のページをご覧ください。

[参考]>>HTTP/2とは

いまや、一般的なブラウザの多くがHTTP/2に対応しており、サーバさえ対応すればだれでも利用できる状況です。

HTTP/2は、TLS暗号化接続(いわゆるSSL)を前提とはしておりますが、TLS/SSLで使用するサーバ証明書も、無償での取得が、できるようになってきており、敷居は、低くなってきています。

以下の順番で進んでいけば、HTTP/2サーバの構築と、仕組みを理解することができます。

基本編

当サイトには、HTTP/2に関する一通りの設定が説明されています。

知りたい設定がございましたら、下記から検索して頂くと、目的のページに素早くたどり着けるかもしれません。


説明は、以下の順番で読んで頂くのが良いと思いますが、ご存じの項目があれば飛ばして頂いて結構です。

1. インストールするもの

まず、HTTP/2を実現するにあたって必要となるライブラリなどをインストールします。

ここでは、HTTP/2に必要となるライブラリを含んだApache2.4をインストールして、まずは、非暗号化(平文)のHTTP/1.1サーバとして起動するところまで行います。

非暗号化(平文)のHTTP/1.1サーバが無ければ、無償の証明書発行機関(Let's Encryptプロジェクト)を使うことができませんので、ここから始めます。

2. サーバ証明書

次に、TLS通信を行うためのサーバ証明書を導入します。

一般的な有償の証明書発行機関を使う場合と、ACMEプロトコルを使った無償の証明書発行機関(Let's Encryptプロジェクト)を使う場合の2通りを説明しています。

また、Let's Encryptについては、Let's Encryptのサーバ証明書を自動更新する方法についても説明します。

ここでは、HTTP/1.1のHTTPSサーバのとして動作するところまで進めます。

3. HTTP/2の各種設定

準備が整ったところで、HTTP/2に必要となる設定を行います。

h2cとh2の設定を行い、h2については、TLSの暗号スイート(アルゴリズム)や、OCSPステープリングについても設定します。また、同一ドメイン間のHTTP→HTTPSリダイレクトを行う場合は、HSTSを設定します。これらは、HTTP/1.1のTLS接続においても有用です。ここに記載のTLS設定を行えば、、QUALYS SSL LabsのSSLサーバテストで、A+をとれます。

h2cについては、ダイレクトモードの有効・無効を設定する方法を説明します。

4. HTTP/2の動作確認

HTTP/2の動作確認方法について、説明します。

まず、h2cプロトコルでの通信で確認し、その後、h2プロトコルの通信を試します。

5. HTTP/2のチューニング

HTTP/2のプッシュ機能など、チューニングの基本について、説明します。

 

HTTP/2 応用編

1. HTTP/2のチューニング[応用編]

Apacheのmod_http2用の応用編チューニングです。

2. HTTP/2のチューニング[TLS応用編]

Apacheのmod_http2用のTLS応用編チューニングです。

3. 103 Early HintsとH2PushResource について

Apache 2.4.24から導入されたディレクティブを使った際の挙動を調べてみました。

4. mod_http2のリファレンス

mod_http2用の設定ファイルのディレクティブはコチラをご覧ください。

5. mod_rewriteの設定例

mod_rewrite用の設定例はコチラをご覧ください。

6.TLS接続の確認

TLS接続の動作確認方法をまとめました。Google Chromeを利用する方法と、コマンドラインから、OpenSSLを利用する方法を記載しました。特に、OpenSSL1.0.2以降は、証明書の署名アルゴリズムを指定して、TLS接続を開始することができます。

7. サーバ負荷をRSAとECDSAで比較

基本編では、Let's Encryptなどの証明書発行機関のRSA暗号署名の証明書について説明しました。サーバ証明書の署名には、RSA暗号のほか、楕円曲線暗号を利用した、ECDSA署名の証明書も入手できます。まずRSA暗号と、ECDSA、ECDHEの違いを理解して、サーバ負荷がどうなるか比較します。

8. 暗号スイートの暗号強度と、公開鍵のビット数の設定

ECDHEやRSAなど、鍵交換を行う場合の公開鍵のビット数をどのように決めるとよいか、暗号スイートの選択と併せて、一例を示しています。

9. マルチアルゴリズム証明書の使い方

フィーチャーフォン用のサイトを、HTTP/2と同じFQDN名のサーバで運用する際に、フィーチャーフォン用のRSA対応のサーバ証明書と、スマートフォン・PC向けのECDSA対応のサーバ証明書を共存することができます。

10. 2016年度Accessログのまとめ

2016年度の当サイトのアクセスログをまとめてみて、HTTP/2の変化を振り返ってみます。

11.HTTP/1.x(HTTP/0.9)の小技

HTTP/0.9を無効にする方法を説明します。

12.TLS1.3を設定してみる。

TLSv1.3に対応したOpenSSL1.1.1-pre3がリリースされたので、Apache HTTPD WebサーバでTLSv1.3を利用する設定をご紹介します。

Let's Encrypt 応用編

1. Let's Encryptの機能のまとめ

Let's Encryptで、できることの一覧と、最新情報はコチラをご覧ください。

2. Let's Encrypt ベストプラクティス

現時点で、最善と思われるLet's Encryptの使い方を紹介します。

3. certbotコマンドの使い方やオプション

letsencrypt-autoとほとんど一緒ですが、公式ACMEエージェントとなったcertbotコマンド(ACMEエージェント)のオプションなどを説明します。

4. acme.shスクリプトの使い方やオプション

Let's Encrypt非公式ACMEエージェントであるacme.shのオプションなどを説明します。Let's Encryptが、国際化ドメイン名(IDN)に対応したので、IDN取得例もこちらです。

5. letsencrypt-autoコマンドの使い方やオプション

基本編では紹介しきれなかったletsencrypt-autoコマンド(ACMEエージェント)のオプションなどを説明します。

6. dehydratedコマンドの使い方やオプション

certbot(letsencrypt-auto)とは別の、ACMEエージェントです。シェルスクリプトベースのため、簡単にLinux以外のOSでも動かしやすいです。楕円曲線暗号ECDSA対応の証明書の取得も簡単です。負荷分散装置を使っている方には、dehydratedのフックを利用した、dns-01認証チャレンジがお勧めです。

7. 自分でCSRを生成して、Let's Encryptをつかう場合

CSRを自分で作って、そこから、Let's Encryptを使って、サーバ証明書を発行してもらう方法を説明します。なお、Let's Encryptは、ドメイン認証(DV)なので、ドメイン名(CN)以外は証明書に含まれません。応用例として、HPKPの実装例方法を説明します。

8. ECDSA対応CSRを生成して、Let's Encryptをつかう場合

ECDSA対応のCSRを自分で作って、そこから、Let's Encryptを使って、サーバ証明書を発行してもらう方法を説明します。基本は、自分でCSRを生成して、Let's Encryptをつかう場合と同じです。

9. Certification Authority Authorization(DNS CAA)設定

認証局(証明書発行機関)もピンキリです。セキュリティー上の問題を含む認証局が、自分のドメインの証明書を他人に発行してしまうこともあり得ます。DNS CAAはDNSに証明書を発行して良い認証局を明示することで、他人への意図しない証明書の発行を防ぎます。

10. nsdを使って、Let's Encryptのdns-01認証チャレンジにより証明書を取得してみる。

Let's Encryptのドメイン認証チャレンジには、dns-01と呼ばれるDNSサーバを利用する方法があります。ゾーンファイルと呼ばれるファイルを使ってDNSサーバを設定する方法で利用できるhookスクリプトをご紹介します。

11.ACMEv2を使って、ワイルドカード証明書を取得してみる。

Let's EncryptがACMEv2に対応して、ワイルドカード証明書の発行ができるようになりました。acme.shを使って、実際にワイルドカード証明書を取得します。

11.Let's EncryptのCertificate Transparency対応

Let's Encryptが、証明書署名タイムスタンプ(SCT : Signed Certificate Timestamp)を証明書に埋め込んで発行することで、CT(Certificate Transparency:証明書の透明性)の監査に対応しました。

IPv6 応用編

1. IPv6について

IPv6アドレスの構造を説明し、クライアントのアクセス回線の設定を行います。

2. IPv6の設定の確認(Windowsクライアント編)

クライアントのアクセス回線に割り当てられたIPv6アドレスを確認し、IPv6のアドレス自動設定を説明します。

3. IPv6のサーバ設置ネットワークの設定

DHCPv6-PDを利用したルータの設定を行い、サーバ設置ネットワークを構築します。

4. IPv6スタティックアドレスの設定

DHCPv6-PDの割り当て情報から、スタティックアドレスを決めて、サーバに設定します。

5. IPv6対応ネームサーバのインストールと設定

IPv6に対応したDNSサーバを構築し、レジストラに登録します。

6. Apache HttpdのIPv6の設定と確認

Webサーバの設定を確認し、IPv6によるアクセスができるか確認します。

7. WebサーバのIPv6対応のススメ

WebサーバをIPv6に対応させることで、IPv4よりたくさんのお客さんを捌けるようになる可能性があることを説明します。

 

OpenSSL応用編

1. プライベートルート証明書・中間証明書・サーバ証明書の作り方

OpenSSLを使って、自分で認証局を作ってみます。いわゆるプライベート認証局です。

ここでは、中間証明書を含む証明書発行について説明します。

2. プライベートルート証明書のクライアント機へのインストール

プライベート証明書を作ったら、クライアントにインストールしなければ、暗号化チェーンが完成しません。そこで、Windows、Linux、Solarisへのインストール方法を説明します。

3. プライベート認証局でECDSAサーバ証明書の作り方

ECDSAのサーバ証明書を作ります。ここでは、中間証明書はRSAのものを使い、システム全体のパフォーマンスを優先します。

4. OpenSSL1.1.0について

現在の長期サポート対象のOpenSSL1.0.2と、OpenSSL1.1.0の違い等について、説明します。

5. OpenSSL1.1.0と以前のバージョンとの互換性

OpenSSL1.1.0と以前のバージョンとの互換性の問題で、実際に嵌まったので、記録として残しておきます。

6. OpenSSL1.1.0系の暗号スイート

OpenSSL1.1.0の暗号スイートのベンチマークを取り、最適な暗号スイートの設定を検討します。楕円曲線(EC)暗号の処理は、以前計測したベンチマークよりも良くなっています。

7. TLS接続のHTTP/1.1プロトコルの確認

コマンドラインのOpenSSLから、GETメソッドなどを使用して、HTTP/1.1プロトコルを試す方法を説明します。特に、Apache HTTPD Webサーバの2.2.32以降もしくは 2.4.24以降は挙動が厳密になっています。

FreeBSD応用編

1. Microsoft AzureでFreeBSDをインストールしてみる。

Microsoft Azureのマーケットプレイスから、FreeBSD 11.0をインストールして、基本的なパッケージをインストールしてみます。

2. Microsoft AzureのFreeBSDでZFSを設定してみる。

Microsoft AzureにインストールしたFreeBSD 11.0にデータディスクを追加してみます。

3. FreeBSDでZFSを設定してみる。

追加したデータディスクにZFSを設定してみます。

4. FreeBSDのタイムゾーンとcronを設定してみる。

Azureにインストールした直後のFreeBSDのタイムゾーンは、UTC(世界標準時)で稼働しています。そこで、日本の標準時でログなどを記録するように設定します。

5. FreeBSDをバージョンアップしてみる。

AzureにインストールしたFreeBSDのサポート期間が終了していたので、バージョンアップしてみました。

番外編

1. Let's Encryptを使ってqmailのTLSv1.2対応

Webサービスに、メールはつきもの。ということで、Let's Encryptを利用して、qmailのpop3接続と、SMTP-submission接続の暗号化を行います。HTTP/2と同様に、前方秘匿性(Forward Secrecy)を実現した暗号スイートを使えるようにします。

2. CISCO社のWebVPNを設定してみる。

プライベートルート証明書などを利用して、Cisco社のWebVPNの設定を行ってみます。

3. SSH公開鍵認証を使ったログインの手順

ECDSAの256ビットの秘密鍵を使う場合を例に、SSH公開鍵認証の手順を説明します。

4. Internet Explorer /Microsoft EdgeのTLS1.2対応

Windowsのグループポリシーにおいて、TLSv1.2を使わない設定になっていると、当サイトのようにTLS v1.2しか話さないサーバに接続できなくなります。そこで、TLSv1.2を使うように設定する方法を記載しました。

5.TLS1.2のみ対応のサイトに移行すると、どうなる?

TLS1.2のみ対応するようにサーバを設定すると、当然古いブラウザからはアクセスできなくなります。いったいどういったメッセージが表示され、どうなるのか試してみました。

6.Sender Policy Framework(SPF)で嵌まった話

qmailにSPFパッチを適用して運用する際に、一番厳しい設定にすると、SPFレコードが存在しないドメインからのメールを受信できなくなります。SPFレコードが存在しない場合に例外設定を用意してメールを受信する方法を紹介します。

7.Adobe Illustratorで、Fireworksの「書き出し」⇒「レイヤーからファイルへ」を実現するスクリプト

Adobe Illustratorで、Fireworksの「書き出し」⇒「レイヤーからファイルへ」を実現するスクリプトをつくってみました。

NEXT >> インストールするもの

©Copyrights 2015-2018, non-standard programmer

このサイトは、あくまでも私の個人的体験を、綴ったものです。 軽く参考程度にご利用ください。