- PR -

SSL暗号化は本当に安全なの?

投稿者投稿内容
tot
会議室デビュー日: 2002/12/18
投稿数: 2
投稿日時: 2002-12-18 15:03
クレジットカード番号等の個人情報を入力するページで
「SSL128bit通信するので安全です」という表示をよく見るのですが、本当に暗号化されているのでしょうか?

SSLに関する技術資料をみるとベリサイン等で証明書が必要で、秘密鍵・公開鍵...等々の説明がなされています。
ということは、証明書をとっていない場合。暗号化はできないのでは?
逆にできるならば、どうやって暗号化しているのですか?


わらび
ベテラン
会議室デビュー日: 2002/08/30
投稿数: 53
投稿日時: 2002-12-18 16:39
証明書は自分で作ることが出来ます。

個人サイトでは、そうしているところもありますね。
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2002-12-18 16:58
SSL通信の場合、以下のような手順になります。
1.公開鍵の交換。
2.別に共有鍵を作って、交換した公開鍵で確認しあう。
3.共通鍵で通信を暗号化する。

実際の通信には効率の良い共通鍵を使います。で、その共通鍵を決める時に使われるのが公開鍵・秘密鍵です。この公開鍵を無事に交換することができれば、共通鍵が他の誰かにばれることがなくなり非常に安全な通信ができます。逆に、この公開鍵がワルモノ君によって改ざんされると、暗号化されていたとしてもその後の通信はすべて危険です。


通信が無事である事を保障するには1番が無事に行われたことを確認する必要があり、1番が無事に行われたのを確認するのに証明書が必要になります。つまり、証明書は1番でお互いに交換し合った公開鍵が正しいものであるということを第三者が証明するためのものです(したがってその後の通信は安全)。実際の暗号化には使われていません。証明書がなくても暗号化通信はできますが、1番のステップが安全に行われた保障はされません(したがってその後の通信は安全でない可能性がある)。

証明書を発行する第三者で有名なのがベリサインですが、わらびさんが言われたような自分で作るプライベート証明書というのでもある程度の安全性があります。

証明書がなくても暗号化はされます。が、安全かどうかはわかりません。

参照:
「How SSL Works」 Netscape
http://developer.netscape.com/tech/security/ssl/howitworks.html

[ メッセージ編集済み 編集者: H2 編集日時 2002-12-18 17:04 ]
tot
会議室デビュー日: 2002/12/18
投稿数: 2
投稿日時: 2002-12-19 12:36
回答ありがとうございました。

>証明書がなくても暗号化はされます。が、安全かどうかはわかりません。
この部分は理解できました。

>その共通鍵を決める時に使われるのが公開鍵・秘密鍵です。

共通鍵を作る部分がポイントですね。
共通鍵をつくる部分・受渡をする部分をもうすこし詳しく教えてください。
こちらの理解を加えながらH2さんの説明にそってゆくと..

case1)通信する人をA,Bとします。お互い公開鍵をもっている場合
  自分(A)              相手(B)
1.(B)から公開鍵(B)をもらう      (A)から公開鍵(A)をもらう
[この時点でもっているもの]
公開鍵(A)、公開鍵(B)、秘密鍵(A) 公開鍵(A)、公開鍵(B)、秘密鍵(B)
2.             共通鍵作成
共通鍵を公開鍵(B)により暗号化 共通鍵を公開鍵(A)により暗号化
暗号化した共通鍵を(B)に送信 暗号化した共通鍵を(A)に送信
秘密鍵(A)により解読        秘密鍵(B)により解読
           共通鍵が同じであることを確認
3.通信内容を共通鍵で暗号化    通信内容を共通鍵暗号化
(B)に送信             (A)に送信
4.暗号化された内容を解読       暗号化された内容を解読

疑問1)公開鍵・秘密鍵があれば、共通鍵は一意に決まるのですか?
疑問2)共通鍵は、AB双方で生成するのですか?それとも一方のみ?
疑問3)4.で暗号化された内容を解読するのは、共通鍵で行うのですか?
    そうすると、共通鍵は暗号と解読両方で使用することになりますね?


