SSLは実際にはどのように機能しますか?


143

SSLはどのように機能しますか?

クライアント(またはブラウザー)およびサーバー(またはWebサーバー?)のどこに証明書がインストールされていますか?

ブラウザーにURLを入力してサーバーからページを取得すると、信頼/暗号化/認証プロセスはどのように開始されますか?

HTTPSプロトコルはどのように証明書を認識しますか?すべての信頼/暗号化/認証が機能する証明書であるにもかかわらず、HTTPが証明書で機能しないのはなぜですか?


24
これは理にかなった質問だと思います。SSLの仕組みを理解することはステップ1であり、正しく実装することはステップ2からステップ無限までです。
シンセサイザ



5
@StingyJackここで政策ナチにならないでください。人々は助けを求めてやって来る。質問が規則と完全に一致していないことがわかるので、すべての支援を否定しないでください。
Koray Tugay 2013年

1
@KorayTugay-誰も援助を否定していません。これは、よりターゲットを絞ったセキュリティまたはシステム管理に属しますが、OPは通常、一般的なITの質問を投稿する代わりに、プログラミングコンテキストを少し追加することにより、このフォーラムで利益を得ます。特定のプログラミングの問題に関連付けられていない質問をシャットダウンする人は何人いますか?おそらく多すぎるので、私の連想を行うために私のナッジOP。
StingyJack 2013年

回答:


144

注:元の回答を急いで書きましたが、それ以来、これはかなり人気のある質問/回答になりました。そのため、少し拡大して、より正確にしました。

TLS機能

「SSL」はこのプロトコルを指すために最も頻繁に使用される名前ですが、SSLは特に90年代半ばにNetscapeによって設計された独自のプロトコルを指します。「TLS」は、SSLに基づくIETF標準なので、TLSを使用します。最近では、Web上の安全な接続のほとんどすべてがSSLではなくTLSを実際に使用している可能性があります。

TLSにはいくつかの機能があります。

  1. アプリケーション層のデータを暗号化します。(あなたの場合、アプリケーション層プロトコルはHTTPです。)
  2. サーバーをクライアントに対して認証します。
  3. サーバーに対してクライアントを認証します。

#1と#2は非常に一般的です。#3はあまり一般的ではありません。#2に注目しているようですので、その部分について説明します。

認証

サーバーは、証明書を使用してクライアントに対して自身を認証します。証明書は、ウェブサイトに関する情報を含むデータのブロブ[1]です:

  • ドメイン名
  • 公開鍵
  • それを所有する会社
  • 発行されたとき
  • 期限切れのとき
  • 誰が発行したか
  • 等。

証明書に含まれる公開鍵を使用して、対応する秘密鍵でのみ復号化できるメッセージを暗号化することにより、機密性(上記1)を達成できます。この鍵ペアをKP1と呼び、後で混乱しないようにします。証明書のドメイン名が、アクセスしているサイトと一致していることも確認できます(上記の2)。

しかし、攻撃者がサーバーとの間で送受信されるパケットを変更できる場合、およびその攻撃者が提示された証明書を変更し、独自の公開鍵を挿入したり、その他の重要な詳細を変更した場合はどうなるでしょうか。これが発生した場合、攻撃者は安全に暗号化されていると思われるメッセージを傍受して変更する可能性があります。

この攻撃を防ぐために、証明書は他の誰かの秘密鍵によって暗号で署名され、対応する公開鍵を持っている人なら誰でも署名を検証できるようになっています。このキーペアをKP2と呼び、これらがサーバーが使用しているキーと同じでないことを明確にします。

認証局

では、KP2を作成したのは誰ですか?誰が証明書に署名しましたか?

少し単純化しすぎると、認証局はKP2を作成し、秘密鍵を使用して他の組織の証明書に署名するサービスを販売します。たとえば、証明書を作成し、Verisignのような会社に支払い、秘密鍵で署名します。[3] Verisign以外の誰もこの秘密鍵にアクセスできないため、この署名を偽造することはできません。

そして、その署名を検証するために、KP2の公開鍵を個人的に取得するにはどうすればよいですか?

証明書で公開キーを保持できることは既に確認しました。また、コンピュータサイエンティストは再帰が大好きです。KP2公開キーを証明書に入れ、そのように配布してみませんか?これは最初は少しおかしな話に聞こえますが、実際にはそれが正確に機能しています。Verisignの例を続けると、Verisignは、彼らが誰であるか、どの種類の署名が許可されているか(その他の証明書)、およびそれらの公開鍵に関する情報を含む証明書を生成します。

