user-0 提问: ssl协议是如何解决这 用户发的报文签名的？ 

回复:
user: user-1
content: 看不到 CA 是用来确认服务器身份的, 跟 密钥交换没关系么,  参与密钥交换的不管在啥时候都是服务器证书, 跟 CA 没关系 ...  那个提示是告诉你服务器是不可靠的.

user: user-0
content: 引用 12 楼 mLee79 的回复:IE6 缺省使用 SSL2 SSL3 , 现在一些服务器配置成了只支持 TLS 了,  IE6 当然就登不上.  你在 IE6里设置成使用 TLS应该就能连接了, 不过IE6应该只支持 TLS1.0, 不过你改抓包确认...  CA 是用来确认服务器身份的, 跟 密钥交换没关系,  按照规矩, CA证书不应该在互联网上传播.  你跟服务器的通讯仍然是 https 加密的, 但是服务器是不能信任的...    当我用其他浏览器访问邮箱，勾选了ssl项目，这个时候，又是什么协议？ http ? https ?   如果是后者， 由于公司自己做了个ca，自己搞证书，我的浏览器必须告警，似乎也没有提示我安装根证书。 按照大神的说话，它把网站的证书发到我计算机里，浏览器缓存了。 由于浏览器告警，”当我依然一意孤行“继续访问，这个时候，浏览器是什么行文？ 它如何获取到网站的公钥？   按照ssl的握手，它需要用网站公钥来加密”前主密钥“，然后发送给网站。  由于证书不信赖，我也没有安装不信赖的根证书，至少我没有点击根证书的操作。 没有安装根证书，那么如何完成这个ssl握手呢？

user: user-1
content: IE6 缺省使用 SSL2 SSL3 , 现在一些服务器配置成了只支持 TLS 了,  IE6 当然就登不上.  你在 IE6里设置成使用 TLS应该就能连接了, 不过IE6应该只支持 TLS1.0, 不过你改抓包确认...  CA 是用来确认服务器身份的, 跟 密钥交换没关系,  按照规矩, CA证书不应该在互联网上传播.  你跟服务器的通讯仍然是 https 加密的, 但是服务器是不能信任的...

user: user-2
content: 分析通信必须要抓包。

user: user-0
content: 引用 7 楼 mLee79 的回复:私钥应该永远不在互联网上传播,    正常的个人证书应该是    个人自己生产私钥 PKEY,  根据私钥填写信息后生成证书签名请求 CSR, 然后你把证书提交给 CA 签名生成证书,  得到证书后才是你自己用 私钥和证书打包成 PKCS#12 的个人  非常感谢兄台和楼下楼上的几个兄弟不厌其烦的回答。   昨晚又看了ssl的握手和通信。当然看归看，理论毕竟是理论。我喜欢试验性思考一些小问题。 希望大家别觉得我烦。   试验：   用古来的系统xp, 这机器很少装软件，登录某个公司邮箱，（某公司自己搞的邮箱,邮箱主页上出现coremail这个字），登录之前，我需要输入用户名和密码，密码这个编辑框下有个选项："ssl登录“。 我勾选了该选项，结果无法接入该邮箱。只好把该选项去掉。结果我们的古老的ie浏览器就进入了。 由于ie版本非常古老，不像现在的浏览器 会在网址输入框的左侧提示红色或者绿色。（注：红色是说明 该邮箱的证书不可靠）， 绿色（可靠）。  1. 证书是该公司自己做的，没有经过任何ca认证。那么为什么使用ie的时候，必须 去掉那个”ssl登录“选项才能进入系统。否则无法进入？  这个背后隐藏了什么知识？  你也许会问，因为ie强大。当ie 认为这个证书不可靠，所以无法使用ssl协议。 所以你登录不了，不奇怪。  2.  那么我换个浏览器试试， 这个浏览器从网上下载，新浏览器名字暂时不透漏， 我开始登录邮箱（默认勾选邮箱首页上的"ssl登录”）。 新浏览器登录进去了，网页左上角 出现红色告警（说明该证书不可靠,因为是公司自己给自己搞的一个证书）。  虽然提示不可靠，但我依然用ssl登录了进去了。 那么新浏览器，为什么可以登录呢？  3. 新浏览器访问邮箱的时候，按照ssl的理论， 会去下载服务器的数字证书，然后安装（因为没有根证书嘛）， 这一切是在后台进行，用户不知道。  那么我用certmsg.msc打开windows的证书表看看，到底有没有安装该证书。  打开后，没有发现有该证书的关键字。既然没有安装，那么浏览器无法获取该邮箱的公钥， 自然无法用ssl协议和服务器握手，获取到通信用的对称密钥。  请问： 新浏览器进入邮箱，是伪https?   3个问题，希望有高手指教一下。

