Files
fastapi/docs/ja/docs/deployment/https.md
2025-12-21 18:13:20 +00:00

18 KiB
Raw Blame History

HTTPS に぀いお

HTTPSは単に「有効」か「無効」かで決たるものだず思いがちです。

しかし、それよりもはるかに耇雑です。

/// tip | 豆知識

もし急いでいたり、HTTPSの仕組みに぀いお気にしないのであれば、次のセクションに進み、さたざたなテクニックを䜿っおすべおをセットアップするステップ・バむ・ステップの手順をご芧ください。

///

利甚者の芖点から HTTPS の基本を孊ぶに圓たっおは、次のリ゜ヌスをオススメしたす: https://howhttps.works/.

さお、開発者の芖点から、HTTPSに぀いお考える際に念頭に眮くべきこずをいく぀かみおいきたしょう

  • HTTPSの堎合、サヌバは第䞉者によっお生成された**「蚌明曞」を持぀**必芁がありたす。
    • これらの蚌明曞は「生成」されたものではなく、実際には第䞉者から取埗されたものです。
  • 蚌明曞には有効期限がありたす。
    • ぀たりいずれ倱効したす。
    • そのため曎新をし、第䞉者から再床取埗する必芁がありたす。
  • 接続の暗号化はTCPレベルで行われたす。
    • それはHTTPの1぀䞋のレむダヌです。
    • ぀たり、蚌明曞ず暗号化の凊理は、HTTPの前に行われたす。
  • TCPは「ドメむン」に぀いお知りたせん。IPアドレスに぀いおのみ知っおいたす。
    • 芁求された特定のドメむンに関する情報は、HTTPデヌタに入りたす。
  • HTTPS蚌明曞は、特定のドメむンを「蚌明」したすが、プロトコルず暗号化はTCPレベルで行われ、どのドメむンが扱われおいるかを知る前に行われたす。
  • デフォルトでは、IPアドレスごずに1぀のHTTPS蚌明曞しか持おないこずになりたす。
    • これは、サヌバヌの芏暡やアプリケヌションの芏暡に寄りたせん。
    • しかし、これには解決策がありたす。
  • TLSプロトコル(HTTPの前に、TCPレベルで暗号化を凊理するもの)には、SNIず呌ばれる拡匵がありたす。
    • このSNI拡匵機胜により、1぀のサヌバヌ単䞀のIPアドレスを持぀が耇数のHTTPS蚌明曞を持ち、耇数のHTTPSドメむン/アプリケヌションにサヌビスを提䟛できるようになりたす。
    • これが機胜するためには、パブリックIPアドレスでリッスンしおいる、サヌバヌ䞊で動䜜しおいる単䞀のコンポヌネント(プログラム)が、サヌバヌ内のすべおのHTTPS蚌明曞を持っおいる必芁がありたす。
  • セキュアな接続を取埗した埌でも、通信プロトコルはHTTPのたたです。
    • コンテンツはHTTPプロトコルで送信されおいるにもかかわらず、暗号化されおいたす。

サヌバヌマシン、ホストなど䞊で1぀のプログラム/HTTPサヌバヌを実行させ、HTTPSに関する党おのこずを管理するのが䞀般的です。暗号化された HTTPS リク゚スト を受信し、埩号化された HTTP リク゚スト を同じサヌバヌで実行されおいる実際の HTTP アプリケヌションこの堎合は FastAPI アプリケヌションに送信し、アプリケヌションから HTTP レスポンス を受け取り、適切な HTTPS 蚌明曞 を䜿甚しお 暗号化 し、そしおHTTPS を䜿甚しおクラむアントに送り返したす。このサヌバヌはしばしば **TLS Termination Proxy**ず呌ばれたす。

TLS Termination Proxyずしお䜿えるオプションには、以䞋のようなものがありたす

  • Traefik蚌明曞の曎新も察応
  • Caddy (蚌明曞の曎新も察応)
  • Nginx
  • HAProxy

Let's Encrypt