これで、Verisign証明書のコピーがあれば、それを使用して、アクセスしたいWebサイトのサーバー証明書の署名を検証できます。簡単でしょ?

まあ、それほど速くありません。どこかからVerisign証明書を取得する必要がありました。誰かがVerisign証明書を偽装し、自分の公開鍵をそこに置くとどうなりますか?その後、サーバーの証明書の署名を偽造することができます。これで、開始したところに戻ります。中間者攻撃です。

証明書チェーン

再帰的に考え続けると、もちろん、3番目の証明書と3番目の鍵ペア(KP3)を導入し、それを使用してVerisign証明書に署名することができます。これを証明書チェーンと呼びます。チェーン内の各証明書は、次の証明書を検証するために使用されます。うまくいけば、この再帰的なアプローチは、ずっとカメ/証明書であることがすでにわかります。どこで止まるの?

無限の数の証明書を作成することはできないため、証明書チェーンは明らかに停止する必要があります どこかでする必要があり、それは自己署名されたチェーンに証明書を含めることによって行われます。

頭が爆発して脳の物質を拾っている間、少しの間休止します。自己署名?!

はい。証明書チェーンの最後(別名「ルート」)には、独自の鍵ペアを使用して署名する証明書があります。これにより、無限再帰の問題は解消されますが、認証の問題は修正されません。私が政治、理論物理学を3専攻し、尻蹴りを適用し、下部で自分の名前に署名することを示す偽のプリンストン卒業証書を作成できるのと同じように、誰でもその上に何かを記載した自己署名証明書を作成できます。

この問題に対する[ややエキサイティングな]解決策は、明示的に信頼する自己署名証明書のセットを選択することです。たとえば、「私は信頼しますこのVerisign自己署名証明書しています。」。

この明示的な信頼が整ったので、証明書チェーン全体を検証できます。チェーン内に証明書がいくつあっても、各署名をルートまで検証できます。ルートに到達したら、そのルート証明書が私が明示的に信頼しているものであるかどうかを確認できます。もしそうなら、私はチェーン全体を信頼することができます。

授与された信頼

TLSでの認証は、付与された信頼のシステムを使用します。自動車整備士を雇いたいのなら、私が見つけたランダムな整備士を信用できないかもしれません。しかし、おそらく私の友人は特定のメカニズムを保証しています。私は友達を信頼しているので、そのメカニズムを信頼できます。

コンピュータを購入するか、ブラウザをダウンロードすると、数百のルート証明書が付属しており、明示的に信頼しています。[4] これらの証明書を所有および運用する企業は、証明書に署名することにより、その信頼を他の組織に与えることができます。

これは完璧なシステムにはほど遠い。CAが誤って証明書を発行する場合があります。そのような場合、証明書を取り消す必要がある場合があります。発行された証明書は常に暗号的に正しいため、失効は注意が必要です。以前に有効だった証明書のうち、取り消されたものを見つけるには、帯域外プロトコルが必要です。実際には、これらのプロトコルの一部はあまり安全ではなく、多くのブラウザはいずれにしてもそれらをチェックしません。

CA全体が侵害される場合があります。たとえば、Verisignに侵入してルート署名鍵を盗んだ場合、任意のなりすましが可能です。世界に証明書を。これはVerisignの顧客に影響するだけではないことに注意してください。私の証明書がThawte(Verisignの競合相手)によって署名されている場合でも、それは問題ではありません。私の証明書は依然として、Verisignからの侵害された署名鍵を使用して偽造することができます。

これは理論的なものではありません。それは野生で起こりました。DigiNotarは有名にハッキングされ、その後破産しました。コモドもハッキングされましたがどういうわけか彼らは今日に至るまでビジネスを続けています。

CAが直接侵害されていない場合でも、このシステムには他の脅威があります。たとえば、政府は法的強制を使用して、偽造された証明書への署名をCAに強制します。雇用主は、従業員のコンピュータに独自のCA証明書をインストールできます。これらのさまざまなケースで、「安全」であると予想されるトラフィックは、実際には、その証明書を管理する組織に完全に表示/変更可能です。

