ssl信息和如何在openssl自建一个CA服务器

SSL是netscape(网景公司,全称Netscape Communications Corporation)的常用简称。它是发明浏览器和web服务器之后,用于实现在浏览器和web服务器之间安全交互的一种机制。

http是C/S架构的明文的,C=Client或客户端的浏览器,S=Server服务器应用程序,Client中的程序和Server中的程序通过80端口彼此进行交互,而http是文本协议,它所传输的所有内容都会编码成8位一个字节的文本编码的方式在网络上进行传输,但传输过程是明文的。但http并不加密,所以如果在电商网站购物了,提醒你输入账号,密码。怎么办,岂不是很容易就被人攻破。

而七层模型中,可以进行加密的是应用层,互联网上应用最多就是TCP/IP这样的模型。在传输层,不管是TCP还是UDP都是明文的,IP报文也是明文的,若应用层自己也是明文的,整个网络协议都是明文的了,无法加密了。若想安全传输,后来netscape在应用层和传输层之间增加了半个层,这个层正好是传输层之上,基于套接字通信时专用的,假如在服务器和客户端之间进行通信应用层经过了这个半个层。那么它的通信就是加密的。除非它选择不在那半个层进行通信,这时候的数据就是明文的。这里就说加密的。

SSL:全称:安全的套接字层。Secure Socket layer。位于应用层和传输层的那半个层。SSL是一种协议,常见的两个版本:sslv1和sslv2,sslv3通常都使用sslv3了。SSL协议公开了,就可以被任意公和任意组织任意使用。SSL,由


TLS:Transport layer Security

tlsv1

大多数应用都使用sslv3 or tlsv1,只有应用程序在实现了应用层协议,开发时调用ssl上它应该实现的功能时,才算说名这个协议是该支持ssl功能的。ssl可能会被多种协议都支持到,http是明文的,它可能用到ssl协议,ftp是明文的,如果它想加密,也会用到ssl协议。  既然ssl是种公共功能,ssl其实被实现成为公共的共享库。当开发一种web服务器时,开发时调用了ssl的共享库,我们就理解该新的web服务支持ssl功能。要想支持ssl,必须调用这个ssl这个库才可以。

像apache这样的web服务器就支持ssl功能,nginx也支持ssl功能,它们既可以用ssl功能,也可以不用ssl功能。

就以http为例,http如果支持使用ssl,http就不再是http,而是https。http和https可不是一种协议,http监听在80端口,而https则监听在443端口上。基于http传输的web数据和https传输的数据格式都不相同,编码也不同。

以http为例,客户端和服务器端是如何交换?

如果实现ssl数据安全通信,意味数据传输要加密了,要加密意味着要交换密钥啦。但是我客户端要发请求去你的网站怎么获取你的密钥呢?

    1、当客户端和服务器端通信时,首先发起请求的肯定是客户端,例如在浏览器中键入地址,https://www.mageedu.com/index.php。由于基于tcp/ip协议,服务器和客户端得三次握手,而后数据才能传输,三次握手后,发现通信要基于ssl才能实现。客户端开始要服务器端的证书,让服务器端发证书过来。而服务器的证书一定是互联网上某个比较可靠的CA颁发的,客户端拿到证书时,就开始:

1、验证证书合法性,用CA的公钥去解密CA的签名,

2、验证证书的数据完整性,把解密出来的数据和重新计算证书的特征码进行比对,如果一样,证书ok

3、验证证书中主机名字和请求的主机名称是否一致,是的话,的确是你的证书。

4、以上验证没问题就取得请求主机的公钥信息,而后客户端会临时生成一次性加密密码,一串对称的密码用对方的公钥加密后发送服务器。

5、服务器拿到密码开始加密网页,再次发给客户端。

6、客户端解密网页,看到网页数据。

而客户端向服务器索要证书,并生成一段密码加密通信返回给对方的过程叫ssl会话建立的过程。

要向能够证书加密,必须基于ssl建立ssl会话,说明web服务器基于ssl库里的功能,加密算法有多种,

要选择一个双方都支持的算法才可以,所以会话的建立还包括协商双方都支持的算法的过程,当然ssl协议的选择。

一旦建立完成,数据就能传输,ssl是把数据分成多个块,加密每个块,单独发送的,编码机制改变了。

为什么服务器端没有要客户端的证书呢??

