`
edison0663
  • 浏览: 79336 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

ssl双向认证和单向认证原理

阅读更多

有朋友在搞一个项目,周末有聊到一些安全性的东西,很自然会想起https,但https究竟如何实施,其原理又是什么?

 

    基于ssl,一般的应用都是单向认证,如果应用场景要求对客户来源做验证也可以实现成双向认证。

    网上google一下:

 

    为了便于更好的认识和理解 SSL 协议,这里着重介绍 SSL 协议的握手协议。SSL 协议既用到了公钥加密技术又用到了对称加密技术,对称加密技术虽然比公钥加密技术的速度快,可是公钥加密技术提供了更好的身份认证技术。SSL 的握手协议非常有效的让客户和服务器之间完成相互之间的身份认证,其主要过程如下:
  ① 客户端的浏览器向服务器传送客户端 SSL 协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种信息。
  ② 服务器向客户端传送 SSL 协议的版本号,加密算法的种类,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书。
  ③ 客户利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的 CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过, 通讯将断开;如果合法性验证通过,将继续进行第四步。
  ④ 用户端随机产生一个用于后面通讯的“对称密码”,然后用服务器的公钥(服务器的公钥从步骤②中的服务器的证书中获得)对其加密,然后将加密后的“预主密码”传给服务器。
  ⑤ 如果服务器要求客户的身份认证(在握手过程中为可选),用户可以建立一个随机数然后对其进行数据签名,将这个含有签名的随机数和客户自己的证书以及加密过的“预主密码”一起传给服务器。
  ⑥ 如果服务器要求客户的身份认证,服务器必须检验客户证书和签名随机数的合法性,具体的合法性验证过程包括:客户的证书使用日期是否有效,为客户提供证书的 CA 是否可靠,发行 CA 的公钥能否正确解开客户证书的发行 CA 的数字签名,检查客户的证书是否在证书废止列表(CRL)中。检验如果没有通过,通讯立刻中断;如果验证通过,服务器将用自己的私钥解开加密的“预主密 码”,然后执行一系列步骤来产生主通讯密码(客户端也将通过同样的方法产生相同的主通讯密码)。
  ⑦ 服务器和客户端用相同的主密码即“通话密码”,一个对称密钥用于 SSL 协议的安全数据通讯的加解密通讯。同时在 SSL 通讯过程中还要完成数据通讯的完整性,防止数据通讯中的任何变化。
  ⑧ 客户端向服务器端发出信息,指明后面的数据通讯将使用的步骤⑦中的主密码为对称密钥,同时通知服务器客户端的握手过程结束。
  ⑨ 服务器向客户端发出信息,指明后面的数据通讯将使用的步骤⑦中的主密码为对称密钥,同时通知客户端服务器端的握手过程结束。
  ⑩ SSL 的握手部分结束,SSL 安全通道的数据通讯开始,客户和服务器开始使用相同的对称密钥进行数据通讯,同时进行通讯完整性的检验。


  双向认证 SSL 协议的具体过程
  ① 浏览器发送一个连接请求给安全服务器。
  ② 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器。
  ③ 客户浏览器检查服务器送过来的证书是否是由自己信赖的 CA 中心所签发的。如果是,就继续执行协议;如果不是,客户浏览器就给客户一个警告消息:警告客户这个证书不是可以信赖的,询问客户是否需要继续。
  ④ 接着客户浏览器比较证书里的消息,例如域名和公钥,与服务器刚刚发送的相关消息是否一致,如果是一致的,客户浏览器认可这个服务器的合法身份。
  ⑤ 服务器要求客户发送客户自己的证书。收到后,服务器验证客户的证书,如果没有通过验证,拒绝连接;如果通过验证,服务器获得用户的公钥。
  ⑥ 客户浏览器告诉服务器自己所能够支持的通讯对称密码方案。
  ⑦ 服务器从客户发送过来的密码方案中,选择一种加密程度最高的密码方案,用客户的公钥加过密后通知浏览器。
  ⑧ 浏览器针对这个密码方案,选择一个通话密钥,接着用服务器的公钥加过密后发送给服务器。
  ⑨ 服务器接收到浏览器送过来的消息,用自己的私钥解密,获得通话密钥。
  ⑩ 服务器、浏览器接下来的通讯都是用对称密码方案,对称密钥是加过密的。
  上面所述的是双向认证 SSL 协议的具体通讯过程,这种情况要求服务器和用户双方都有证书。单向认证 SSL 协议不需要客户拥有 CA 证书,具体的过程相对于上面的步骤,只需将服务器端验证客户证书的过程去掉,以及在协商对称密码方案,对称通话密钥时,服务器发送给客户的是没有加过密的 (这并不影响 SSL 过程的安全性)密码方案。 这样,双方具体的通讯内容,就是加过密的数据,如果有第三方攻击,获得的只是加密的数据,第三方要获得有用的信息,就需要对加密的数据进行解密,这时候的 安全就依赖于密码方案的安全。而幸运的是,目前所用的密码方案,只要通讯密钥长度足够的长,就足够的安全。这也是我们强调要求使用 128 位加密通讯的原因。

 

     一般web应用都是采用单向认证的,原因很简单,用户数目广泛,且无需做在通讯层做用户身份验证,一般都在应用逻辑层来保证用户的合法登入。

     但如果是企业应用对接,情况就不一样,可能会要求对client(相对而言)做身份验证。这时需要做双向认证。

 

 

     用java简单试了一下如何搭建一个https站点, tomcat 6 https 单向认证,网上google一下,例子很多,这里就不贴出来了,然后浏览器测试。

    

     继续浏览此网站,可以正式访问。 服务器搭建,应该是没问题了。 但是这个警告是怎么回事? 还是应该再了解一下的。

     这个证书是自己做的,用jdk的工具keytool 很容易可以搞出一个(不懂请google), 浏览器很明显不信任这个服务器发过来的证书(公钥)。 这里还需要了解一下,浏览器是如何信任一个证书的。

     1 浏览器 https: 访问一个网站

     2 网站服务器会发给浏览器 一个证书

     3 浏览器验证证书有效性:

        3.1 证书与访问域名是否匹配,证书是否还在已经有效期内。

        3.2 证书的路径。

              如图:

             
             
              证书是否由 浏览器(客户端) 所信任的机构认证。 如果在,则通过,否则给用户自己选择。

              自己折腾的证书没给第三方认证,肯定弹warn, 于是乎出现了第一个图。

             
             

    有了以上的基础知识,网上再找一下,自己写一个简单的java程序,要实现,https顺利访问(无warn)

    easy, 把这个证书设置为自己信任的就ok.

    通过jdk的keytool 产生对应证书,并导入到truststore,生成一个文件(该文件存储了信任的证书)。在java程序中指定truststore对应的文件。

 

 

public static void main(String[] args) throws Exception {
        System.setProperty("javax.net.ssl.trustStore", "C:/Java/Tomcat/conf/client.truststore" );
        new testhttpspostdata().testIt();
    }

    private void testIt() {
        String postdata="data=testpostdata";
        String https_url = "https://localhost:8443/examples/jsp/getpost.jsp";
        URL url;
        try {

            url = new URL(https_url);
            HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
            System.out.println("ready post data");
            con.setDoOutput(true);
            con.setRequestMethod("POST");
            con.getOutputStream().write(postdata.getBytes());
            con.getOutputStream().flush();
            con.getOutputStream().close();
         
            // dumpl all cert info
            print_https_cert(con);
            //
            //System.out.println( con.getLocalPrincipal().toString() );
            System.out.println( con.getPeerPrincipal().toString() );
                       
            // dump all the content
            print_content(con);                 
            // dump all the content
            print_content(con);

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    一个周末,学了一些东西,值得mark一下。

 

    ps: 有一篇好文章,有助于深入理解。

    http://www.williamlong.info/archives/2058.html

  • 大小: 55.5 KB
  • 大小: 33.3 KB
  • 大小: 20.7 KB
分享到:
评论
3 楼 paker1989 2014-09-03  
[flash=200,200][url][img][list]
[*]
引用
[u][/u]
[/list][/img][/url][/flash]
2 楼 Reaper 2014-07-03  
keytool 可以产生一个keystore 里面有个私有key 。如果里面没证书,客户端也能访问,而且安装这个证书后也,如果域名匹配,那么访问也没提示错误。这个是为什么呢?

求教
1 楼 鱼吃猫 2012-06-08  
想具体了解“预主密码”产生主通讯密码的过程。。

相关推荐

    android访问自签CA的Https SSL双向认证(j2SE也能使用)

    本篇文章将深入探讨如何在Android应用中实现对自签CA的HTTPS SSL双向认证,并且这些实现方法同样适用于Java SE(J2SE)环境。 首先,我们需要了解HTTPS的基本原理。HTTPS是HTTP协议的安全版本,它通过SSL/TLS协议来...

    SSl双向认证学习笔记  .doc

    SSL双向认证学习笔记 本文档主要介绍SSL双向认证的一些知识,涵盖了基础知识、keytool命令、...SSL双向认证学习笔记涵盖了基础知识、keytool命令、openssl安装等方面,旨在帮助读者了解SSL双向认证的原理和实现方法。

    易语言源码易语言SSL双向认证源码.rar

    通过学习这个源码,你可以深入理解SSL双向认证的工作原理,同时提升在易语言中进行网络通信安全编程的能力。这对于开发涉及敏感数据传输的应用,如在线支付、企业内部通讯等场景,是非常重要的。

    利用tomcat服务器配置https双向认证、https单向认证-ssl、tls

    Tomcat作为流行的Java Servlet容器,提供了支持HTTPS协议的能力,这包括了单向认证(也称为服务器认证)和双向认证(也称为客户端认证)。这两种认证机制都是基于SSL(Secure Sockets Layer)和TLS(Transport Layer...

    SSL&TLS认证原理详解

    在实际应用中,SSL/TLS协议有两种认证模式:单向认证和双向认证。单向认证中,客户端验证服务器的身份,服务器不验证客户端;双向认证则要求双方均需验证对方身份,这通常在高度安全需求的场景下使用。认证过程涉及...

    AndroidHttpClient访问Tomcat双向SSL验证服务器.pdf

    ### AndroidHttpClient访问Tomcat双向SSL验证服务器 #### 环境与背景介绍 ...通过对这些步骤的详细解析,不仅解决了实际项目中的问题,也为读者提供了一个全面了解SSL双向认证原理和技术实现的机会。

    HTTPS单双向认证图解+自签泛域名证书生成及使用

    标题和描述中提到的知识点非常丰富,涉及HTTPS协议、单双向认证、SSL协议以及泛域名证书的生成和使用。我将逐一进行详细解读。 ### HTTPS单双向认证原理 HTTPS协议是HTTP协议的安全版本,它通过SSL/TLS协议进行...

    HTTPS原理介绍.pptx

    HTTPS原理介绍 HTTPS(Hypertext Transfer Protocol Secure)是一种...HTTPS 的工作原理可以分为单向认证和双向认证两种,HTTPS 使用 TCP 端口为 443,对用户及网站进行身份确认,对交互信息进行加密和完整性验证。

    android https 双向验证

    在Android代码中,我们需要配置一个SSLContext对象,它负责处理加密和认证过程。首先,我们需要加载Keystore文件,然后创建TrustManager和KeyManager,它们分别用于处理服务器的证书验证和客户端的证书。最后,使用...

    OpenSSL-s-client 和 s-server

    在本例中,`twoway_ssl.pcapng`和`twoway_tls1_2.pcapng`记录了双向认证的SSL和TLS 1.2协议的数据包,而`oneway_ssl.pcapng`和`oneway_tls1_2.pcapng`记录了单向认证的情况。通过Wireshark等网络分析工具,我们可以...

    https知识经验总结-性能测试

    单向SSL只需要服务器验证客户端(通常是浏览器)的身份,而双向SSL则要求服务器和客户端互相验证对方身份。录制SSL脚本时,LoadRunner提供了相应的配置选项,对于单向SSL,通常只需导入服务器证书;而对于双向SSL,...

    统一身份认证-CAS配置实现

    此外还有单向认证和双向认证的区别,后者要求客户端也需要进行认证。 2. **CAS服务端**:负责用户的认证、ticket的生成和验证等核心功能。 3. **CAS客户端**:通常是指那些需要接入CAS单点登录系统的应用服务端。 ...

    opesnssl证书配置和使用1

    4. **SSL双向/单向认证**:双向认证要求客户端和服务器都需验证对方的身份,而单向认证只需服务器验证客户端。openssl可以通过不同的命令行选项来实现这两种认证模式。 5. **导入证书**:生成的证书需要导入到...

    https单项认证总结

    四、单向认证与双向认证 在“https单项认证”中,只有服务器向客户端展示其证书并被验证,客户端的身份不需要验证,这是大多数网站使用的默认模式,适用于只需要保护服务器数据安全的场景。双向认证则要求客户端也...

    okhttp.rar

    本教程将详细讲解如何使用OkHttp实现Android的双向认证(Mutual TLS)功能,帮助开发者深入理解其工作原理并进行实践。 首先,我们要了解什么是双向认证。在传统的HTTPS通信中,服务器向客户端展示证书以验证自己的...

    IoT平台北向应用证书使用指南1

    单向认证仅需客户端验证服务器身份,而双向认证则要求双方互相验证,可以在服务端配置。 总结关键点: 1. 客户端证书和服务器证书功能相同,验证方法一致。 2. 证书交换相当于交换公钥,但实际通信加密使用的是协商...

    一种基于Python+Nginx架构的双向CA系统设计与实现.pdf

    最后,整个双向CA系统的设计充分考虑了与第三方系统的兼容性、扩展性以及易用性,可以为运营商提供增值业务的支撑,并且在用户体验和安全性方面都较传统的单向CA系统有了显著的提升。系统通过灵活的设计和高效的数据...

    HTTPStomcat配置[参考].pdf

    5. **双向认证**:双向认证要求客户端也需要证书,服务器不仅要验证自己的身份,还要验证客户端的身份。这样可以确保双方都经过身份验证,增强安全性,常用于银行等高安全性的场景。 6. **Tomcat配置HTTPS**:要在...

Global site tag (gtag.js) - Google Analytics