ConvergenceTACKDANEなど、いくつかの代替が提案されています。

文末脚注

[1] TLS証明書データはX.509標準に従ってフォーマットされます。X.509はASN.1( "Abstract Syntax Notation#1")に基づいています。つまり、これはバイナリデータ形式ではありません。したがって、X.509はバイナリ形式にエンコードする必要があります。DERとPEMは、私が知っている2つの最も一般的なエンコーディングです。

[2]実際には、プロトコルは実際には対称暗号に切り替わりますが、それは質問には関係のない詳細です。

[3]おそらく、CAは実際に、証明書に署名する前に本人を確認します。彼らがそれをしなかった場合は、google.comの証明書を作成して、CAに署名するよう依頼するだけで済みます。その証明書があれば、google.comへの「安全な」接続を途中で仲介することができます。したがって、検証手順はCAの運用において非常に重要な要素です。残念ながら、この検証プロセスが世界中の何百ものCAでどれほど厳密であるかはあまり明確ではありません。

[4] Mozillaの信頼できるCAリストをご覧ください。


秘密鍵とは何ですか?
Koray Tugay 2013年

公開鍵は、最初にサーバーが暗号化したデータを暗号化するためにWebサイトに送信される証明書ファイルの一部であることを忘れていました。
mamdouhアラマダン2014年

@mamdouhalramadanに感謝します。私はそれを言及するために編集しました。
マークE.ハース2014年

2
@mamdouhalramadan「公開鍵は...データを復号化するためにWebサイトに送信されます」。公開鍵を使用してデータを復号化するにはどうすればよいですか?
テディ

@ateddyあなたは正しいです。できません。公開鍵は認証にのみ使用されます。ここでの鍵ペアは暗号化と復号化にも使用されるという主張は正しくありません。そのために、安全にネゴシエートされたセッションキーが使用されます。
ローンの侯爵

53

HTTPSはHTTPSSL(Secure Socket Layer)の組み合わせで、クライアント(ブラウザ)とWebサーバー(アプリケーションはここでホストされます)間の暗号化された通信を提供します。

なぜそれが必要なのですか?

HTTPSは、ネットワークを介してブラウザーからサーバーに送信されるデータを暗号化します。したがって、送信中にデータを盗聴することはできません。

ブラウザとWebサーバーの間でHTTPS接続はどのように確立されますか?

  1. ブラウザがhttps://payment.comへの接続を試みます
  2. payment.comサーバーが証明書をブラウザーに送信します。この証明書には、payment.comサーバーの公開鍵と、この公開鍵が実際にpayment.comに属しているという証拠が含まれています。
  3. ブラウザーは証明書を検証して、payment.comの適切な公開鍵があることを確認します。
  4. ブラウザは、ランダムな新しい対称鍵Kを選択して、payment.comサーバーへの接続に使用します。Kをpayment.com公開鍵で暗号化します。
  5. payment.comは、秘密鍵を使用してKを復号化します。これでブラウザと決済サーバーの両方がKを知っていますが、他の誰も知りません。
  6. ブラウザはいつでもpayment.comに何かを送りたいとき、それをKの下で暗号化します。payment.comサーバーは、受信時にそれを復号化します。payment.comサーバーがブラウザーに何かを送信したいときはいつでも、Kで暗号化します。

このフローは、次の図で表すことができます。 ここに画像の説明を入力してください


1
セッションキーの暗号化と送信、およびサーバーでの暗号化解除に関する部分は完全であり、完全にゴミです。セッションキーが送信されることはありません。セキュアキーのネゴシエーションアルゴリズムによって確立されます。このようなナンセンスを投稿する前に、事実を確認してください。RFC 2246.
Marquis of Lorne

手順4でランダムな新しい対称鍵Kを作成するのではなく、ブラウザーがデータをサーバーに投稿するときにサーバーの公開鍵を使用して暗号化しないのはなぜですか?
KevinBui 2017年

1
@KevinBuiサーバーから応答を送信するには、クライアントにキーペアが必要であり、非対称暗号化は非常に遅いためです。
ローン侯爵

3

このプロセスについて簡単に説明した小さなブログ投稿を書きました。お気軽にご覧ください。

SSLハンドシェイク

同じ小さなスニペットは次のとおりです。

