快速版问题
Gmail,TD(加拿大银行),皇家银行(加拿大银行)都使用ssl . 当你检查他们的证书时,他们都有
Common Name (CN) mail.google.com
或者更一般地说:
Common Name (CN) <url>
这是否需要防止中间人攻击?
摘要
JBoss允许客户端和服务器使用证书和ssl进行身份验证 . 有一点似乎很奇怪,你不需要在证书上提供你的主机名 .
我认为这意味着如果服务器B在您的信任库中,Sever B可以伪装成他们想要的任何服务器 .
(同样地:如果客户B在您的信托商店......)
我在这里错过了什么吗?
验证步骤
Client Server
=================================================================================================
1) Client sends Client Hello
ENCRIPTION: None
- highest TLS protocol supported
- random number
- list of cipher suites
- compression methods
2) Sever Hello
ENCRIPTION: None
- highest TLS protocol supported
- random number
- choosen cipher suite
- choosen compression method
3) Certificate Message
ENCRIPTION: None
-
4) ServerHelloDone
ENCRIPTION: None
5) Certificate Message
ENCRIPTION: None
6) ClientKeyExchange Message
ENCRIPTION: server's public key => only server can read
=> if sever can read this he must own the certificate
- may contain a PreMasterSecerate, public key or nothing (depends on cipher)
7) CertificateVerify Message
ENCRIPTION: clients private key
- purpose is to prove to the server that client owns the cert
8) BOTH CLIENT AND SERVER:
- use random numbers and PreMasterSecret to compute a common secerate
9) Finished message
- contains a has and MAC over previous handshakes
(to ensure that those unincripted messages did not get broken)
10) Finished message
- samething
Sever知道
-
客户端具有已发送证书的公钥(步骤7)
-
客户的证书有效,因为:
-
它已由CA签署(verisign)
-
它已经自签名但它在服务器的信任库中
-
这不是重播攻击,因为可能随机编号(步骤1或2)与每条消息一起发送
客户知道
-
服务器具有已发送证书的公钥(步骤6,步骤8)
-
服务器的证书有效,因为:
-
它已由CA签署(verisign)
-
它已经自签名但是它在客户端的信任库中
-
这不是重播攻击,因为可能随机编号(步骤1或2)与每条消息一起发送
潜在问题
-
假设客户端的信任库中有证书:
-
服务器A.
-
服务器B(恶意)
-
服务器A的主机名为www.A.com
-
服务器B的主机名为www.B.com
-
假设:客户端尝试连接到服务器A,但服务器B启动中间人攻击 .
-
自服务器B:
-
具有将发送给客户端的证书的公钥
-
有"valid certificate"(信任库中的证书)
-
以及:
-
证书中没有主机名
看起来服务器B可以轻易地伪装成服务器A.
有什么东西我不见了吗?
2 回答
你能否指出一些文字说JBoss不需要证书中的主机名,或者只是你的观察?我假设'主机名'是指公用名(CN)或专有名称(DN)?
通常,应用程序应检查X.509证书:
有效日期范围
用法(例如;服务器验证)
链接到受信任的根
CN ==目标主机的DNS名称(可能是另一个名称,而不仅仅是DNS)
未撤销(使用CRL或OCSP)
从技术上讲,一个应用程序可以选择忽略这些中的任何一个,只是表明一切都与证书相关......但这很糟糕:)
我想你错过了一些东西,但我不确定我是否理解你的理由 .
但是,当服务器B试图在中间攻击中启动一个人时,你说它有一个公钥 . 这是事实,但是要设置ssl连接,您还应该拥有属于该公钥的私钥 . 此外,使用的证书与dns名称(在https的情况下)相关联 . 所以客户试图连接到A,他在www.a.com上输入 . 由于我们假设B不知道A的私钥,他将拥有另一个密钥对 . 他永远无法从主要CA获得有效(即可信)证书,该证书与他不拥有的域相关联 .
因此,B永远无法获得通用名称www.A.com的证书,因此,B无法在中间攻击中执行任务 .