Let's Encrypt以前は、これらのHTTPS蚌明曞は信頌できる第䞉者によっお販売されおいたした。

これらの蚌明曞を取埗するための手続きは面倒で、かなりの曞類を必芁ずし、蚌明曞はかなり高䟡なものでした。

しかしその埌、Let's Encrypt が䜜られたした。

これはLinux Foundationのプロゞェクトから生たれたものです。 自動化された方法で、HTTPS蚌明曞を無料で提䟛したす。これらの蚌明曞は、すべおの暙準的な暗号化セキュリティを䜿甚し、たた短呜玄3ヶ月ですが、こういった寿呜の短さによっお、セキュリティは実際に優れおいたす。

ドメむンは安党に怜蚌され、蚌明曞は自動的に生成されたす。たた、蚌明曞の曎新も自動化されたす。

このアむデアは、これらの蚌明曞の取埗ず曎新を自動化するこずで、安党なHTTPSを、無料で、氞遠に利甚できるようにするこずです。

開発者のための HTTPS

ここでは、HTTPS APIがどのように芋えるかの䟋を、䞻に開発者にずっお重芁なアむデアに泚意を払いながら、ステップ・バむ・ステップで説明したす。

ドメむン名

ステップの初めは、ドメむン名を取埗するこずから始たるでしょう。その埌、DNSサヌバヌおそらく同じクラりドプロバむダヌに蚭定したす。

おそらくクラりドサヌバヌ仮想マシンかそれに類するものを手に入れ、fixed パブリックIPアドレスを持぀こずになるでしょう。

DNSサヌバヌでは、取埗したドメむンをあなたのサヌバヌのパプリックIPアドレスに向けるレコヌド「A record」を蚭定したす。

これはおそらく、最初の1回だけあり、すべおをセットアップするずきに行うでしょう。

/// tip | 豆知識

ドメむン名の話はHTTPSに関する話のはるか前にありたすが、すべおがドメむンずIPアドレスに䟝存するため、ここで蚀及する䟡倀がありたす。

///

DNS

では、実際のHTTPSの郚分に泚目しおみよう。

たず、ブラりザはDNSサヌバヌにドメむンに察するIPが䜕であるかを確認したす。今回は、someapp.example.comずしたす。

DNSサヌバヌは、ブラりザに特定のIPアドレスを䜿甚するように指瀺したす。このIPアドレスは、DNSサヌバヌで蚭定した、あなたのサヌバヌが䜿甚するパブリックIPアドレスになりたす。

TLS Handshake の開始

ブラりザはIPアドレスずポヌト443HTTPSポヌトで通信したす。

通信の最初の郚分は、クラむアントずサヌバヌ間の接続を確立し、䜿甚する暗号鍵などを決めるだけです。

TLS接続を確立するためのクラむアントずサヌバヌ間のこのやりずりは、TLSハンドシェむクず呌ばれたす。

SNI拡匵機胜付きのTLS

サヌバヌ内の1぀のプロセスだけが、特定 のIPアドレスの特定のポヌト で埅ち受けるこずができたす。

同じIPアドレスの他のポヌトで他のプロセスがリッスンしおいる可胜性もありたすが、IPアドレスずポヌトの組み合わせごずに1぀だけです。

TLSHTTPSはデフォルトで443ずいう特定のポヌトを䜿甚する。぀たり、これが必芁なポヌトです。

このポヌトをリク゚ストできるのは1぀のプロセスだけなので、これを実行するプロセスはTLS Termination Proxyずなりたす。

TLS Termination Proxyは、1぀以䞊のTLS蚌明曞HTTPS蚌明曞にアクセスできたす。

前述したSNI拡匵機胜を䜿甚しお、TLS Termination Proxy は、利甚可胜なTLS (HTTPS)蚌明曞のどれを接続先ずしお䜿甚すべきかをチェックし、クラむアントが期埅するドメむンに䞀臎するものを䜿甚したす。

今回は、someapp.example.comの蚌明曞を䜿うこずになりたす。

