如梦烟雨
彩蝶飘起风吹过凌乱了思绪,
琴声悠扬线连天飘向远沟渠,
心田阑珊化伤时俯首弄秋菊。
谁人的残句,掀起了柳絮。
散开在风中,咫尺天涯不送。
拈一抹音律,弹拨忘魂曲。
起舞弄清影,影动乐不停。
你的笑摇曳在风中,
是我永远清醒不了的梦。
望向远处的山峦,在雾中弥漫,
如羽化凡尘在梦幻中低语,
洒落百花雨。

对称加密
建立在双方互相信任的基础上,密钥只有一种,只有在拥有密钥的前提下才能解密数据。没有密钥,别人无法看到解密后的数据。

非对称加密
先手动生成一对密钥,公钥和私钥,公钥可以被任何人拥有,私钥一般只有自己保存,公钥发布出去,自己用私钥加密后的数据文件被获取了公钥的另一方获取,就可以解密数据文件。一般用于,身份验证,让自己授权的一些人查看自己用私钥机密的数据,或者让对方用自己的公钥加密后的文件自己用私钥可以查看。

单向加密
验证数据的完整性,一般用于数字签名。
对数据单向加密,生成特征码,用来验证数据的完整性。数据发生微笑的变化,就会引发雪崩效应,从而能够确认数据是否完整。
目前的数字签名是建立在公共密钥体制基础上,它是公用密钥加密技术的另一类应用。它的主要方式是,报文的发送方从报文文本中生成一个128位的散列值(或报文摘要)。发送方用自己的私人密钥对这个散列值进行加密来形成发送方的数字签名。然后,这个数字签名将作为报文的附件和报文一起发送给报文的接收方。报文的接收方首先从接收到的原始报文中计算出128位的散列值(或报文摘要),接着再用发送方的公用密钥来对报文附加的数字签名进行解密。如果两个散列值相同、那么接收方就能确认该数字签名是发送方的。通过数字签名能够实现对原始报文的鉴别。


加密过程的理解
自己生成一对密钥,将公钥发不出去,对方要对我发送邮件,用我发布的公钥对文件加密,他在加密的时候要想实现非对称加密,就不能用单向加密的手段,这是由加密的命令决定的,enc实现非对称加密,必须有密钥才能对文件加密,dgst不需要密钥,对方可以在对文件非对称加密后,再进行单向加密,当他发送邮件的时候,将单向加密生成的特征码和邮件的原件一同发送过来,我可以对原件单向加密,提取特征码后,与发送方发送过来的特征码做比对,来验证原件的完整性。然后用私钥对原件解密。
整个过程需要注意的是,单向加密只是来实现验证原件的完整性用的,而非对称加密是身份验证,验证通过,你就可以打开文件。

密钥和密码的区别
密钥都是随机生成的,是解锁文件的直接工具,密码在解锁文件的时候,背后其实是很复杂的。我们在给文件设置密码的时候,系统利用加密算法,将密码转换成密钥的形式保存,我们利用密码解锁,同样需要加密算法将密码转化成密钥,与系统中的密钥匹配。
利用对称加密或者非对称加密的时候,会提示输入密码,然后程序会通过算法将密码转换成密钥,若是对称加密算法,就直接用密钥给文件加密,若是非对称加密算法,就从密钥中提取公钥再给文件加密。
单向加密中,可以理解为没有密钥和密码,给文件加密后,文件内容转化成特征码,通过与再次对文件单向加密生成的特征码比对可以用来验证文件的完整性。
我想,对于一些登录密码而言,系统会将密码转换成密钥的形式,若是对称加密,直接与系统密钥文件中存在的密钥比对,若吻合就会验证成功;若是非对称加密,则从密钥中提私钥,用私钥解密。
而若是一些直接使用密钥来通过的关卡,例如在网络上下载的一些软件,经常会提示我们输入密钥,这些程序中,省略了那些算法,直接使用密钥解密。
也就是说,密钥才是解密软件的直接钥匙,密码是需要被算法转化成密钥才可以使用的。
利用密钥解密不需要用到算法,利用密码解密就必须通过算法才能实现了。

公钥和私钥
私钥可以随机生成,
openssl----开源安全套阶层协议
为网络通信提供安全及数据完整性的一种安全协议,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
SSL是Secure Socket Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。
OpenSSL:
libcrypto: 加密、解密
libssl: 实现ssl
httpd--apache WEB服务器中有模块mod_ssl,依赖libssl,实现ssl。
openssl:

180030342.png

