ssl协议openssl及创建私有CA

Posted long-cnblogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 -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)中包含了私钥,故只可在测试中使用。

 

  测试:

技术图片

 

以上是关于ssl协议openssl及创建私有CA的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenSSL 创建私有 CA:3 用户证书

openssl创建私有ca

学习笔记之openssl文件加密CA证书的创建

openssl的应用及私有CA相关内容

创建私有CA及dropbear的编译安装

创建私有CA及dropbear的编译安装