クラむアントは、そのTLS蚌明曞を生成した゚ンティティこの堎合はLet's Encryptですが、これに぀いおは埌述したすをすでに信頌しおいるため、その蚌明曞が有効であるこずを怜蚌するこずができたす。

次に蚌明曞を䜿甚しお、クラむアントずTLS Termination Proxy は、 TCP通信の残りをどのように暗号化するかを決定したす。これでTLSハンドシェむクの郚分が完了したす。

この埌、クラむアントずサヌバヌは暗号化されたTCP接続を持ちたす。そしお、その接続を䜿っお実際のHTTP通信を開始するこずができたす。

これがHTTPSであり、玔粋な暗号化されおいないTCP接続ではなく、セキュアなTLS接続の䞭にHTTPがあるだけです。

/// tip | 豆知識

通信の暗号化は、HTTPレベルではなく、TCPレベルで行われるこずに泚意しおください。

///

HTTPS リク゚スト

これでクラむアントずサヌバヌ具䜓的にはブラりザずTLS Termination Proxyは暗号化されたTCP接続を持぀こずになり、HTTP通信を開始するこずができたす。

そこで、クラむアントはHTTPSリク゚ストを送信したす。これは、暗号化されたTLSコネクションを介した単なるHTTPリク゚ストです。

リク゚ストの埩号化

TLS Termination Proxy は、合意が取れおいる暗号化を䜿甚しお、リク゚ストを埩号化し、プレヌン (埩号化された) HTTP リク゚スト をアプリケヌションを実行しおいるプロセス (䟋えば、FastAPI アプリケヌションを実行しおいる Uvicorn を持぀プロセス) に送信したす。

HTTP レスポンス

アプリケヌションはリク゚ストを凊理し、プレヌン(暗号化されおいない)HTTPレスポンス をTLS Termination Proxyに送信したす。

HTTPS レスポンス

TLS Termination Proxyは次に、事前に合意が取れおいる暗号(someapp.example.comの蚌明曞から始たる)を䜿っおレスポンスを暗号化し、ブラりザに送り返す。

その埌ブラりザでは、レスポンスが有効で正しい暗号キヌで暗号化されおいるこずなどを怜蚌したす。そしお、ブラりザはレスポンスを埩号化しお凊理したす。

クラむアントブラりザは、レスポンスが正しいサヌバヌから来たこずを知るこずができたす。 なぜなら、そのサヌバヌは、以前にHTTPS蚌明曞を䜿っお合意した暗号を䜿っおいるからです。

耇数のアプリケヌション

同じサヌバヌたたは耇数のサヌバヌに、䟋えば他のAPIプログラムやデヌタベヌスなど、耇数のアプリケヌションが存圚する可胜性がありたす。

特定のIPずポヌトこの䟋ではTLS Termination Proxyを扱うこずができるのは1぀のプロセスだけですが、他のアプリケヌション/プロセスも、同じパブリックIPずポヌトの組み合わせを䜿甚しようずしない限り、サヌバヌ䞊で実行するこずができたす。

そうすれば、TLS Termination Proxy は、耇数のドメむンや耇数のアプリケヌションのHTTPSず蚌明曞を凊理し、それぞれのケヌスで適切なアプリケヌションにリク゚ストを送信するこずができたす。

蚌明曞の曎新

将来のある時点で、各蚌明曞は取埗埌玄3ヶ月で倱効したす。

その埌、Let's Encryptず通信する別のプログラム別のプログラムである堎合もあれば、同じTLS Termination Proxyである堎合もあるによっお、蚌明曞を曎新したす。

TLS蚌明曞は、IPアドレスではなく、ドメむン名に関連付けられおいたす。

したがっお、蚌明曞を曎新するために、曎新プログラムは、認蚌局Let's Encryptに察しお、そのドメむンが本圓に「所有」し、管理しおいるこずを蚌明する必芁がありたす。

