HTTPS(SSL)の仕組みとセキュリティについて

このQ&Aのポイント
  • HTTPS(SSL)の仕組みとセキュリティについての質問です。SSLについて正しく理解できているか分かりません。質問をいくつかしています。
  • SSLはHTTP上での通信を暗号化するための仕組みであり、HTTPS通信を実現します。証明書の発行や検証手順、オレオレ証明書の通信可能性などについて質問しています。
  • 質問の内容は、オレオレ証明書による通信の可否、証明書の暗号化されていない部分、IssuerとSubjectの偽装可能性、証明書の偽装や検証方法、およびMITM攻撃についての対策などです。
回答を見る
  • ベストアンサー

HTTPS(SSL)の仕組みとセキュリティについて

SSLの仕組みと,そのセキュリティについての質問です. 現在,HTTPSで利用するSSLの仕組みについて勉強をしています. しかしながら, 自身がSSLの仕組みについて正しく理解できているか分かりません. また,どうしても理解ができない点が何個かあり,質問させて頂く次第になりました. (様々な書籍やwebを拝見したのですが,いづれも腑に落ちませんでした...) そのため,まず大まかに私が理解しているHTTP上のSSLの仕組みを書き,最後に質問を書かせて頂こうかと思います. 長くなりますが宜しくお願い致します. ■主な登場人物 ・認証局  CA秘密鍵  CA証明書(公開鍵?)  CA証明書発行要求  ・証明書  KEYファイル(秘密鍵/公開鍵)  CSRファイル/申請書(issuer側の情報/公開鍵)  CRTファイル/サーバー証明書(CSRを認証局の秘密鍵で捻ったモノ) ■証明書の発行 1-1.証明書を発行したい者がCSRファイルという申請書を作成し,認証局に送ります.    →CSRには登録情報(issuer)やサーバー(証明書を発行したい者)の公開鍵などが含まれます. 1-2.認証局はCSRファイルが適切であれば,署名(subject)し,認証局の秘密鍵でCSRの中の公開鍵のみを暗号化します. 1-3.これがCRTファイルになり,証明書を発行したい者に送り返されます. この時,サーバー(証明書を発行した者)は認証局によって署名されたCRTファイルを持っています. 次にこれを利用したHTTPS通信について書きます. ■HTTPS通信 2-1.クライアントがサーバーに通信要請をします. 2-2.サーバーは証明書(CRT)をクライアントに送ります. 2-3.クライアントは送られてきたCRTが信頼できるか認証局の証明書(公開鍵)を使って検証します.    →CRTに埋め込まれているサーバーの公開鍵は認証局の秘密鍵によって暗号化されているので,これを認証局の公開鍵で複合化します.    →認証局の公開鍵はルート証明書といい,事前にブラウザに組み込まれているものとします. 2-4.クライアントは共通鍵を発行します. 2-5.クライアントはCSRから複合化したサーバーの公開鍵を用い,自身で発行した共通鍵を暗号化してサーバーに送ります 2-6.サーバーは受け取った暗号データを自身の持つ秘密鍵で複合化し,共通鍵を取得します. 2-7.後はこの共通鍵でデータを暗号化し通信します, ■質問 1.オレオレ証明書+認証局の場合でも正常に通信ができるのはなぜか 私の理解だと2-3で,クライアントが認証局の公開鍵を用い,サーバーの証明書からサーバーの公開鍵を複合化し,それを元に共通鍵を暗号化しています. これはクライアントが認証局のルート証明書(公開鍵)を保有しているから複合化できるはずです. オレオレ証明書の場合は,認証局の公開鍵がクライアントにインストールされていません. そのため,サーバーの公開鍵を複合化できず,共通鍵の生成に失敗し,通信できなくなると思います. しかしながら,ブラウザは「署名が不明な接続先です」とのエラーを出すだけで,通信(接続)ができてしまいます. なぜでしょうか. 2.IssuerとSubjectは暗号化されていないのか 私の理解だと1-2の認証局では,サーバーの公開鍵しか暗号化されていません. ということはIssuerとSubjectは暗号化されていないということでしょうか. また,それはなぜでしょうか. 3.IssuerとSubjectは偽装できるか opensshを用いることで認証局を構築することができます. この時に,Subjectの設定をベリサインの認証局と全く同じようにし, 証明書も,ベリサインの認証局を使っているサイトのIssuerと全く同じようにした場合, SubjectとIssuerが全く同じ証明書ができると思います. この場合は,本物の証明書と同様の証明書を複製できてしまうのでしょうか. できないとは思いますが,それはなぜでしょうか. 4.証明書の偽装は可能か ブラウザから証明書の情報を見ることができます.もちろんbyteデータのraw certificateも見ることができます. この情報を丸々コピーし,全く異なるサーバーに証明書として読みこませて通信した場合は, 署名されてしまうのでしょうか. されないとは思いますが,それはなぜでしょうか. (例えば,URL=CN情報が異なっているから確認できるとか..?それならCN情報だけ書き換えてしまえばいい?) 5.証明書の検証をするにはどうしたらよいか 証明書を検証をするには,その証明書を発行した認証局の公開鍵を利用するしかないのでしょうか. 例えば,サーバー証明書(CRT)のフィンガープリントsha1データを事前に保持さえしていれば, サーバーに証明書を示された際にCRTのフィンガープリントを比較すれば,特定のサーバーかどうか検証できるか・・? 6.MITMについて MITM攻撃により,証明書が途中で書きかわることが考えられます. この場合は,書き換わった証明書をどのように特定すればいいのでしょうか. 例えば,認証局のルート証明書がないなどが考えられますが, 仮に,Rapid SSLなどで署名されている証明書でMITM攻撃がされた場合どうなるでしょうか? この場合は,Issuerなどを比較するしかないように考えられます. しかし,Issuerはcsr申請の際にうまいこと,書き換えることができてしまいます. そう考えると,どのような対策ができるでしょうか フィンガープリントなどで比較することになるのでしょうか, フィンガープリントは偽装することができないのでしょうか. 以上となります. 様々な質問を書いてしまい,申し訳ありません 説明不足で乱文だとは思いますが, 分かる範囲でお答え頂けませんでしょうか. 宜しくお願い致します.