openssl
    enc  ---------实现对称加密和非对称加密,子命令加密
        -d  解密
        -e  加密  encript(加密)
        -des3 算法
        -in  指定文件
        -out 加密后的文件
    dgst -----------实现单向加密---雪崩效应
        -c  显示为两个组成部分
        -d   显示debug信息
        -hex  显示十六进制信息
        -hmac  
        -mac alg  显示信息认证码,实现信息完整性
        -md5  算法
    rsautl  --------------  可以实现利用公钥加密,利用私钥解密
   -in filename
    指定输入文件名。缺省为标准输入。
   -out filename
    指定输入文件名,  缺省为标准输出。
   -inkey file
    指定我们的私有密钥文件,  格式必须是 RSA 私有密钥文件。
   -pubin
    指定我们的公共密钥文件。说真的我还真不知道 RSA 的公共密钥文件有什么用,一般公共密钥都是放在证书里面的。
   -certin
    指定我们的证书文件了。
   -sign
    给输入的数据签名。需要我们的私有密钥文件。
   -verify
     对输入的数据进行验证。
   -encrypt
    用我们的公共密钥对输入的数据进行加密。
   -decrypt
    用 RSA 的私有密钥对输入的数据进行解密。
   -pkcs, -oaep, -ssl, -raw
   采用的填充模式,  上述四个值分别代表: PKCS#1.5( 缺省值 ), PKCS#1 OAEP, SSLv2 里面特定的填充模式,或者不填充。如果要签名,只有 -pkcs 和 -raw 可以使用 .
   -hexdump
    用十六进制输出数据。
   -asn1parse
    对输出的数据进行 ASN1 分析。看看指令 asn1parse 吧。该指令一般和 -verify 一起用的时候威力大。
    本指令加密数据的时候只能加密少量数据,要加密大量数据,估计要调 API. 我也没试过写 RSA 加密解密的程序来玩。
    举例时间:
    用私有密钥对某文件签名:
   openssl rsautl -sign -in file -inkey key.pem -out sig
    注意哦,  文件真的不能太大,  这个不能太大意思是必须很小。
    文件大小最好不要大过 73 。绝对不能多过 150 ,多了就会出错。
    这个工具真是用来玩的
   # openssl rsautl -encrypt -in passwd -inkey pub.key -pubin -out passwd1(-inkey必须写,否则会报错)
# openssl rsautl -decrypt -in passwd1 -inkey test.key -out passwd2  # openssl version
 # openssl enc -des3 -in /path/to/somefile -e -out /path/to/somefile.des3
使用这个命令会提示输入密码,可以将这个密码理解为非对称加密的密钥,通过des3算法将密码转化成一对密钥,用公钥给文件加密。
 # openssl enc -des3 -in /path/to/somefile.des3 -d -out /path/to/somefile
使用这个命令会提示输入密码,可以将这个密码理解为非对称加密的密钥,通过des3算法将密码转化成一对密钥,用私钥给文件解密。
 # openssl dgst -md5 -hex fstab.txt---单向加密,获取特征码
 # md5sum fstab.txt---同上
 # sha1sum fstab.txt----计算特征码
 # openssl dgst -sha1 fstab.txt---同上
 # md5sum

 # openssl speed ----测试当前主机加密算法的速度
 # openssl speed des  测试des算法的速度


 # man sslpasswd
 # openssl passwd -1 -salt 12345678
     rand---库调用,生成随机数
          -hex  输出16进制数
          -base64  编码
 # openssl rand -base64 num ----- 生成随机数,随机数为num的2倍
 # openssl rand -hex num
 # openssl passwd -1 -salt `openssl rand -hex 4`-------为随机生成的八位字符单向加密,提取特征码


生成私钥:
 # openssl genrsa----生成一个rsa格式的私钥--generate生成
 # openssl genrsa num-----指定生成多少位的私钥
 # openssl genrsa 2^n > /path/to/keyfile-----将生成的私钥定向到文件
 # openssl genrsa -out /path/to/keyfile 2^n
 # openssl genrsa -des3 2048 ---生成一个2048为的加密私钥
 # (umask 077; openssl genrsa -out /root/mykey2.pri 2048)----加括号只对子shell有效,对当前shell无效


提取公钥:
 # openssl rsa -in /path/to/keyfile -pubout

umask    

允许你设定文件创建时的缺省模式,对应每一类用户(文件属主、同组用户、其他用户)存在一个相应的umask值中的数字。对于文件来说,这一数字的最 大值分别是6。系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用chmod命令增加这一权限。目录则允许设置执行权限,这样针对目录来 说,umask中各个数字最大可以到7。所以,创建文件的最大权限权限是666,目录则是777.