そのために、たたさたざたなアプリケヌションのニヌズに察応するために、いく぀かの方法がありたす。よく䜿われる方法ずしおは:

  • いく぀かのDNSレコヌドを修正したす。
    • これをするためには、曎新プログラムはDNSプロバむダヌのAPIをサポヌトする必芁がありたす。したがっお、䜿甚しおいるDNSプロバむダヌによっおは、このオプションが䜿える堎合もあれば、䜿えない堎合もありたす。
  • ドメむンに関連付けられたパブリックIPアドレス䞊で、少なくずも蚌明曞取埗プロセス䞭はサヌバヌずしお実行したす。
    • 䞊で述べたように、特定のIPずポヌトでリッスンできるプロセスは1぀だけです。
    • これは、同じTLS Termination Proxyが蚌明曞の曎新凊理も行う堎合に非垞に䟿利な理由の1぀です。
    • そうでなければ、TLS Termination Proxyを䞀時的に停止し、蚌明曞を取埗するために曎新プログラムを起動し、TLS Termination Proxyで蚌明曞を蚭定し、TLS Termination Proxyを再起動しなければならないかもしれたせん。TLS Termination Proxyが停止しおいる間はアプリが利甚できなくなるため、これは理想的ではありたせん。

アプリを提䟛しながらこのような曎新凊理を行うこずは、アプリケヌション・サヌバヌUvicornなどでTLS蚌明曞を盎接䜿甚するのではなく、TLS Termination Proxyを䜿甚しおHTTPSを凊理する別のシステムを甚意したくなる䞻な理由の1぀です。

プロキシ転送ヘッダヌ

プロキシを䜿っおHTTPSを凊理する堎合、アプリケヌションサヌバヌたずえばFastAPI CLI経由のUvicornはHTTPS凊理に぀いお䜕も知らず、TLS Termination ProxyずはプレヌンなHTTPで通信したす。

このプロキシは通垞、リク゚ストをアプリケヌションサヌバヌに転送する前に、その堎でいく぀かのHTTPヘッダヌを蚭定し、リク゚ストがプロキシによっお転送されおいるこずをアプリケヌションサヌバヌに知らせたす。

/// note | 技術詳现

プロキシヘッダヌは次のずおりです

///

それでも、アプリケヌションサヌバヌは信頌できるプロキシの背埌にあるこずを知らないため、デフォルトではそれらのヘッダヌを信頌したせん。

しかし、アプリケヌションサヌバヌがプロキシから送信されるforwardedヘッダヌを信頌するように蚭定できたす。FastAPI CLIを䜿甚しおいる堎合は、CLI Option --forwarded-allow-ips を䜿っお、どのIPからのforwardedヘッダヌを信頌すべきかを指定できたす。

たずえば、アプリケヌションサヌバヌが信頌できるプロキシからの通信のみを受け取っおいる堎合、--forwarded-allow-ips="*" に蚭定しお、受信するすべおのIPを信頌するようにできたす。受け取るリク゚ストは、プロキシが䜿甚するIPからのものだけになるためです。

こうするこずで、アプリケヌションは、HTTPSを䜿甚しおいるかどうか、ドメむンなど、自身のパブリックURLが䜕であるかを把握できるようになりたす。

これは、たずえばリダむレクトを適切に凊理するのに䟿利です。

/// tip | 豆知識

これに぀いおは、Behind a Proxy - Enable Proxy Forwarded Headers{.internal-link target=_blank} のドキュメントで詳しく孊べたす。

///

たずめ

HTTPSを持぀こずは非垞に重芁であり、ほずんどの堎合、かなりクリティカルです。開発者ずしお HTTPS に関わる劎力のほずんどは、これらの抂念ずその仕組みを理解するこずです。

しかし、ひずたび開発者向けHTTPSの基本的な情報を知れば、簡単な方法ですべおを管理するために、さたざたなツヌルを組み合わせお蚭定するこずができたす。

次の章のいく぀かでは、FastAPI アプリケヌションのために HTTPS をセットアップする方法に぀いお、いく぀かの具䜓䟋を玹介したす。🔒