質問者が選んだベストアンサー

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5071/13248)
回答No.1

1) 認証局はサーバの公開鍵を暗号化してCRTファイルに書き込みません。電子署名を付けているだけです。 そもそも公開鍵暗号では、秘密鍵で暗号化したモノを公開鍵で複合することはできません。 これが可能になってしまうと公開鍵が有れば暗号の復号が誰でも出来ることになってしまい、暗号の意味がなくなってしまいます。 http://itpro.nikkeibp.co.jp/article/COLUMN/20071012/284426/?ST=selfup オレオレ証明書が成立するのは、あくまでも署名の検証が出来ないと言うだけで、サーバの公開鍵は受け取れるので、共通鍵を暗号化してサーバに送付する事が出来るからです。 2) 1の回答の通りCSRの内容は暗号化されていませんので、CSR中身は見えます。 3) CRTファイルに書かれている内容を書き換えると、署名を検証した時に不一致が発生するので書き換えられた証明書である事がバレてしまいます。 4) いくら証明書をコピーしたとしても、秘密鍵がなければ公開鍵で暗号化されたデータを復号できません。 復号できないデータがサーバに送られてきても通信は成立しません。 5) CRTは公開情報なので誰でも複製が可能です。その内容だけを信用しても相手が正しいサーバであることの証明にはならないでしょう。

gumiyui
質問者

お礼

理解できました! 本当にありがとうございます.