case2)通信する人をA,Bとします。Aが公開鍵をもっていない場合
H2さんの説明にそってゆくと..
  自分(A)              相手(B)
1.(B)から公開鍵(B)をもらう      (A)から公開鍵(A)がない。
[この時点でもっているもの]
公開鍵(B)            公開鍵(B)、秘密鍵(B)
2.             共通鍵作成
共通鍵を公開鍵(B)により暗号化 共通鍵を???により暗号化
暗号化した共通鍵を(B)に送信 暗号化した共通鍵を(A)に送信
???により解読          秘密鍵(B)により解読
           共通鍵が同じであることを確認
3.通信内容を共通鍵で暗号化    通信内容を共通鍵暗号化
(B)に送信             (A)に送信
4.暗号化された内容を解読       暗号化された内容を解読

疑問4)公開鍵(A)がない場合、共通鍵が暗号化できない?
    ネットワークに共通鍵が流れてしまう?
疑問5)IE6はSSL通信をする際、公開鍵(A)がない場合。
    なにか他の鍵で暗号化しているのですか?
    もしくは暗号化なしで、プレーンで共通鍵のやりとりをしているのですか?

以上よろしくお願いします。

ヒデ
ベテラン
会議室デビュー日: 2002/12/12
投稿数: 76
お住まい・勤務地: 横浜
投稿日時: 2002-12-19 16:09
>クレジットカード番号等の個人情報を入力するページで
 HTTPS で、閲覧する商用サイトの話だと思いますので、
 PC(クライアント)と商用サイト(サーバ)の通信の話とさせたいただきます。

>共通鍵を作る部分がポイントですね。
 詳しい説明は省略しますが、
 クライアントからサーバに接続するとき、
 サーバー側から公開鍵が送られてきます。
 クライアント側では、ブラウザが共通鍵のもととなる乱数を発生させ
 サーバーから送られてきた公開鍵で暗号化し、送付します。
 以下は、サーバ・クライアント間では、共通鍵で暗号化して通信します。

>通信する人をA,Bとします。Aが公開鍵をもっていない場合
 サーバー側は、必ず公開鍵(証明書)が必要です。
 自分で認証局を立てて公開鍵は自作でききるようですが、
 認証局があらかじめブラウザに登録された局でない場合は
 クライアント側で警告が出るようです。
H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2002-12-19 17:12
> >証明書がなくても暗号化はされます。が、安全かどうかはわかりません。
>この部分は理解できました。
少し誤解のある言い方でした。SSLにおいて証明書は必ず必要です。ただ、証明書は公開鍵と秘密鍵があればすぐに作れます。そういった証明書は自己署名証明書と言います。これは自分で自分は正しいぞ〜と言っているだけですので信憑性はありません。安全な通信を行うためにはプライベート認証局か、正式な認証局によって署名された証明書が必要になります。

引用:

totさんの書き込み (2002-12-19 12:36) より:

case1)通信する人をA,Bとします。お互い公開鍵をもっている場合
  自分(A)              相手(B)
1.(B)から公開鍵(B)をもらう      (A)から公開鍵(A)をもらう
[この時点でもっているもの]
公開鍵(A)、公開鍵(B)、秘密鍵(A) 公開鍵(A)、公開鍵(B)、秘密鍵(B)
2.             共通鍵作成
共通鍵を公開鍵(B)により暗号化 共通鍵を公開鍵(A)により暗号化
暗号化した共通鍵を(B)に送信 暗号化した共通鍵を(A)に送信
秘密鍵(A)により解読        秘密鍵(B)により解読
           共通鍵が同じであることを確認
3.通信内容を共通鍵で暗号化    通信内容を共通鍵暗号化
(B)に送信             (A)に送信
4.暗号化された内容を解読       暗号化された内容を解読

