码迷,mamicode.com
首页 > 其他好文 > 详细

openssl 加密 解密 应用及CA的实现

时间:2015-09-19 19:52:07      阅读:358      评论:0      收藏:0      [点我收藏+]

标签:openssl   ca   加密   解密   


一 现在的加密/解密技术主要有三种:对称加密,公钥加密,和单向加密

  对称加密:指的是加密方和解密方使用的是同一个密钥

      特性:

        1 加密。解密使用同一个秘钥;

        2 将原始数据分割成固定大小的块,逐个进行加密

        算法:DES  3DES  AES 

   公钥加密:秘钥是成对出现

       公钥:公开给所有人; pubkey

       私钥:自己留存,必须保证去私密性;secret key

         特点:用公钥加密的数据只能用与之配对的私钥解密,反之亦然;

           特性:

             数字签名:用于接收方确认发送方的身份

             秘钥交换:发送方用对方的公钥加密一个对称秘钥,并发送给对方;

             数据加密

            算法:RSA DSA ELgamal

   单项加密:单向加密就是用来计算一段数据的特征码的

            功能:保证数据的完整性:

            特性:定长输出

             算法:

              md5:128bit sha1:160 sha224  sha256 sha384  sha512

  通过图解来说明一次完整的通信过程

技术分享

 加密过程

    第一步:用单向加密算法提取数据(黑框A)的特征值

    第二步:用自己的私钥加密这段特征值形成黑框B

    第三步:用对称加密算法,对黑框A和黑框B来加密,得到红框A

    第四步:用ALICE的公钥来加密第三步所用的密钥,得到红框B

  解密过程

    第一步:ALICE用自己的私钥解密红框B得到对称加密的密钥

    第二步:用这个密钥解密红框A内容第三步:用BOB的公钥解密黑框B,如果能成功,说明发送方确实是BOB,这就完成了身份验证(解密后会得到一串数据的特征值)

    第四步:用同样的单项加密算法来对这段数据提取特征值,如果和第三步的特征值一样,说明这段数据是完整的,这就完成了数据完整性的校验