其实要买证书的费用是十分高昂的,个人是完全没有必要去购买证书的。ssl只是服务器端向客户端传输它自己的证书的。而客户端无需传送给服务器。

但有些情况下,比如公司内部通信,就必须要求客户端有自己的证书,服务器才有必要跟你建立传输。

双方会进行证书验证的。


Linux下通用性的公共的数据加密解密工具

1、gpg(pgp)

gpg:工具

pgp:协议

gpg:通常rpm包进行加密

2、openssl

openssl可以实现对称加密、非对称加密、单向加密,都能实现。

openssl

三部分组成

是系统安装时默认安装上去的。用rpm -ql openssl查看openssl生成的文件

1part1、openssl多用途命令工具

2part2、主要功能是被其他工具调用实现的库libcrypto,很多加密解密的功能依靠这个库就ok啦

实现了很多加密算法

3part3、ssl协议的实现。libssl

命令

openssl version 

查看openssl版本号

命令工具

直接运行openssl,启动交互式接口

[root@localhost Packages]# openssl

OpenSSL> 

在交互接口下,输入个错误选项,弹出:

OpenSSL> ljkdksjal

openssl:Error: 'ljkdksjal' is an invalid command.


Standard commands

asn1parse         ca                ciphers           cms               

crl               crl2pkcs7         dgst              dh                

dhparam           dsa               dsaparam          ec                

ecparam           enc               engine            errstr            

gendh             gendsa            genpkey           genrsa            

....