case2)通信する人をA,Bとします。Aが公開鍵をもっていない場合
H2さんの説明にそってゆくと..
  自分(A)              相手(B)
1.(B)から公開鍵(B)をもらう      (A)から公開鍵(A)がない。
[この時点でもっているもの]
公開鍵(B)            公開鍵(B)、秘密鍵(B)
2.             共通鍵作成
共通鍵を公開鍵(B)により暗号化 共通鍵を???により暗号化
暗号化した共通鍵を(B)に送信 暗号化した共通鍵を(A)に送信
???により解読          秘密鍵(B)により解読
           共通鍵が同じであることを確認
3.通信内容を共通鍵で暗号化    通信内容を共通鍵暗号化
(B)に送信             (A)に送信
4.暗号化された内容を解読       暗号化された内容を解読



う〜ん、ちょっと違います。共通鍵は一つで良いので二人が作成する必要がありません。どっちかが作って相手に安全に渡せばよいのです。

AとBとの通信です。AがクライアントでBがサーバです。
コード:
A->B 「こんにちは」
B->A 「私はBです。これが私の証明書です」(認証局から署名された公開鍵付きの証明書を渡す)
A->B 証明書が改ざんされていないことを確認してから、「あなたがBである事を証明してください」(注1)
B->A "わたしはBです"というメッセージを自分の秘密鍵でデジタル署名して渡す。
   「わたしはBです(平文)3waiw83qijap3q95wiyla(デジタル署名)」
A->B 受け取った文のデジタル署名が正しいことを前に貰ったBの公開鍵で確認する。
   そして、ランダムな共通鍵を生成し、共通鍵をBの公開鍵で暗号化してから
   「共通鍵はawekahha;rehakja(暗号文)だよ」
B->A 受け取った暗号文を自分の秘密鍵を使って解読して、以後はその共通鍵を使う。


注1:Aは認証局の公開鍵を事前に持っているので、渡された証明書が正しい証明書であることが確認できる。

H2
ぬし
会議室デビュー日: 2001/09/06
投稿数: 586
お住まい・勤務地: 港
投稿日時: 2002-12-19 17:21
> 疑問1)公開鍵・秘密鍵があれば、共通鍵は一意に決まるのですか?
いいえ。共通鍵は公開鍵や秘密鍵とはまったく関係なく作られます。

> 疑問2)共通鍵は、AB双方で生成するのですか?それとも一方のみ?
一方のみです。共通なのでわざわざ二人が作る必要はありません。

> 疑問3)4.で暗号化された内容を解読するのは、共通鍵で行うのですか?
>    そうすると、共通鍵は暗号と解読両方で使用することになりますね?
そうです。共通鍵は公開鍵・秘密鍵と違い、暗号・解読の両方ができます。(公開鍵で暗号化されたものは秘密鍵でないと解読できない)

> 疑問4)公開鍵(A)がない場合、共通鍵が暗号化できない?
>    ネットワークに共通鍵が流れてしまう?
> 疑問5)IE6はSSL通信をする際、公開鍵(A)がない場合。
    なにか他の鍵で暗号化しているのですか?
    もしくは暗号化なしで、プレーンで共通鍵のやりとりをしているのですか?
上の書き込みを参照のこと
kei
会議室デビュー日: 2002/09/19
投稿数: 7
投稿日時: 2003-04-07 14:59
一般的には証明書は必要のようです。

ただ、正確な定義からするとSSLの規格では、証明書は必須ではありません。
鍵交換さえできれば構いませんので、安全な(ここで議論している安全ではなく、一般的な安全という意味です)暗号は可能です。

ただし、証明書がない場合にはサーバー認証が行えないことになります。
つまり、相手が詐称したWebサーバーを立てているときには
それを検知できません。

サーバーの実在性を明確にしなくてもよいFTPプロトコルではよく証明書なしSSLを使われているようですが。


[ メッセージ編集済み 編集者: kei 編集日時 2003-04-07 15:04 ]

スキルアップ/キャリアアップ(JOB@IT)