zoukankan      html  css  js  c++  java
  • ssl协议、openssl及创建私有CA

      在互联网发展早期,NetSpace公司发明了第一个浏览器及Web服务器。而http协议传输数据是明文的,为了基于加密的机制实现http,NetSpace公司在TCP层和应用层之间引入了半个层,这半层就是SSL。SSL不是一个软件,可以将它理解为一个。当应用层的某种协议如果传输数据之前调用了SSL的功能,那么这个协议就实现了加密的功能。例如:http协议本身是不加密的,数据在应用层封装完之后本来应该交给传输层,但由于NetSpace在TCP层和应用层之间加入了SSL层,而SSL本身就是实现数据通信的,因此http摇身一变成为了https。同理,smtp就变成了smtps,ftp就成了ftps。

      因此,众多应用层的明文协议通过调用SSL的功能来实现数据的安全传输了。而SSL只是一个库,这就意味着若需要使用SSL的功能只需要在系统上提供SSL的库文件即可。如此一来,就能将http封装成https,意味着可以支持https的协议了,但http本身是不会经由ssl封装的,所以http和https是两种不同的协议,但它们在应用层实现的功能是相同的,只是底层的协议栈等其它方面不同。

      但SSL本身只是某一家公司研发的协议,不具有普适性,所以国际标准化组织开发了更为开放的TLS

    一、TLS/SSL HandShake

      1、SSL与TLS

      SSL:Secure Socket Layer,安全的套接字层;SSL v2、SSL v3目前还在使用,但v1不再使用。

      TLS:Transport Layer Security,传输层安全;TLS v1相当于SSL v3,它们的实现原理和机制差不多。

      思考一个问题,在两台主机之间,SSL会话是怎么建立的?

        SSL会话建立过程:

      以http协议为例,http是基于TCP的,因此,双方在建立http会话之前要先进行三次握手。一旦有了https,在TCP三次握手之后,此时还不能直接通信;首先,客户端向服务器端发起会话请求(客户端通过浏览器输入地址开始通信);其次,服务器端此时不会直接与客户端传输http数据包,而是跟客户端协商建立SSL会话(包括协商使用协议版本,SSL v2、SSL v3、TLS v1...),Server将自己的证书发送给客户端,客户端验证证书是否可信、证书的完整性;第三步,客户端生成一个会话密钥(客户端通过随机数生成的随机的对称密钥(使用非对称加密速度太慢)),并通过从证书的获取的公钥加密对称密钥;第四步,客户端将加密的对称密钥发送给服务器端。接下来,Server就可以通过接收的密钥加密数据发送至客户端实现数据通信了。

      在这个过程当中,不仅需要协商加密协议,还需要协商对称加密的算法。

      2、加密算法回顾及补充

      对称加密

        DES(Data Encription Standard,数据加密标准,56bit长度,比较早的成熟算法):美国国家安全局在征集算法时,由IBM公司所提供的完全公开的算法。随着计算机的发展,DES因为不安全已经很少被使用了。

        3DES:将数据DES 3次,较常用,但其安全性不被信任。

        AES:(Advanced Encription Standrand,高级加密标准)128bit

          AES变种:AES192,AES256,AES512(密钥越长,安全性越高,速度越慢)

        Blowfish

        实现对称加密的工具:openssl、gpg

      单向加密:

        MD4

        MD5(128bit对称输出长度)

        SHA1(169bit对称输出长度)

          SHA变种:SHA192、SHA256、SHA384(SHAX,X为输出长度)    

        CRC-32:(循环冗余校验码)不是一种加密算法,而是一种校验码机制。应用非常广泛,但不提供安全性。可能会出现输入不一样但输出一样的情况。

      公钥加密(两种核心:加密/签名):

        应用实例:

          身份认证(数字签名)    

          数据加密

          密钥交换

        RSA(既是算法,也是公司名称(三位创始人的名称),分为公开和非公开的加强算法):可用于实现加密、签名。

        DSA(美国国家安全局的,公开的):只能实现签名。

        ELGamal:(商业算法,有偿使用)

    二、PKI

      

      PKI,Public Key Infrastructure,公钥基础设施,定义了CA、CA彼此之间的信任关系及CA的证书吊销列表等。PKI的核心是CA。

      CA,Certificate Authority

        不同标准下的证书格式不相同(如:身份证也有1代,2代的概念),目前比较流性的证书格式是x509,也存在pkcs12等格式。

      x509包含的内容:

        公钥及其有效期限

        证书的合法拥有者

        证书该如何被使用

        CA的信息(哪个机构、公司的服务器地址等等)

        CA签名的校验码

      PKI的实现:(TLS/SSL与OPGPG实现证书的管理机制不同或者CA的信任关系的传递机制略有不同)

        1.TLS/SSL:使用的正是x509格式的证书

        2.OPGPG:证书格式与TLS/SSL差不多

    三、OpenSSL

      OpenSSL是一个软件,它是SSL的开源实现,几乎实现了市面上主流的加密算法,工作性能好。

      1、OpenSSL的组成:

      (1).libcrypto(库文件):通用加密库(提供了各种加密函数)

      (2).libssl:TLS/SSL的实现(能够实现认证、数据安全传输及数据完整性的工具),基于会话的、实现了身份认证、数据机密性、会话完整性的TLS/SSL库。

      (3).openssl:多用途的命令行工具(能够实现单向加密、对称加密、非对称加密、生成一对密钥、还可以简单的模拟证书颁发机构)

        实现私有证书颁发机构(很多加解密功能依赖于证书机构)

        子命令

        openssl version  #查看openssl版本

        openssl speed [加解密算法名称]  #测试openssl对各种加密算法的速度

        enc子命令

        openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64] [-A] [-k
             password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P] [-bufsize
             number] [-nopad] [-debug] [-none] [-engine id]        #openssl enc命令的语法

          加密:

            例:openssl enc -des3 -salt -a -in inittab -out inittab.des3

          解密:

            例:openssl enc -des3 -salt -d -a -in inittab.des3 -out inittab  

        使用openssl计算一个文件的特征码(提取数据指纹):

        md5sum 文件名  #计算文件的md5校验码
        sha1sum 文件名    #计算文件SHA1的校验码

        使用openssl计算文件特征码:(dgst子命令)

        openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-c] [-d] [-hex] [-binary] [-out
               filename] [-sign filename] [-keyform arg] [-passin arg] [-verify filename] [-prverify filename]
               [-signature filename] [-hmac key] [file...]

            例:

              openssl dgst -md5 文件名  #使用openssl计算文件的MD5的校验码

              openssl dgst -sha1 文件名  #使用openssl计算文件的SHA1校验码

        生成与用户密码格式相同的字符串:

        openssl passwd -1 [-salt 字符串]

        生成伪随机数:

        openssl rand -salt [随机数字指定加密后字符串的长度]

      2、OpenSSL实现私有CA

        (1).生成一对密钥(若需给别人发证,自己得先有证)

          通过RSA生成私钥:   

        openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine
               id] [numbits]

            生成私钥:openssl genrsa -out /PATH/TO/SOMEFILE NUMBERS(密钥长度)

            提取公钥:openssl rsa -in /PATH/TO/SOMEFILE -pubout

            将密钥保存在文件中示例:openssl rsa -in /PATH/TO/SOMEFILE -putout > server.key

            生成并修改文件示例:(umask 077;openssl genrsa -out server1024.key 1024)  #()中的命令会在子shell中运行,运行完子shell销毁

        (2).生成自签署证书

        openssl req [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename] [-passout
               arg] [-text] [-pubkey] [-noout] [-verify] [-modulus] [-new] [-rand file(s)] [-newkey rsa:bits] [-newkey
               alg:file] [-nodes] [-key filename] [-keyform PEM|DER] [-keyout filename] [-keygen_engine id] [-[digest]]
               [-config filename] [-subj arg] [-multivalue-rdn] [-x509] [-days n] [-set_serial n] [-asn1-kludge]
               [-no-asn1-kludge] [-newhdr] [-extensions section] [-reqexts section] [-utf8] [-nameopt] [-reqopt]
               [-subject] [-subj arg] [-batch] [-verbose] [-engine id]

        例:openssl req -new -x509 -key server1024.key -out server1024.crt -days 365

      3、在RedHat系统上,若想真正使用CA,还需要进行额外的配置

        (1) 修改配置文件:

        vim /etc/pki/tls/openssl.cnf

        

                    注:上图中的文件都需要建立

        (2) 为CA准备私钥和证书:(自签证书)

          

        (3) 准备目录:

      

        至此,自签证书准备完成,可作为CA服务器使用了,其它人就可以申请了。比如再启动一个主机,在另外一个主机上生成一段密钥再生成一个证书颁发申请,发送给CA服务器。CA服务器一签即可生成证书。

      4、测试CA服务器为某一应用签署证书

      假设建立一个Web服务器,让Web服务器的配置文件在/etc/httpd目录下,在此目录下创建ssl目录用于准备证书和密钥。(具体放在什么位置,可按自己需要修改,一般而言放在配置文件目录下即可)

      任何一个应用若想得到证书,必须要有公钥,因为需要从私钥中提取公钥,(刚刚创建的公钥和私钥是CA的公钥私钥,这与Web服务器无关,两者不能混淆。每一种应用都需要有自己的证书(如Web服务器,邮件服务器需各自有自己的证书)),不同的服务尽可能使用不同的证书。要有证书得有公钥,要有公钥得有私钥,因此:

        生成私钥:

        因为需要到CA服务器申请证书,故需要一个证书颁发请求(包括个人信息、个人地址等信息),因此:

        生成申请:

          

                    注:(1) 生成请求的命令不用-x509选项,-x509用于生成自签证书;

                      (2) 规范来说文件应以.csr(证书签署请求)结尾,见名知意;

                      (3) 私有证书机构名需与CA保持一致

        发送请求:(不在同一台服务器时需要发送,此处位于同一台服务器上直接签署即可)

        签署证书:

          openssl ca(进入CA模式) -in [请求的文件路径] -out [生成的证书文件的路径] [-days 指定证书有效时间]

          签署完成!

        查看CA记录信息:

        生成测试用的证书:(不建议使用)

          RedHat为我们提供了另外一个工具,用于快速生成一个测试使用的zhengsh(不可用于生产环境)(/etc/pki/tls/certs目录下)使用make命令:

          因为最后生成的文件(如:httpd.pem)中包含了私钥,故只可在测试中使用。

      测试:

  • 相关阅读:
    tps吞吐量映射的问题
    深浅拷贝
    webdriver驱动火狐浏览器报错:Unable to find a matching set of capabilities
    xpath元素定位方法
    linux监控系统性能命令
    测试质量评估
    测试策略模型设计
    需求评审
    安全测试的目的,发现哪些问题
    url组成
  • 原文地址:https://www.cnblogs.com/long-cnblogs/p/10445903.html
Copyright © 2011-2022 走看看