如何申请证书

ca证书中的内容:拥有着自身的属性信息,公钥,用户实体的名称,id号,ca的签名,核心是公钥。验证证书合法性的时候用的是用户实体名称。
   1 ,生成一个私钥
   2、制作一个证书签署请求;
   req-----证书签署请求和生成工具      
   req - PKCS#10 certificate request and certificate generating utility.
      -inform  有两种格式 PEM和DER,PEM比DER有更多的功能,却只是用来测试,很少用到。
      -in 指定从哪个文件中读取
      -key 表示私钥文件所在
      -new  制作证书申请
      -days num  期望使用期限
  # openssl req -new -key /path/to/private_key -out /paht/to/certificate.csr (csr:crtificate sign request证书签署请求)提取自己的公钥附加上个人信息做成。
  3、由CA负责签署证书;


openssl的配置文件
175308142.png



如何自建CA:
# cd /etc/pki/CA/
1、为CA生成一个私钥:
# (umask 077; openssl genrsa -out private/cakey.pem 2048)
2、生成自签证书:
# openssl req -new -x509(指定证书格式,说明自签,有,说明是自签,没有,是制作申请) -key private/cakey.pem -out cacert.pem -days 3650
# touch index.txt serial
# echo 01 > serial
3、签署证书:
# openssl ca -in /path/to/certreq.csr -out /path/to/certfile.crt(证书文件都以crt结尾) -days 365
是一个数字签名的过程
数字签名:发送方使用单向取得数据特征码,并使用自己的私钥加密此段特征码的操作;保证这是自己的东西,是独一无二的。

专用客户端测试工具:
# openssl s_client -connect HOST:PORT(哪个服务器哪个端口测试) -CAfile(CA文件所在) /path/to/cacertfile|-CApath(CA路径) /paht/to/cacertfiles_dir/ -ssl2|-ssl3|-tls1 (协议版本)-state 显示状态

openssl中有如下后缀名的文件
.key格式:私有的密钥
.crt格式:证书文件,certificate的缩写
.csr格式:证书签名请求(证书请求文件),含有公钥信息,certificate signing request的缩写
.crl格式:证书吊销列表,Certificate Revocation List的缩写
.pem格式:用于导出,导入证书时候的证书的格式,有证书开头,结尾的格式

常用证书协议
x509v3: IETF的证书标准
x.500:目录的标准
SCEP:  简单证书申请协议,用http来进行申请,数据有PKCS#7封装,数据其实格式也是PKCS#10的
PKCS#7:  是封装数据的标准,可以放置证书和一些请求信息
PKCS#10:  用于离线证书申请的证书申请的数据格式,注意数据包是使用PKCS#7封装这个数据
PKCS#12:  用于一个单一文件中交换公共和私有对象,就是公钥,私钥和证书,这些信息进行打包,加密放在存储目录中,CISCO放在NVRAM中,用户可以导出,以防证书服务器挂掉可以进行相应恢复。思科是.p12,微软是.pfx


自建CA,颁发证书,并使用证书,过程详解

第一步:自建CA

# yum -y install openssl
# cd /etc/pki/CA
# vim /etc/pki/tls/openssl.cnf

打开文件,可以看到CA目录下都需要哪些文件和目录,注意,给CA创建的私钥文件名称必须是cakey.pem,CA证书的名字也必须为cacert.perm,或者修改了配置文件中定义的目录和文件,否则,创建给别人签证的时候会报错。

# (umask 077;openssl genrsa -out private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
.......................+++
.........+++
e is 65537 (0x10001)

CA生成私钥

Umask 077 定义了私钥文件的权限,不让其他用户访问。

