サーバ証明書の検証について

匿名さん  
(No.1)
あるサイトのサーバ証明書を使ってなりすまそうとした場合、どの段階で失敗するのか疑問に思い、以下の流れを考えました。
自分の認識が合っているか、ご回答いただきたいです。

①ある正規のサーバの証明書を取得し、偽サーバの証明書として設定する。
 偽サーバは正規のサーバに外観を寄せ、FQDNも同じものを用意する。
②クライアントがブラウザのURL欄に手打ちで入力し、偽サーバに接続する。(正規のサーバに接続していると思っている)
③TLSハンドシェイクにおいて、クライアント側でのサーバ証明書の検証が成功する。
 →デジタル署名を認証局の公開鍵で復号した値と、クライアント側でサーバ証明書をハッシュ化した値は一致するため
④TLSハンドシェイクにおいて、クライアント側で生成したプリマスタシークレットを(正規の)サーバの公開鍵で暗号化し、偽サーバに送信する。
⑤偽サーバは正規のサーバの秘密鍵を持っていないため、プリマスタシークレットを復号できない。
⑥そのためTLSハンドシェイクが失敗。クライアント側のブラウザでは警告画面が出る。結果、サーバの証明書を利用しただけでは正規のサーバになりすまして通信をすることができない。

よろしくお願いいたします。
2024.10.24 11:36
pixさん 
SC ダイヤモンドマイスター
(No.2)
すみませんが、前提条件があいまいのようです。
>①ある正規のサーバの証明書を取得し、偽サーバの証明書として設定する。
> 偽サーバは正規のサーバに外観を寄せ、FQDNも同じものを用意する。
攻撃者は正規の認証局からFQDNの同じ正規の証明書の発行を受けることはできません。

証明書の発行時にはそのドメインを所有しているかの検査が行われます。
これを一般的に「ドメインの使用権確認」といいます。
ドメインの使用権確認は最近では正規のDNSを所有しているかで判断されます。
DNSのTXTレコードに認証局から指定されたランダムな文字列を書き込みます。
認証局はTXTレコードを正引し、そのランダムな文字列が表示されることを
確認します。
これにより正規のドメインを所有していることを確認します。

攻撃者は正規のドメイン&DNSを所有していないため証明書が発行されることは
ないです。
2024.10.24 11:51
pixさん 
SC ダイヤモンドマイスター
(No.3)
補足です。
内容を簡潔にまとめます。

正規の認証局は、証明書申請者が所持していないドメインのFQDNの証明書は
発行してくれない。

そもそも正規の認証局が証明書の真正性を担保することによって、証明書の
安全性は確保されている。
2024.10.24 12:05
匿名さん  
(No.4)
>攻撃者は正規の認証局からFQDNの同じ正規の証明書の発行を受けることはできません。
①はブラウザから適当なサイトの証明書をダウンロードして取得、ということをイメージしていました。
ダウンロードした証明書を偽サーバに設定してクライアントとTLSハンドシェイクを開始すること自体は可能でしょうか?
2024.10.24 12:06
dsさん 
(No.5)
攻撃者はサーバ証明書に対応する秘密鍵を取得出来ないので、デジタル署名を作成できないので無理なのではないでしょうか
2024.10.24 12:11
pixさん 
SC ダイヤモンドマイスター
(No.6)
この投稿は投稿者により削除されました。(2024.10.24 12:15)
2024.10.24 12:15
pixさん 
SC ダイヤモンドマイスター
(No.7)
>ダウンロードした証明書を偽サーバに設定してクライアントとTLSハンドシェイクを
>開始すること自体は可能でしょうか?
この質問は過去にも何度かありました。厳密に解答するのはなかなか難しいです。
しかし、起こりうるケースとして解答します。

1.そもそもWebサーバが起動しない
 Apacheなどの正規のWebサーバは証明書と対になる秘密鍵が設定されていないと
 起動しません。
 そのため、正規の証明書を取得したとしても、秘密鍵が存在しないため、
 Webサーバが起動しないと想定されます。
 もし無理矢理にでもWebサーバを起動するのであれば、攻撃者が自作した
 海賊版Webサーバが必要になります。

2.共通鍵交換のフェーズで失敗する
 使用しているTLSのバージョンにも依存しますが、共通鍵交換時のプレマスタ
 シークレットの検証にデジタル署名をする流れだったと記憶しています。
 その際に、デジタル署名が作成できず、鍵交換が失敗します。
2024.10.24 12:15
匿名さん  
(No.8)
>dsさん、pixさん
仮にwebサーバが起動できたとしても、やはり共通鍵のところで失敗してしまう感じなのですね。
ご回答ありがとうございます。
2024.10.24 12:55
X8bWwさん 
(No.9)
この投稿は投稿者により削除されました。(2024.10.24 20:55)
2024.10.24 20:55
X8bWwさん 
(No.10)
面白い疑問だと思ったので、caddy(Webサーバー)を用いて実際に試してみました。

まず、通常のcaddyでは以下のようなエラーが出て起動しませんでした。
Error: loading initial config: loading new config: loading http app module: provision http: getting tls app: loading tls app module: provision tls: loading certificates: tls: private key does not match public key

エラーを発生させているコードをコメントアウトすると、起動するようになりました。

Chromeでアクセスしたときのエラー(※警告ではなく、普通につながらないときに出るような感じのエラー)
This site can’t provide a secure connection
example.com sent an invalid response.
ERR_SSL_PROTOCOL_ERROR

Firefoxでアクセスしたときのエラー(※警告ではなく、普通につながらないときに出るような感じのエラー)
Secure Connection Failed

An error occurred during a connection to example.com. Peer’s certificate has an invalid signature.

Error code: SEC_ERROR_BAD_SIGNATURE

curlのログ
curl: (35) OpenSSL/3.3.2: error:0A00007B:SSL routines::bad signature
2024.10.24 20:56
匿名さん  
(No.11)
>X8bWwさん
共有いただき、ありがとうございます。こちらは起動まではいくのですね。
(Apacheで試すとpixさんのおっしゃる通り起動しませんでした…)
2024.10.25 12:02
X8bWwさん 
(No.12)
> 共有いただき、ありがとうございます。こちらは起動まではいくのですね。
よく読んでください。起動していません。
チェックしているコードをコメントアウトすることで起動させています。
2024.10.25 14:16

返信投稿用フォーム

※SQL文は全角文字で記載してください。
※宣伝や迷惑行為を防止するため、当サイト、姉妹サイト、IPAサイト以外のURLを含む記事の投稿はできません。

投稿記事削除用フォーム

投稿番号:
パスワード:

その他のスレッド


Pagetop