二 openssl使用详解

    上面我们说到了很多的算法,那真正将这些算法予以实现那就需要一些软件来负责这些相关操作,而真正能够完成这些操作的常用软件分别是gpg,openssl;

    本文的重点是openssl的应用.

    2.1、什么是OpenSSL呢?

    OpenSSL是一个强大的安全套接字层密码库,Apache使用它加密HTTPS,OpenSSH使用它加密SSH,但是,你不应该只将其作为一个库来使用,它还是一个多用途的、跨平台的密码工具。作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。

    2.2、OpenSSL的基本功能:

    OpenSSL整个软件包由三个套件组成:

       1).libcrypto:通用功能密码算法库

       2).libssl:SSL协议库,用于实现TLS/SSL的功能

       3).OpenSSL:多功能命令行工具(能够实现生成密钥、创建数字证书、手动加密解密数据)

    OpenSSL的目录结构自然也是围绕这三个套件功能部分进行规划的。

    openssl是多用途的加密组件,命令行工具,其可以实现对称加密算法、非对称加密算法、单向加密算法、作为一个简单的CA(OpenCA),其依赖的配置文件默认在/etc/pki/tls/openssl.cnf中,也可以自己定义;openssl作为简单的CA其颁发的证书格式有x509(比较通用,定义了证书的格式,类似于pkcs#10),pkcs#12和pkcs#17定义了如何将证书存诸的格式;openssl也可以实现证书格式的转换。

    3.1、利用openssl工具加密、解密的基本使用方法以及算法:

      对称加密: 

     工具:open enc,gpg

[root@www1 tmp]# openssl enc -e -des3 -a -salt -in services -out services.ciphertext

       #-e 表示加密

       #-des3 表示加密算法,可以更换算法

       #-a 基于文本加密

       #-salt 自动加些杂质进来

       #-in 表示加密哪个文件(services)表示加密的文件

       #-out 加密后的文件,后接文件    

 [root@www1 tmp]# rm services  #删除原文件  是否能恢复出来
 [root@www1 tmp]# openssl enc -d -des -a -salt -in services.ciphertext -out services
  [root@www1 tmp]# ls  解密后的文件
  services  services.ciphertext  test

     单项加密:

        工具md5sum  sha1sum sha224sun ....openssl dgst    

 [root@www1 tmp]# openssl dgst -md5 -hex services
 MD5(services)= 35435ea447c19f0ea5ef971837ab9ced

    MAC:消息认证码,单项加密的

    延伸应用,用于实现在网络通信中保证所传输入的数据的完整性;


     生成用户密码:

     openssl passwd

 [root@www1 tmp]# openssl passwd -1 -salt 123456  #随机生成密码验证码 -1表   示md5 -salt添加杂质
 Password:  #要是输入的密码
 $1$123456$wWKtx7yY/RnLiPN.KaX.z.

   生成随机数:

 [root@www1 tmp]# openssl rand -base64 8  #8表示字节数
 b2HAoy66zm4=    #做密码时=不需要
 [root@www1 tmp]# openssl rand -hex 4    #hex时,每个字符4位,出现的自己    数为NUM*2
 271bd612

 公钥加密:

   加密:

      算法:RSA,elgamal

      工具:gpg  openssl 

      数字签名:

        算法:RSA,DSA ,elgamal

         生成秘钥对:   

 [root@www1 tmp]# openssl genrsa -out rsakey.private 2048  #生成私钥
 Generating RSA private key, 2048 bit long modulus
 ........................................................+++
 ...............................................................+++
           e is 65537 (0x10001)
 [root@www1 tmp]# openssl rsa -in rsakey.private -pubout #提取公钥
    writing RSA key
    -----BEGIN PUBLIC KEY-----
    MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA08Q4TFh8TKeYUw1NPk03
    vYgPXvX89gK1xhUIFCVvJ6NerL49avIlyFiJGmhHEcOKQ+ksKqEX0lwkOzq9+Lji
    piAcPb1GHte4ZUEu8DLRysbsfJjtDvkKFpxWHvIZQTEBE5xxtmbik6jt9YToFyUQ
    xYdI14i23YcNgg3bXf2KQu+9M8cyh7ZVj/Wi42iADFG6mFRabFWN05rKoan02jER
    R89T5QPazi7kO0OV/Ju3sYIQ9GPPxvUCl/B2WDvxvEb9mv81dyGxu7DrcTAS6wuG
    fk2mrRrRzsONNsHFnaRcgIs98L128YtU401AYs5zQCCo9CeYfrpSKpN8ym/Q7q2T
    iQIDAQAB
     -----END PUBLIC KEY-----

 [root@www1 tmp]# chmod og= rsakey.private #其他人不能有访问权限
 [root@www1 tmp]# ll
 total 1484
 -rw------- 1 root root   1675 Sep 17 20:46 rsakey.private

   也可以另外一个命令

 [root@www1 tmp]# (umask 077;openssl genrsa -out key.pri 2048) #这样,其他用户就没访问权限

  随机数生成器:

    /dev/random:仅从熵池返回随机数;随机数用尽,会发生阻塞

    /dev/urandom:从熵池返回随机数:随机数用尽,会利用软件生成伪随机数,非阻塞


 OpenSSH:

   C/S

     C:  ssh  scp  sftp

     S:sshd

   客户端组件;

       ssh 配置文件:/etc/ssh/ssh_config

       ssh [user@host] #如果没有指用户名,则用当前登陆的用户作为登陆远程主机

       ssh -p port 

     基于秘钥的认证:    

  1 ssh-keygen -t rsa 客户端生成秘钥对

 [root@localhost .ssh]# ssh-keygen -t rsa -P ‘‘ -f /root/.ssh/id_rsa

  2 把公钥传输至远端服务器的家目录下

 [root@localhost .ssh]# ssh-copy-id -i id_rsa.pub root@192.168.1.112

  3 需确保秘钥文件的权限是600        

  [root@centos6 .ssh]# ll
 -rw-------. 1 root root 408 Sep 16 20:29 authorized_keys

  4 scp命令:

    scp [options] SRC...DEST/       

 [root@yangbb .ssh]# scp root@192.168.1.112:/root/nohup.out /root/

       # 从远端服务器复制文件到本地 

 [root@yangbb ~]# scp abc.txt root@192.168.1.112:/root/
          #复制本地文件到远端服务器
          常用选项:
          -r:递归
          -p:保持原文件的属性信息
          -q:静默模式
          -P:port:指明远程主机的监听端口

   服务器端:

        生产环境应该注意:

         1 不要使用默认端口:

         2 禁止使用protocal version 1;

         3 限制可登录用户:

         4 设定空闲回话超时时长

         5 利用防火墙来设定SSH访问策略:

         6仅监听特定的IP地址:

         7使用强密码策略

         8基于秘钥的认证

         9禁止使用空密码

         10禁止root用户直接登录

         11限制ssh的访问频率和并非在线数

         12做好日志,经常分析

         /etc/ssh/sshd_config 的设置 

  #Port 22  #默认监听端口需重新设置
  #ListenAddress 0.0.0.0  #默认是本机所有的IP地址 监听的IP地址,最好是内网网卡的IP
  #PermitRootLogin yes  #可设置禁止root登录
  #MaxAuthTries 6  #登录次数,可以设置更小
  #MaxSessions 10  #最大并行登录个数
  #UseDNS yes   #改为no  绕过反解

    可用随机数生成密码:       

   [root@www1 tmp]# tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30 | xargs
   m7HSct6PtX7G3G7zU8MtHxLsRlQ8T9

   OpenSSL:

      三个组件:

       openssl:多用途的命令行工具:

       libcrypto:公共加密库;

       libssl:库,实现了ssl及tls:

   PKI:public key infranstructure

      签证机构:CA

      注册机构:RA

      证书吊销列表:CRL

      证书存储库:

  建立私有CA:

       那么谁来给CA发证呢?

         还是由CA使用其私钥来对证书进行签名,这种我们称之为自签署证书。

         如果我们为自己做一个私有CA的话,那我们就需要为自己签名;

          证书申请请求:

            1、生成申请请求;

            2、RA核验;

            3、CA签署;

            4、获取证书;

     假设在公司内部实现基于证书进行通信,那么我们需要自建一个私有CA.

     下面我们来做一下如何自签一个证书;

       运用Opnessl实现私有CA

       配置文件:/etc/pki/tls/openssl.cnf

        (1) 创建所需要的文件    

  [root@www1 tmp]# cd /etc/pki/CA/
  [root@www1 CA] # touch index.txt
  [root@www1 CA] # echo 01 > serial
    (2) CA自签证书
   [root@www1 CA]# (umask 077; openssl genrsa  -out private/cakey.pem 2048) #生成私钥文件
 [root@www1 CA]# openssl  req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -out cacert.pem  #创建私有CA
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.‘, the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN  #国家代码
State or Province Name (full name) []:Beijing  #州或者省名
Locality Name (eg, city) [Default City]:Beijing   #城市
Organization Name (eg, company) [Default Company Ltd]:magedu ltd  #公司名称
Organizational Unit Name (eg, section) []:ops   #部门
Common Name (eg, your name or your server‘s hostname) []:www1.magedu.com #发证主机名
Email Address []:admin@magedu.com  #联系人邮箱

          -new: 生成新证书签署请求;

          -x509: 专用于CA生成自签证书;

          -key: 生成请求时用到的私钥文件;

          -days n:证书的有效期限;

          -out /PATH/TO/SOMECERTFILE: 证书的保存路径;

   (3)发证

  1 用到的证书的主机生成证书请求:        

[root@centos6 .ssh]# cd /etc/httpd/
[root@centos6 httpd]# mkdir ssl
[root@centos6 ssl]# (umask 077; openssl genrsa -out httpd.key 2048)
[root@centos6 ssl]# openssl req -new -key httpd.key -days 365 -out httpd.csr #.src私有证书申请请求

  2 把请求文件传输给CA;          

[root@centos6 ssl]# ls
httpd.csr  httpd.key
[root@centos6 ssl]# scp httpd.csr root@192.168.1.113:/tmp/

  3 CA签署证书,并将证书发还给请求者;     

[root@www1 CA]# openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 365
[root@www1 CA]# cat index.txt
V 160916184400Z   01  unknown /C=CN/ST=Beijing/O=magedu   ltd/OU=ops/CN=www1.magedu.com/emailAddress=webadmin@magedu.com
[root@www1 CA]# ls newcerts/

 01.pem新生成的证书在此目录下  应该把新证书cp到到 certs/#此目录可做证书存储库         

[root@www1 CA]# cp newcerts/01.pem certs/
[root@www1 CA]# cp /tmp/httpd.crt certs/
[root@www1 CA]# scp /tmp/httpd.crt root@192.168.1.112:/etc/httpd/ssl/
#把证书传给需认证的主机
[root@centos6 ssl]# ls

 httpd.crt  httpd.csr  httpd.key  #httpd.crt是CA签好的证书






    


openssl 加密 解密 应用及CA的实现

标签:openssl   ca   加密   解密   

原文地址:http://yangbb.blog.51cto.com/10649397/1696318

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!