# openssl req -new -x509 -key private/cakey.pem-out cacert.pem -days 365
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) []:henan
Locality Name (eg, city) [Default City]:zhengzhou
Organization Name (eg, company) [Default Company Ltd]:magedu
Organizational Unit Name (eg, section) []:tech
Common Name (eg, your name or your server's hostname) []:www.magedu.com
Email Address []:magedu@magedu.com

CA证书生成成功,以上缩写的内容,申请证书者申请的时候,填写前五项必须与之保持一致,第六项是申请者建立网站时候的网址名称,莫要填错。

# touch index.txt serial

创建出必要文件,index.txt是数据文件,serialCA颁发证书的序列号。

# echo 01 > serial

-------------注意,这里的01不能写成1,否则也会报错。


CA给自己颁发证书,序列号为1.至此,CA自建证书完毕。

第二步:配置web网站,新建虚拟主机

# yum -y install httpd

安装web服务应用程序包

这里以虚拟主机为例,配置一台虚拟主机。

首先

在主配置文件/etc/httpd/conf/httpd.conf中注释掉主服务器的DocumentRoot /var/www/html

然后新建虚拟主机

<VirtualHost 172.16.254.1:80>
ServerName www.a.com
DocumentRoot "/www/website/"
ErrorLog /www/website/logs/error.log
CustomLog /www/website/logs/access.log common
</VirtualHost>

index.html中随便写上一段话,这是网站的首页。

然后在物理机hosts文件中配置解析

081108904.png

目录下边有个hosts文件

081147601.png

然后就可以在浏览器里搜索www.a.com了。

不过这里可能会遇到问题,我就遇到了一个很让人头疼的问题,浏览器死活连接不上,原因可能是防火墙的问题,这时就需要关掉防火墙了。

# chkconfig iptables off
# service iptables stop

好了,虚拟web主机建好了,下面开始建openssl

Openssl除了可以实现自签证书,还可以为web服务器提供ssl服务。

Ssl服务对于ip是一对一的,有一个虚拟主机,就可以配置一个ssl服务。


第三步:Ssl服务的配置

安装mod_ssl模块

# yum -y install mod_ssl

Ssl服务的配置文件/etc/httpd/conf.d/ssl.conf

在编辑ssl配置文件之前,要先为web服务器颁发一个证书。

Web服务器自己生成一个证书请求

# cd /etc/httpd
# (umask 077;openssl genrsa -out private.key 2048)
Generating RSA private key, 2048 bit long modulus
.............................................................................................................................................+++
...+++
e is 65537 (0x10001)
[root@luliming httpd]# openssl req -new -key private.key -out private.csr
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) []:henan
Locality Name (eg, city) [Default City]:zhengzhou
Organization Name (eg, company) [Default Company Ltd]:magedu
Organizational Unit Name (eg, section) []:tech
Common Name (eg, your name or your server's hostname) []:www.a.com
Email Address []:magedu@163.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
# ls
conf  conf.d  logs  modules  private.csr  private.key  run

CA为它颁发证书,注意,由于笔者是在同一台电脑上配置的,本机就是CA机关,所以,直接在/etc/httpd/目录下为web服务器颁发ca证书,如果不是在同一台主机,还需要web服务器向CA发送申请,由CA为其签署。

签证

openssl ca -in private.csr -out private.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Aug 22 22:25:47 2013 GMT
            Not After : Aug 22 22:25:47 2014 GMT
        Subject:
            countryName               = cn
            stateOrProvinceName       = henan
            organizationName          = magedu
            organizationalUnitName    = tech
            commonName                = www.a.com
            emailAddress              = magedu@163.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                6B:A2:C3:A9:E3:A4:49:28:23:40:DA:77:3F:5B:94:28:EA:34:E3:4B
            X509v3 Authority Key Identifier:
                keyid:14:45:59:59:0C:93:35:19:72:18:FA:EE:FA:56:7A:AE:8A:07:E8:D2
Certificate is to be certified until Aug 22 22:25:47 2014 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

编辑配置文件

#vim /etc/httpd/conf.d/ssl.conf

需要修改的配置:

<VirtualHost 172.16.254.1:443>
DocumentRoot "/www/website1"
ServerName www.a.com:443
SSLCertificateFile /etc/httpd/private.crt--------------CA为ssl服务器签的证书
SSLCertificateKeyFile /etc/httpd/private.key--------ssl服务器自己生成的私钥

至此,一切配置告终,下面由另一台客户机访问web服务器站点:www.a.com

步骤:

1,下载CA发布的CA自己的证书,然后安装。

CA做了一个ftp服务器为例,客户机下载

# chkconfig vsftpd on----------启用ftp服务
# service vsftpd start

081420631.png

将证书下载下来后,右键连接另存为同时修改格式为cacert.crt

2,安装证书

081448192.png

CA的证书

081510914.png

选择受信任的证书颁发机构

081536740.png

选是,导入证书成功。

3,访问CA签过证书的网站www.web.com

081557620.png

081558359.png

081600628.png

081602990.png

到此,验证了,这个 网站的证书确实是CA机构给颁发的,是受信任的站点,接下来的操作都是经过加密的,有一定的安全机制在里面,可以放心做各种操作了。