「クライアントはHTTPS経由でサーバーにリクエストを送信します。サーバーはSSL証明書と公開鍵のコピーを送信します。ローカルの信頼できるCAストアでサーバーのIDを確認した後、クライアントは秘密のセッションキーを生成し、サーバーの公開を使用してそれを暗号化しますサーバーは秘密鍵を使用して秘密セッションキーを復号化し、クライアントに確認応答を送信します。安全なチャネルが確立されました。」


「ローカルの信頼できるCAストアでサーバーのIDを確認した後」-これは厳密には当てはまりません。自己署名証明書を使用でき、HTTPSが機能しますサーバーへの安全なHTTPS接続を取得できます。信頼できる証明書が届くのは、適切なサーバーと通信していることを確認したい場合のみです。
テディ

セッションキーの暗号化と送信、およびサーバーでの暗号化解除に関する部分は完全であり、完全にゴミです。セッションキーはまったく送信されません。安全なキーのネゴシエーションアルゴリズムを介して確立されます。このようなナンセンスを投稿する前に、事実を確認してください。RFC 2246.
Marquis of Lorne

@テディ不正解です。証明書信頼チェックはSSLの必須部分です。バイパスすることはできますが、通常は有効です。自己署名証明書は、何らかの特別な手段がないと機能しません。
ローンの侯爵

2

Mehaaseはすでに詳細に説明しています。このシリーズに2セントを追加します。SSLハンドシェイクと証明書を中心に多くのブログ投稿があります。これのほとんどはIIS Webサーバーを中心に展開していますが、この投稿は依然として一般的なSSL / TLSハンドシェイクに関連しています。あなたの参照のためにここにいくつかあります:

CERTIFICATESSSLを1つのトピックとして扱わないでください。それらを2つの異なるトピックとして扱い、それらが連携して動作する人を確認してください。これは、質問への回答に役立ちます。

証明書ストアを介した通信当事者間の信頼の確立

SSL / TLS通信は、信頼のみに基づいて機能します。インターネット上のすべてのコンピューター(クライアント/サーバー)には、維持しているルートCAと中間CAのリストがあります。これらは定期的に更新されます。SSLハンドシェイク中に、これは信頼を確立するための参照として使用されます。たとえば、SSLハンドシェイク中、クライアントがサーバーに証明書を提供するとき。サーバーは、証明書を発行したCAがCAのリストに存在するかどうかを確認しようとします。これを実行できない場合は、証明書チェーンの検証を実行できなかったことを宣言します。(これは答えの一部です。また、AIAを調べますこのため。)クライアントは、Server Helloで受信するサーバー証明書に対しても同様の検証を行います。Windowsでは、PowerShellを介してクライアントとサーバーの証明書ストアを確認できます。PowerShellコンソールから以下を実行します。

PS証明書:> ls場所:CurrentUser StoreNames:{TrustedPublisher、ClientAuthIssuer、Root、UserDS ...}

場所:LocalMachine StoreNames:{TrustedPublisher、ClientAuthIssuer、Remote Desktop、Root ...}

FirefoxやOperaなどのブラウザは、証明書の管理を基盤となるOSに依存していません。独自の証明書ストアを保持しています。

SSLハンドシェイクは、対称暗号と公開鍵暗号の両方を使用します。サーバー認証はデフォルトで行われます。クライアント認証はオプションであり、サーバーエンドポイントがクライアントを認証するように構成されているかどうかによって異なります。これについて詳しく説明したので、ブログの投稿を参照してください。

最後にこの質問について

HTTPSプロトコルはどのように証明書を認識しますか?すべての信頼/暗号化/認証が機能する証明書であるにもかかわらず、HTTPが証明書で機能しないのはなぜですか?

証明書は、X.509標準でフォーマットが定義されているファイルです。これは、通信相手の身元を証明する電子文書です。 HTTPS = HTTP + SSLは、2者が相互に通信する方法に関するガイドラインを定義するプロトコルです。

詳しくは

  • 証明書を理解するには、証明書とは何かを理解し、証明書管理について読む必要があります。これらは重要です。
  • これを理解したら、TLS / SSLハンドシェイクに進みます。これについてはRFCを参照してください。しかし、それらはガイドラインを定義する骨組みです。これを詳細に説明する私のブログ記事を含むいくつかのブログ投稿があります。

上記のアクティビティを実行すると、証明書とSSLについて十分に理解できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.