user: user-3
content: 几个基本的东西要先弄清楚：  非对称加密，A/B为一对密钥，A加密，B解密，或者反过来。 如果把A/B密钥对给予公／私之分，那么私钥加密，公钥解密，这是签名（验证）；公钥加密，私钥解密，这是加密（安全传输）。 对于密钥，加上一些其它元信息，是以为证书；再加上证书链，是以为整个证书体系。  对称加密，双方持相同密钥，你加密我解密，反之亦然。  对于SSL/TLS，它其实分两个阶段： 协商阶段： 1、浏览器（客户端）验证服务器，要求严格的场景（比如网银），服务器也要验证客户端（所谓的双向认证）。 这里的验证，抛开证书的细节不谈，其实就是用的非对称加密中的“私钥加密，公钥解密” 2、通信双方协商出一个对称密钥，这里用到了“公钥加密，私钥解密” 通信阶段： 到此为止，双方应该相互信任（通过了认证），然后使用协商出来的对称密钥，对通信过程进行加密。

user: user-1
content: 私钥应该永远不在互联网上传播,    正常的个人证书应该是    个人自己生产私钥 PKEY,  根据私钥填写信息后生成证书签名请求 CSR, 然后你把证书提交给 CA 签名生成证书,  得到证书后才是你自己用 私钥和证书打包成 PKCS#12 的个人证书..  支付宝好像信不过大家的水平,   直接帮你生成私钥了..

user: user-1
content: 私钥应该永远不在互联网上传播,    正常的个人证书应该是    个人自己生产私钥 PKEY,  根据私钥填写信息后生成证书签名请求 CSR, 然后你把证书提交给 CA 签名生成证书,  得到证书后才是你自己用 私钥和证书打包成 PKCS#12 的个人

user: user-1
content: 支付宝的证书是 pkcs#12 的证书, 包含私钥和公钥, 并且私钥被标记为禁止导出.. 这个被服务器用来识别你的身份, 不用来做密钥交换 ...  ssl 的握手过程:       Client                                               Server        ClientHello                  -------->                                                       ServerHello                                                      Certificate*                                                ServerKeyExchange*                                               CertificateRequest*                                    <--------      ServerHelloDone       Certificate*       ClientKeyExchange       CertificateVerify*       [ChangeCipherSpec]       Finished                     -------->                                                [ChangeCipherSpec]                                    <--------             Finished       Application Data             <------->     Application Data  Server Certificate  包中包含服务器的证书, 在一些安全性要求不高的场合,  服务器证书都没有, 服务器公钥直接在 ServerKeyExchange 里发送,  ClientKeyExchange 包含用服务器公钥加密的前主密文...  如果安装了客户端证书, 客户端证书在 Client Certificate 中发送,  CertificateVerify 包含对之前的握手消息的签名...

user: user-0
content: 引用 4 楼 mLee79 的回复:ssl 服务器证书是用来做密钥交换的,  没有每个包做签名... 密钥交换的过程是 客户端 选择  前主密文 , 用 服务器证书公钥加密, 发送给服务器, 服务器用私钥解码得到这个 前主密文,  然后按一定的算法获得所有的加密参数 ...   包的完整性是用 HMAC 来保证的...  ssl 可以选择要求客户端证书, 这时候客户端用私钥对前面的握手消息签名, 这一般会在要求比较高的场合下使用, 比如网银啊, VPN 啥的时候... 这个证书也只是在握手的时候用...  你好，我昨天看了密码学书籍， 书上确实说数字证书是存放 发送端的 公钥。  你的意思是： ssl中用的证书， 和书上的有差异？  ssl存放的有发送端的公钥和客户端用的私钥 ？  是这个意思吗

user: user-1
content: ssl 服务器证书是用来做密钥交换的,  没有每个包做签名... 密钥交换的过程是 客户端 选择  前主密文 , 用 服务器证书公钥加密, 发送给服务器, 服务器用私钥解码得到这个 前主密文,  然后按一定的算法获得所有的加密参数 ...   包的完整性是用 HMAC 来保证的...  ssl 可以选择要求客户端证书, 这时候客户端用私钥对前面的握手消息签名, 这一般会在要求比较高的场合下使用, 比如网银啊, VPN 啥的时候... 这个证书也只是在握手的时候用...