関連するQ&A

  • 自己署名証明書によるSSL通信について教えてください!

    SSL通信により、データを暗号化してWeb上でやりとりするシステムの構築を考えています。 そこで自己署名というのを考えているのですが、署名の流れがいまいち分かりません。 認証局利用の場合、私の理解では、 【サーバ側】 1.サーバ側でRSA秘密鍵を生成 2.RSA秘密鍵を元にCSRを作成 3.CSRファイルを認証局に送信 【認証局】 4.CA秘密鍵により暗号化し、サーバ証明書を作成 5.サーバ側にサーバ証明書を送信 【サーバ側】 6.クライアント側にサーバ証明書を送信 【クライアント側】 7.サーバ側よりサーバ証明書を受信する 8.認証局より公開鍵を取得する 9.認証局の公開鍵でサーバ証明書の暗号化された鍵(認証局の秘密鍵で暗号化されたもの)を復号する 10.復号した鍵により、サーバ証明書の暗号文を復号する となります。(間違いがある場合はご指摘下さい) では、自己署名を行う場合はどうなるのでしょうか? 単純にサーバ証明書を自分で作成すると考えてよろしいのでしょうか? CSRファイルの作成などもやはり行うのでしょうか? クライアント側の流れは変わらないのでしょうか? また、この操作は接続毎に毎回行うことになるのでしょうか? (秘密鍵、サーバ証明書は毎回変わるのでしょうか?) 初歩的な質問とは思いますが、よろしくお願いいたします。

  • SSLによる電子証明書交換のセキュリティについて

    SSLを勉強しております。 私の今の解釈ではSSLによる電子証明書の交換手順は 以下のようなイメージです。 (1)[データの方向:クライアント → サーバー] <ClientHello>  マスターキーのための乱数  今からの暗号通信に用いる暗号方式のリスト  などをサーバーに送信。 (2)[データの方向:サーバー → クライアント] <ServerHello>  選んだ暗号方式 マスターキーのための乱数 <ServerCertificate>  サーバーが保持するサーバー証明書  サーバーが保持するルートCA証明書 <CertificateRequest> <ServerHelloDone>  ・  ・  ・ 次にClientCertificateが送られてきて・・という感じですが、ここまででわからない点があります。 以下に質問を挙げます。 [質問] 手順(2)においてサーバーは電子証明書をクライアントに送るわけですが、参考書を読んでいる限りでは証明書データは暗号化せずにそのまま生データを送るような説明でした。  もしそうだとすればパケットキャプチャさえすれば証明書をそっくりそのまま盗まれることになりますので考えにくいのですがどうなのでしょうか?  暗号化されているなら「何の鍵」で暗号化されているのでしょうか? クライアントの公開鍵は(2)のタイミングではまだ知らないのでクライアントの公開鍵ではないと思いますが。 長くなってすいません。 わかりにくければ補足します。 よろしくお願いします。

  •  PKIについて、

     PKIについて、 http://www.atmarkit.co.jp/fsecurity/special/02fi … の記載で、これまでの理解と一見異なると思われる事項があります。  まず 「認証局用のソフトウェアさえ購入すれば、だれでも証明書を発行できる」とありますが、 認証局は階層型の認証構造をしているのが一般的であることとの関係は、 どう理解したらよいのでしょうか? そもそも、認証局を(一般に)誰が運営しているのか(特に、ルート証明機関)ということも気になります。 リポジトリとの関係もわかりません。。  また、「(証明書は、)信頼できる認証局が発行したことさえ確認できれば    (正確には期限などの確認も必要だが)、入手経路がどうであれ、その証明書は信頼できる」とあります。 ここでいう証明書は、クライアントがデータのやりとりをしたいサーバが発行する、 認証局によって暗号化されたサーバ証明書ではなく、 当該暗号化を行っている認証局が発行する暗号化のための公開鍵であると思われますが、 その場合、当該公開鍵(3行前の「ここでいう証明書」)の発行元は、認証局から発行される(又は発行されたものをローカルに保存してある)わけで、 どこかを経由して入手するものではないと思われるのですが、いかがでしょうか?  よろしくお願いします。

  • 自己署名証明書(オレオレ証明書)の暗号化について

    SSL暗号化通信の仕組み自体は,下記URLの通りとして把握しております. (1*) http://www.twsvc.com/about_ssl (2*) http://www.ibm.com/developerworks/jp/websphere/library/web/web_security/pdf/2_6.pdf これを,オレオレ証明書を用いた暗号化通信で考えると,セキュリティに関する識者である高木氏は,自分の日記にて以下のように書いています. >共通鍵暗号による暗号化通信をしています。鍵は一緒に配送します。この暗号は正常に機能しているでしょうか? >「今の話は共通鍵暗号じゃなくて公開鍵暗号だろ」って? オーケー、では、次の比較に対してどう答えるか。 >1.共通鍵暗号による暗号化通信 >2.公開鍵暗号による暗号化通信で認証なし(認証検証時の警告を無視する使用形態) >3.公開鍵暗号による暗号化通信で認証あり (略) >では、1.と 2. を比べたときはどうか。「3.ほどではないが 1.よりは 2. の方がまし」と言えるだろうか? それは誤りである。 (略) >公開鍵暗号の公開鍵がいっしょに配送されている暗号化通信では、傍受点で、流れてきた鍵を、別途用意した自作鍵に差し替えて流してしまえば、それで暗号化されて戻ってくる暗号文を復号できる。 ※詳細は,高木氏の「PKIよくある勘違い(1)「オレオレ証明書でもSSLは正常に機能する」」をご参照ください. ここで,疑問になるのが,”傍受点で、流れてきた鍵を、別途用意した自作鍵に差し替えて流してしまえばいい”という点です. オレオレ証明書では,ルート証明書にたどり着けないため,ブラウザはオレオレ認証局の公開鍵をもっていない. そのため,サーバ証明書内の公開鍵を取得できない. だから,サーバ証明書送付時にオレオレ認証局の公開鍵を送付する必要がある. オレオレ認証局の公開鍵を用いて,サーバ証明書から公開鍵を抜き出す もしこのとき,オレオレ認証局の公開鍵が自作鍵に置き換えられたとしても,ただ単にサーバ証明書から公開鍵を抜き出すことができず,そこで通信が終了すれば”それで暗号化されて戻ってくる暗号文を復号できる”ことも無いように思えるのですが,いかがでしょうか. (つまり,高木氏の言う差し替えた自作鍵でサーバ証明書内の公開鍵が取得できるかどうか) これができなければ,確かに暗号化通信(というか通信そのもの)自体は破綻していますが,高木氏の懸念しているような「重要な情報の流出」にはつながらないように思えます. 乱文になってしまいまして申し訳ありません. もし,私自身に勘違いや解釈違い等ありましたら,ご指摘いただけると幸いです. よろしくお願いします.

  • SSLの仕組みについて整理したい事

    本を読んでると 色々用語が出て何か混乱してるのですが・・・ 単純に・・・と言うか要約すると サーバー側で秘密鍵・証明書を作って 証明書は信頼できるクライアントに配布して クライアントはそれなりソフトを開いて(例えばSSLもできるFTPソフト) 証明書を使ってアカウント入力し、データを送信 で、サーバー側で秘密鍵で開ける・・・って手順なんでしょうか? 一つの本には単純に秘密鍵作成と証明書作成だけ書いてて もう一つの本は詳しく?掘り下げて サーバ証明書・サーバ公開鍵・サーバ秘密鍵・証明局公開鍵 とかあって、何だか判り辛いです・・・ サーバ証明書が公開鍵にあたるのかと思ってました (データの開け閉めに対して鍵はペアだから、やりとりするのに3つ以上も必要なんでしょうか???) ちなみに サーバ・CENTOS 6 と クライアント・WINDOWS 7 でやってます イマイチイメージがしにくいです よろしくお願いします

  • ■HTTPS通信の時の証明書について。■

    <構成図> 端末PC----WAN----Server(SSL,CA,WEB) <条件> 自己認証局(CA)により、https通信を検討しています。 認証方法としては、 1.サーバ証明書を利用する(URLのSection1)方法と 2.クライアント証明書を利用する(URLのSection2)があります。 <参考URL> http://park15.wakwak.com/~unixlife/practical/openssl.html ■質問1 端末PCから、Serverに通信するとき、 1.サーバ証明書の方法ですと、端末PCにサーバ証明書を入れなくても、 警告がでるが、通信はできそうですが、 2.クライアント証明書の方法も、端末PCにクライアント証明書をいれなくても、 警告がでるが、通信はできますか? ■質問2 上記の例だと、自己認証局(CA)による<条件>ですが、 外部CA認証局を利用する場合も、 1.サーバ証明書、2.クライアント証明書の方法ともに、 警告がでるが、通信はできるのでしょうか? 宜しくお願いします。

  • サーバ証明書等の正当性の確認について。

    サーバ証明書、証明書には、 認証局の署名をSHA-1等のハッシュ関数で、 ハッシュ化されたハッシュ値を、 認証局の秘密鍵で暗号化された認証局の電子署名が付加されていると思いますが、 その部分の信頼性についてですが、 認証局から、 公開鍵を取り寄せて、 ハッシュ値を取り出すと思うのですが、 もともとの平文(署名)を認証局から取り寄せることは可能でしょうか。 認証局の公開鍵で復号できたから、 認証局の秘密鍵で暗号化されているといえるのですが、 もともとの署名が何かがわかりません。 (ちょっと信頼性にかけるような気がします。) 署名を取り寄せることができれば、 署名をSHA-1等を使って、 ハッシュ値を取り出して、 公開鍵で復号したハッシュ値と比較することができます。 公開鍵と平文(署名)を取り寄せることはできないのでしょうか。

  • SSHのホスト認証について

    現在VineLinux3.2を使ってサーバの勉強をしている、ド素人です。 SSHのユーザ認証が、 (1)サーバ側で乱数生成→クライアントの公開鍵で暗号化→ (2)クライアントに送信→ (3)クライアントが受信→ (4)秘密鍵で複合化→サーバに送信→ (5)サーバはクライアントから送られた乱数を確認して認証 という流れで、なるほど、これでユーザを認証できるってのは分かるのですが、 ホスト認証がよくわかりません、 SSHでサーバにアクセスすると、 サーバの公開鍵が ~/.ssh/knows_hosts に登録されますが、 この公開鍵を使って、ユーザ認証と同じ方法で接続先ホストを認証してるのでしょうか? そうだとしたら、 2度目のアクセスからはホストを認証するのに、 この~/.ssh/known_hostsの 公開鍵を使った方法が有効だというのは分かりますが、 一番最初のアクセスではこの公開鍵を使ってもホストの認証は出来ないと思うのですが(接続先から送られてくる公開鍵を使うだけなので) どういう仕組みになってるのでしょうか? よろしくおねがいします。

  • 下の3つの問題がわからず困っています。知っています方アドバイス下さい。

    下の3つの問題がわからず困っています。知っています方アドバイス下さい。 (1)認証局がWebサーバを運営している会社に交付されている電子証明書に入ってる公開鍵は、認証局の公開鍵である? (2)利用者がWebサーバーを運営する会社の正当性を確認するには、認証局の公開鍵を使う? (3)利用者から送られてきた暗号化された共通鍵は、Webサーバ側の秘密鍵を使って解読している? 自分なりの考えは(1)は正解だと思います。認証局は公開鍵を管理する組織だと思います。 (2)も正解だと思います。理由はなんとなくしかわからないので詳しく知っている方いましたら、できれば解説お願いいたします。 (3)これも正解だと思います。共通鍵は秘密鍵を使って解読してると思ったのですが・・・・できればこれも解説お願いいたします。 SSL通信について勉強不足で恥ずかしいのですが、このような問題がわかります方からのアドバイスをいただきたいと思います。 よろしくお願いいたします。

  • SSLの公開鍵をCAから取得できる?

    SSLの通信を確認しているのですが、 クライアントPCとサーバがSSLで通信する場合、公開鍵をサーバから クライアントPCは取得しているようですが、CAからは取得できないのでしょうか? ブラウザにルート証明書がインストールされていないCAなら、 公開鍵をCAに要求し取得するものだと思っていましたが、 そうではないのでしょうか?ググっても明確な情報がでてきませんでした。ぜひご教示宜しくお願い致します。