Message Digest commands (see the `dgst' command for more details)

md2               md4               md5               rmd160            

sha               sha1              


Cipher commands (see the `enc' command for more details)

aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb       

aes-256-cbc       aes-256-ecb       base64            bf                

....

而且openssl有很多很多子命令的。

子命令大致分三大类

1、标准命令

2、实现单向加密的命令


openssl 直接在bash下键入就进入交互式界面

openssl


openssl创建CA的,各种功能


[root@localhost ~]# openssl

OpenSSL> help         

openssl:Error: 'help' is an invalid command.


Standard commands

asn1parse         ca                ciphers           cms               

crl               crl2pkcs7         dgst              dh                

dhparam           dsa               dsaparam          ec                

ecparam           enc               engine            errstr            

gendh             gendsa            genpkey           genrsa            

nseq              ocsp              passwd            pkcs12            

pkcs7             pkcs8             pkey              pkeyparam         

pkeyutl           prime             rand              req               

rsa               rsautl            s_client          s_server          

s_time            sess_id           smime             speed             

spkac             ts                verify            version           

x509 

另外指定某种加密方式



1、req:生成证书颁发申请

2、dsa:公钥加密算法

3、rsa:rsa算法

4、enc 数据加密

5  passwd 模拟passwd帮你生成密码

6、crl  证书吊销

7、speed 测试某种加密算法的实现速度

8


1、对称加密:使用openssl

openssl enc

算法:des des3 aes-128 aes-192....idea....RC6 CAST5


举例:先使用whatis enc 然后man enc -加密算法的名称


默认就-salt 加盐了


#openssl enc -e(加密) -des3 -a -salt -in (想要加密的文件)-out (加密后放哪)



[root@localhost ~]# openssl enc -des3 -a -salt -in /tmp/1.txt -out /tmp/100.txt

enter des-ede3-cbc encryption password:

Verifying - enter des-ede3-cbc encryption password:

Verify failure

bad password read

[root@localhost ~]# openssl enc -des3 -a -salt -in /tmp/1.txt -out /tmp/100.txt

enter des-ede3-cbc encryption password:

Verifying - enter des-ede3-cbc encryption password:

[root@localhost ~]# cat /tmp/100.txt 

U2FsdGVkX18hsis6ztPMvrioM1Byyi2AR3VRkFA6Wb1TkmfOubNnwC1jNIrghS6n

n7376ibEIX2fnhDz44P1RK+wcmEk7SYoJxhqEM01fJMKUjkS566lWTVoajrRNwNS

EqLn4knQemWwyWv5uJlYuq9NasgijtyPdNFCVnIsUiGmW7BhmFb+WFiAmCIlKN/J

6AKmkaVPqG27719W66pq7y+MhsHGEb6X6Y1h7UiIoJ3uqQzMyHpg+Xdev2KLU2fV


解密对称加密的文件:

openssl enc -d -des3(指明与加密时的相同算法) -a -salt -in 加密后的文件 -out 输出的文件


openssl如何单向加密

特性:单向 onewway

检测数据完整性

算法

md5 

sha1

sha256

sha384

sha512


命令:md5sum, sha1sum,openssl dgst  chsum

 openssl dgst [-md5|-sha1] -out 把特征码输出哪个文件 (不写-out 意味输出到屏幕) 对哪个文件进行单向加密 


加密命令不同,但提取特征码是相同的

[root@localhost ~]# openssl dgst -md5 /tmp/1.txt 

MD5(/tmp/1.txt)= 20608a9db624359cf6a7567caaf097d7

[root@localhost ~]# md5sum  /tmp/1.txt 

20608a9db624359cf6a7567caaf097d7  /tmp/1.txt


MAC 消息摘要码

单向加密的一种延伸类的应用

应用: 用于实现在网络通信包括传输数据的完整性

仅利用单向加密算法 MAC机制

机制:CBC-MAC

HMAC :使用MD5 sha1算法

传输消息安全。


用户密码:

 提醒用户输出时,把用户输入键盘的“看不见”的信息进行单向加密,提取特征


openssl还支持passwd

用whatis passwd取得openssl passwd的信息

[root@localhost ~]# whatis passwd

passwd               (1)  - update user's authentication tokens

passwd               (5)  - password file

passwd [sslpasswd]   (1ssl)  - compute password hashes

[root@localhost ~]# man sslpasswd

屏幕上会生成一堆..

#openssl passwd 默认隐含stdin(从标准输入读取密码) 


[root@localhost ~]# openssl passwd -1 -salt 23223567

Password: 

$1$23223567$lZjQH2yflOA/y48E5kGrG1


openssl还支持生成随机数的密码


[root@localhost ~]# whatis rand

rand                 (3p)  - pseudo-random number generator

rand                 (3)  - pseudo-random number generator

rand [sslrand]       (1ssl)  - generate pseudo-random bytes

rand [sslrand]       (3ssl)  - pseudo-random number generator

[root@localhost ~]# man sslrand

[root@localhost ~]# openssl rand -hex 4

08a4f846

[root@localhost ~]# openssl rand -base64 4

1GsTyw==

其实可以把上述随机数生成的密码串当做salt

openssl的非对称加密;


算法:RSA

      Eigamal

命令:

gpg openssl rsautl


先生成一堆密钥



数字签名:

算法:RSA Eigamal DSA(只能签名,不能进行加密)


DSA:Digital Signature


DSS:Digital Signature Standard


密钥交换:

算法:公钥加密机制,


用对方的公钥加密一段密钥(密码),送给对方,对方能用自己的私钥解开,获得密码的过程。


DH 



生成密钥:

IKI

        DH

生成密钥:


openssl gendsa 生成dsa


很多时候,生成密钥对儿时很有必要的

命令:openssl genrsa

查看genrsa 

GENRSA(1)


NAME

       genrsa - generate an RSA private key



因为通常情况下,公钥信息都是由私钥提取出来的。



openssl genrsa  -out(直接保存在文件) 


 (umask 077;openssl genrsa -out /root/key3 2048)

Generating RSA private key, 2048 bit long modulus

...............+++

........+++

e is 65537 (0x10001)

[root@localhost ~]# cat /root/key3 

-----BEGIN RSA PRIVATE KEY-----

MIIEpAIBAAKCAQEAyRPxiN5XWzDieymVSa+m33ZWfrrHnFXuEXIPjMJfnzSll4Wi

ccB3Qc+OyfiWiPIkjJU6rUSmBJs+jcka4oPuVJJcg+e0Dv3kBTRgJabwfRFEaU1P

mT9bl80Z/TKNS+rqVOxHsacGHuLLgUAcNdeO61hk8OIq2lKFEyP6kdWTnPKpwCJk

U7v+M4y3MQE7y95gHW9/9BV6J6wtYHf+ozOlnbe37x/sH8bonZFYb9OM+lTGT0DF

nOf2O6kx+ZhKu4Yy44KR+Xn2nQqEnyyw/bi2JjhdKHUz5iupiRstMoAiYMf9aOIM

pHZJ5mP2oJ5EnNgY3mJz0v3Q2/zk/i58agHqvwIDAQABAoIBAQCl8cWWFRi284MV

hnLiNP3bM2vLGHUPi5ORNZTFb2uR5ceU9W6Rd1+6X02xpNw9G0Erh0QUaP+nHUag

hUjutYcozL8jJowDhoYVUHq/U8VP0/SGKs/qK8Cn93SCukmHv9LX4IrZC2Mc4J8k

SOnzN9KybU/knF4j2NM2R90CgYEArFIMLSNML+gQW418hHaIRI6S5E6v5jdB5r+k

G8rz1ITNN1L4eHrkB/FBbFysCCy3WwRAER8e5Hck7zesFnufUm656uF3KHSFIjYI

Uoo2kK3SkPoS07Fvo5jnwsX2JD4vC3rrawZpuQDGkcCSSbv3JB6QSccRVVFuWVAu

TRvzxwECgYBvwgU4cExqela3z3ruDc+0rsoe7Xrp+QW6Rj64NGGb26BW94TdPGsA

oIuAhmIdL+vbppudcuhd59bKrkFpHxivtd9PjqYruNAopDzOjJ1Q71O68EDy3Ycf

RFr9bMktsY53GNnMok3UA95NiPROUfgRLXUdCo9mPL06cSw+89fJJQ==

-----END RSA PRIVATE KEY-----】



从私钥中生成生钥


openssl rsa -in 私钥文件的位置(最好是绝对路径)


[root@localhost ~]# openssl rsa -in key3 -pubout -text

Private-Key: (2048 bit)

modulus:

    00:c9:13:f1:88:de:57:5b:30:e2:7b:29:95:49:af:

    a6:df:76:56:7e:ba:c7:9c:55:ee:11:72:0f:8c:c2:

    5f:9f:34:a5:97:85:a2:71:c0:77:41:cf:8e:c9:f8:

.....

期望对方能解密,就用对方的公钥加密

为了保密性。就用对方的公钥加密

为了保证身份验证就用自己的私钥加密

如何在openssl搭建一个私有CA?

[root@localhost ~]# rpm -ql openssl

/etc/pki/CA

有一个CA的目录,openssl的主配置文件是/etc/pki/tls/openssl.cnf

既然建立私有CA,那我们就自己给自己发个证吧!

1、给自身生成一对密钥

2、自己给自己发个证书。


对于客户端节点来说:1、生成密钥对儿 2、生成证书签署请求(电子文档)3、把请求发给CA(RA证书注册)

CA回应证书:1、验证请求者的信息 2、ok的话签署证书 3、把签好的证书再发给请求者

1、建立CA服务器

    1、生成密钥(当前主机上)/etc/pki/CA/private CA自己的私钥

命令[root@localhost private]# (umask 077; openssl genrsa -out ./cakey.pem)

[root@localhost private]# ll

total 4

-rw------- 1 root root 887 Aug  3 08:48 cakey.pem 而且权限是700!

    2、自己签署自己的证书,#openssl req 生成证书签署请求

-key(指明你的私钥文件时什么,它会自动从私钥文件提取公钥信息) -out(提取出公钥,证书存放放到什么地方)-x509(生成子签署证书,只有自己的做CA时,才有必须加上这个选项)-days 指明

指明证书有效天数,-news 新请求 

 openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365

You are about to be asked to enter information that will be incorporated

into your certificate request.

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [XX]:

成功的话,就让你输入信息啦

Common Name (eg, your name or your server's hostname)这项特别关键,当你在互联网的环境下,该名字必须为你的主机名,必须为hostname!

生成的证书在/etc/pki/CA下,叫cacert.pem CA的公钥就在CA的自签署文件里

此外CA还要生成一个索引文件和serial,序列号 /etc/pki/CA下

   3、客户端节点申请证书,1、生成请求,2、CA签署证书 

1、生成请求 以httpd为例,先到/etc/httpd 下建立一个ssl目录,里面要保存它的证书等信息。

但是第一步先生成客户端的密钥对儿 

[root@localhost ssl]# (umask 077; openssl genrsa -out /etc/httpd/ssl/http.key 2048)

Generating RSA private key, 2048 bit long modulus

2、生成签署请求(其实这里我们可以编辑openssl配置文件,反正签署的时候一定要保持一致,所以直接编辑默认配置再发给他们就ok啦)

3、发送证书给CA

命令 openssl ca 

证书文件的后缀都叫.crt 

签署过程:

openssl ca -in /etc/httpd/ssl/http.csr -out /etc/httpd/ssl/http.crt -days 200

Using configuration from /etc/pki/tls/openssl.cnf 回答y 签署成功。再次把请求发给请求者。


你可能感兴趣的:(ssl,搭建,Note)