user: user-4
content: 引用 2 楼 caddor9100 的回复:1.  证书里私钥？   公钥是什么？公开的， 私钥自然不是公开的， 服务器把证书给了用户，证书里多了一个私钥，用户用它来加密报文。  当然，服务器也用它来解密。  这个恐怕有问题， 你上csdn， 登录的时候，网站然给你进入https(这个里有证书，只是你不知道自己已经安装了）。  我和你下载的证书都一样， 我们都知道该网站加密的私钥。 这太恐怖了。  另外：   最为对称加密的私钥，不应该是每次都通信后，就废弃它吗？   2.  我做个试验：  用一台古老的，干净的xp 去访问csdn，看会不会要求我安装证书。  试验的结果，似乎证书的安装时背后安装。  额，你说的证书是那种公开的证书哦  我说的是像支付宝这类证书，是要你登录后网站验证了你的身份后才让你下载的。而且也说明了里面的私匙和公匙并不是一对。整个过程中时两对秘钥，服务器用私匙 A 加密的数据客户端用公匙 A 解密，客户端用私匙 B 加密的数据服务器端用 公匙 B 来解密。 客户端的证书里面包含的是 公匙 A 和 私匙 B，是不成对的。  另外，你说的那种公开的证书，只是用来让客户端验证服务器的身份的，客户端并不用它来加密数据。客户端生成一个随机数，发给服务器，服务器用私匙加密后返回给客户端，客户端用证书里的公匙解密，看和加密的那个随机数是否相同，以此来验证服务器的身份。

user: user-0
content: 引用 1 楼 adlay 的回复:[quote=引用 楼主 caddor9100 的回复:]  1. 按照密码学教材的理论，数字证书存放的服务器签名用的公钥，  浏览器下载数字证书后，获取到公钥，有了这个公钥。 由于服务器发送的每个报文都签名了，  用公钥解“加密过的报文摘要”，然后验证报文是否被篡改。  这样似乎很安全了，有什么问题？   要说有问题， 浏览器发送报文给服务器（这个时候，浏览器成了发送方） ，它的报文谁签名？   它自己签名？ 它如果签名，那么它的公钥如何让服务器知道？  有人说了，它也可以搞一个证书给服务器啊，事实上，我们上网，我们没有自己的证书啊。    2.     ssl协议为什么能够解决我的问题1.  首先，ssh 并不会把所有数据都用这种不对称算法来加密，因为这样效率太低了。而是先和服务器协商一个对称加密的密匙，之后的数据用这个密匙来加密，而协商密匙的过程才使用公匙私匙这种非对称的加密方法。  然后，你下载的证书除了包含一个解密服务器数据的公匙外，还包括一个加密数据的私匙，当然它们并不是一对的，每一个都需要和服务器上的那组才能形成一对。 这个你可以打开一个 .pem 证书文件来查看，里面都是文本形式的。 如果你从 IE 里面导出一个证书的时候也会提示你是否导出私匙， 由此可见证书里面除了公匙是还包含私匙的[/quote]   1.  证书里私钥？   公钥是什么？公开的， 私钥自然不是公开的， 服务器把证书给了用户，证书里多了一个私钥，用户用它来加密报文。  当然，服务器也用它来解密。  这个恐怕有问题， 你上csdn， 登录的时候，网站然给你进入https(这个里有证书，只是你不知道自己已经安装了）。  我和你下载的证书都一样， 我们都知道该网站加密的私钥。 这太恐怖了。  另外：   最为对称加密的私钥，不应该是每次都通信后，就废弃它吗？   2.  我做个试验：  用一台古老的，干净的xp 去访问csdn，看会不会要求我安装证书。  试验的结果，似乎证书的安装时背后安装。

user: user-4
content: 引用 楼主 caddor9100 的回复:1. 按照密码学教材的理论，数字证书存放的服务器签名用的公钥，  浏览器下载数字证书后，获取到公钥，有了这个公钥。 由于服务器发送的每个报文都签名了，  用公钥解“加密过的报文摘要”，然后验证报文是否被篡改。  这样似乎很安全了，有什么问题？   要说有问题， 浏览器发送报文给服务器（这个时候，浏览器成了发送方） ，它的报文谁签名？   它自己签名？ 它如果签名，那么它的公钥如何让服务器知道？  有人说了，它也可以搞一个证书给服务器啊，事实上，我们上网，我们没有自己的证书啊。    2.     ssl协议为什么能够解决我的问题1.  首先，ssh 并不会把所有数据都用这种不对称算法来加密，因为这样效率太低了。而是先和服务器协商一个对称加密的密匙，之后的数据用这个密匙来加密，而协商密匙的过程才使用公匙私匙这种非对称的加密方法。  然后，你下载的证书除了包含一个解密服务器数据的公匙外，还包括一个加密数据的私匙，当然它们并不是一对的，每一个都需要和服务器上的那组才能形成一对。 这个你可以打开一个 .pem 证书文件来查看，里面都是文本形式的。 如果你从 IE 里面导出一个证书的时候也会提示你是否导出私匙， 由此可见证书里面除了公匙是还包含私匙的