天天看点

互联网安全之-------openssl

在互联网通信中,比如qq、msn等等,如果我们进行交谈的内容没有被加密,这样的话别人都可以随访问了,这是不合适的,所有我们就要对我们通信的内容进行加密,然后再进行通信就相对比较安全了

     在互联网上数据传输有两种:明文传输和加密传输。明文传输的协议有:ftp、http、smtp、telnet。但是为了数据的完整性和安全性,所以后来引用了加密等相关手段来保证数据的安全和完整性。

加密类型

原理

常用的算法

优点

缺点

对称加密

双方使用同一种加密算法对数据进行加密解密

des, 3des, aes

加密速度快,适合对大量数据进行加密,可以保证数据的机密性

   双方采用相同加密算法,这样无法保证数据的完整性,如果要加密的数据多的话,对秘钥无法有效的管理

非对称加密

身份验证:私钥加密,公钥解密

数据发送:公钥加密,私钥解密

rsa

dss

可以保证数据的可用性,和机密性

加密速度慢,要用的秘钥相当长

单项加密

直接利用加密算法对数据进行加密,只能加密不能解密

md5,sha1

,sha256,

sha512

可以保证数据的完整性

不可解密

   那么一个完整的数据发送是怎么样一个过程呢?

1、发送方使用选定的单向加密算法计算原始数据的特征码;

2、发送方使用自己的私钥加密特征码,附加于原始数据后面;

3、发送方生成一次性对称密钥,并使用此密钥加密数据(原始数据+加密后的特征码);

4、发送方使用接收方的公钥加密一次性对称密钥,附加于加密数据后面

5、发送;

1、接收方使用自己的私钥解密加密的一次性对称密钥;

2、使用对称密钥解密数据,得到加密的特征码和原始数据;

3、使用发送方的公钥解密加密的特征码;

4、使用与发送方相同的单向加密算法重新计算数据的特征码,并与解密出的特征做比较

对于非对称加密而言,获取对方的公钥非常关键,最简单的就是自己建一个站点,把

自己的公钥公布出去,但是别人在获得的时候,怎么能确保这公钥就是公布者的呢?

    所以简单的公钥分发机制已经不能保证公钥来源合法性了,于是就有了分布式分发机制,最常见的就是数字证书了

数字证书

    我们为什么要用到数字证书呢?大家想象一下,我们要进行通信的时候,怎么去保证对方一定是我们想要进行交流的那个人呢?做数字签名?那么怎么保证这数字签名是合法的呢?这时候就需要第三方机构,分发一种大家都认可的数字证书,比如说×××,当我们看到对方的数字证书的时候,是不是就确定了对方的身份了?

数字证书的格式:  

  数字证书:x.509v3(常用的)

      版本号(version)

      序列号():证书本身在ca中惟一标识;

      签名算法标志              //  让使用者确定使用的哪种数据加密算法,以用来验证证书合法性

      发行者名称

      有效期:

      证书主体名称:(组织(主机),个人)

      证书主体公钥信息:

      发行商惟一标志

      证书主体的惟一标志

扩展:

      签名:

pki(public key infrastructure)它是一种规范,定义了一个ca所具有的的机构

组成部分:

         端实体(申请者)

         注册机构(rc)

        签证机构(ca)-->签证机构(ca)

       证书撤消列表(crl)发布机构

      证书存取库

         那我们如何去制作一个证书申请呢?如果我们仅要求对公司内部的员工分发证书,那么去第三方机构申请证书是需要一定费用的,这时候我们自己建立一个ca并给自己颁发一个证书,这样就好很多了

要想自建ca的话,我们要借助一个工具,openssl,

openssl由三部分组成,

  libcrypto:实现加密解密的工具,很多需要加密的程序都会调用这个库

  libssl :实现ssl功能的

  openssl :openssl的命令行工具

openssl:常用的几个命令介绍

versinon 查看openssl的版本号

enc 加密

          -des3 指定加密算法为des

           -in    指定加密/解密文件

           -e     加密

           -d      解密

          -out 制定将加密或者解密过后的文件存放的位置

例如:

                将一个文件加密的过程我们就用:

                 openssl enc -des3 -in /path/to/somefile -e -out /path/to/somefile.des3

                 将加密过后的文件解密我们就使用:

                openssl enc -des3 -in /path/to/somefile.des3 -d -out /path/to/somefile

 dgst

              -hex 以16禁止显示计算出的特征码

               -out 保存的文件  

      例:以md5的算法获取一个文件的特征码

               openssl dgst -md5 -hex /path/to/somefile

speed  速度测试工具

                不带任何参数将每一种加密算法都测试一遍,指定加密算法的话,只测试指定的算法    

生成私钥:

    openssl  genrsa num  

    num  指定生成秘钥的位数,默认是512位的,必须为2的n次方位

 例如:

    openssl genrsa 2^n > /path/to/keyfile

    openssl genrsa -out /path/to/keyfile 2^n

对于私钥也是可以加密的

  -des3 指定以des3的格式加密

  -out 指定保存的位置

例:openssl genrsa -des3 2048

       注:我们的私钥虽然加密,但是也不能让人随意看,所以我们应该把私钥文件的权限改为只有自己才能看

生成公钥

注:公钥是从私钥中中提取出来的:

       -in  私钥所存放的位置

       -pubout 提取公钥

例:

openssl rsa -in /path/to/keyfile -pubout  丛私钥中提取公钥

那如何申请证书呢

用到的命令 req

          -in   指定从哪个文件读取

         -key  指定私钥文件在哪

         -new  实现制作证书申请

         -days 指定该证书期望使用的时间

         -out  把证书申请保存在那个文件下

例如:如何制作一个证书申请呢:

      openssl req -new -key /path/to/private_key -out /paht/to/certificate.csr

下面我们就来实现自建ca,制作证书申请,分发证书的过程:

自建ca:

# cd /etc/pki/ca/

1、为ca生成一个私钥:

2、生成自签证书:

注:这里做自签证书的时候必须要加-x509,不指定的话就是证书申请

   这样的话我们自己的ca就创建好了,自签证书也好了,就可以拿着证工作了

3、签署证书:

# openssl ca -in /path/to/certreq.csr -out /path/to/certfile.crt(证书文件都以crt结尾) -days 365

是一个数字签名的过程

客户端

    生成私钥

 制作证书请求:

签署证书:

专用客户端测试工具:

# openssl s_client -connect host:port -cafile /path/to/cacertfile|-capath /paht/to/cacertfiles_dir/ -ssl2|-ssl3|-tls1

   -connect 说明链接那个服务器的那个端口进行检测

   -cafile 指定使用那个ca证书进行检测

   -capath 指定那个路径下的ca证书,与-cafile二选一使用

   -ssl2 指定协议

   -state 显示其状态

openssl中有如下后缀名的文件

.key格式:私有的密钥

.crt格式:证书文件,certificate的缩写

.csr格式:证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写

.crl格式:证书吊销列表,certificate revocation list的缩写

.pem格式:用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式

继续阅读