Openssl软件部署过程与介绍

OpenSSL

OpenSSL软件介绍

Netscape网景公司生产了最初的浏览器,但为了提高浏览器访问页面的安全性,对TCP/IP模型进行了一定改进,在传输层与应用层之间,创建了一个3.5层的概念,称为SSL((Secure Sockets Layer 安全套接层))层,SSL不是一个软件,只是一个库,让应用层将数据传输到传输层前,调用了ssl层的功能对数据进行了加密,目前比较流行的版本是(SSLv2 v3),但是SSL是netscape公司进行定义的,不够开放性,因此为了使加密功能更加开放,TSL(传输层安全协议)协议就出现了,目前比较流行的版本是(TSLv1==ssl v3),TSL更像是传输层上实现的数据加密。

SSL数据通讯实现原理

由于借助SSL实现安全数据通讯的方式比较多,本文只以最基本的HTTP协议为例,了解一下SSL数据安全通讯的过程。具体实现过程说明如下:

  1. http是基于tcp协议进行建立的,因此在建立tcp连接之前要先进行tcp的三次握手过程
  2. 三次握手之后,不马上进行数据的传输,而是进行SSL的建立
  3. 客户端首先向服务器端发起数据传输请求,但服务端不会回复http数据包,而是与客户端一来一回协商生成/建立SSL会话,确认是选用SSLv2还是SSLv3,TSL协议,并且还要协商加密算法。
  4. 服务端与客户端的加密协议协商好后,服务端会将自己的证书发送给客户端
  5. 客户端在获取到证书后,先进行对证书的验证,确认是否是信任机构颁发的,并且验证证书是否是完整的,以及确认证书是没有注销的,验证完毕后,获得的证书中的公钥就可以进行使用了
  6. 证书合法性验证完毕后,客户端会建立生成一个会话密钥
  7. 客户端选择随机数生成一个随机密钥,并且利用服务端的公钥对随机密钥进行加密,发给服务端
  8. 服务器端收到公钥加密的数据,就可以利用自己的私钥进行解密,获得对称密钥,就可以对传输数据进行加密了

OpenSSL软件概念说明

ssl功能的开源实现,就称为openssl,功能非常强大,几乎实现了市面上主流的加密算法,并且工作性能非常的好。openssl的官方链接:http://openssl.org/

OpenSSL软件组成

openssl是由三部分组成:
1.libcrpto:通用加密库
2.libssl:TSL/SSL功能的实现,基于会话的,实现了身份认证,数据机密性和会话完整性的TSL/SSL库
3.openssl:提供的命令行工具,多用途命令工具,模拟实现私有证书颁发机构;命令行工具是通过多种子命令实现openssl的相应功能

OpenSSL软件详细说明

01. 获取OpenSSL软件的版本信息:

openssl version  <- 查看openssl版本信息

02.获取OpenSSL配置文件信息:

/etc/pki/tls/openssl.cnf  <- openssl配置文件,主要用于配置成私有ca时进行使用

03.获取OpenSSL命令详细参数:

[root@web01 ~]# openssl ?
openssl:Error: '?' 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              

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                
bf-cbc            bf-cfb            bf-ecb            bf-ofb            
camellia-128-cbc  camellia-128-ecb  camellia-192-cbc  camellia-192-ecb  
camellia-256-cbc  camellia-256-ecb  cast              cast-cbc          
cast5-cbc         cast5-cfb         cast5-ecb         cast5-ofb         
des               des-cbc           des-cfb           des-ecb           
des-ede           des-ede-cbc       des-ede-cfb       des-ede-ofb       
des-ede3          des-ede3-cbc      des-ede3-cfb      des-ede3-ofb      
des-ofb           des3              desx              idea              
idea-cbc          idea-cfb          idea-ecb          idea-ofb          
rc2               rc2-40-cbc        rc2-64-cbc        rc2-cbc           
rc2-cfb           rc2-ecb           rc2-ofb           rc4               
rc4-40            seed              seed-cbc          seed-cfb          
seed-ecb          seed-ofb          zlib              

[root@web01 ~]#openssl speed   <- 测试当前主机对所有openssl支持的加密算法的加密速度进行测试显示,同时也对服务器性能做一个测试
# 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]
  ciphername            <- 指定加密的算法
  [-in filename]            <- 指定要加密的文件
  [-out filename]            <- 指定加密后输出的文件
  [-e] [-d]                 <- e是加密文件,d是解密文件,不指定默认就是加密的
  [-a]                    <- 基于base64位进行编码,可选参数

#举例说明,加密一个文件
# openssl enc -des3 -salt -a -in inittab -out initab.des3        <- 输入密码后即加密成功
# openssl enc -des3 -d -salt -a -in initab.des3 -out inittab     <- 输入密钥后即解密成功
说明:其中命令中的salt参数,主要用于避免密码加密后,对密钥串的反推

#输出一个文件的特征码方式
md5sum inittab
sha1sum inittab 
openssl dgst -sha1 inittab             <- 利用openssl生成文件特征码
dgst---表示指定使用信息摘要命令
-sha1---表示指定摘要命令选用sha1算法 

#生成和用户一样的密码串
openssl passwd -1                    <- 采用md5加密用户密码串

#生成伪随机数方法
openssl rand -base64 45                <- 给出一个任意的数字,就会生成任意的随机数

利用OpenSSL软件实现HTTPS访问过程

第一步:创建一个私钥文件(运维人员需要会)

[root@web01 serv_key]# openssl genrsa 2048 > server.key --->创建私钥信息,并指定私钥长度为2048,将生成的私钥信息保存在一个文件中
Generating RSA private key, 2048 bit long modulus
...................................................................................
............................................................+++...................+++
e is 65537 (0x10001)
[root@web01 serv_key]# (umask 077;openssl genrsa -out server.key 2048) -->将私钥信息直接进行保存,加密长度一定人放在输出文件后台,同时临时修改umask,将文件的权限变为600
Generating RSA private key, 2048 bit long modulus
.....+++
........................+++
e is 65537 (0x10001)
[root@web01 serv_key]# ll
total 4
-rw-r--r-- 1 root root 1679 Mar  1 10:49 server.key
[root@web01 serv_key]# 

第二步:生成证书文件信息

1.生成自签发证书(运维人员可以自行操作)

[root@web01 serv_key]# openssl req -new -x509 -key server.key -out server.crt -days
req  ------> 用于请求创建一个证书文件
new  ------>表示创建的是新的证书
x509 ------>表示定义证书的格式为标准格式
key  ------>表示调用的私钥文件信息
out  ------>表示输出证书文件信息
days ------->表示证书的有效期
 365You 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) []:gd <---- 定义生成证书的省份
Locality Name (eg, city) [Default City]:gz <---- 定义生成证书的城市
Organization Name (eg, company) [Default Company Ltd]:baidu <---- 定义生成证书的组织
Organizational Unit Name (eg, section) []:it <- 定义生成证书的职能部门
Common Name (eg, your name or your server's hostname) []:web01 <---- 定义主机服务器名称
说明:此输出信息非常重要,客户端在获取证书前,会利用主机名与相应服务器之间建立连接,然后获得证书
Email Address []:liuyang97@baidu.com

2.向证书颁发机构申请证书(ca证书机械完成)

1.生成请求的证书文件
[root@web01 serv_key]# openssl req -new -key server.key -out server_new.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) []:gd
Locality Name (eg, city) [Default City]:gz
Organization Name (eg, company) [Default Company Ltd]:baidu
Organizational Unit Name (eg, section) []:it
Common Name (eg, your name or your server's hostname) []:web01
Email Address []:liuyang97@baidu.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:liuyang1     <-- 设置证书的密码信息
An optional company name []:liuyang1  <-- 确认证书的密码信息
[root@web01 serv_key]# ll
total 12
-rw-r--r-- 1 root root 1367 Mar  1 10:59 server.crt
-rw------- 1 root root 1675 Mar  1 10:52 server.key
-rw-r--r-- 1 root root 1094 Mar  1 11:07 server_new.csr
3.将生成的证书文件发给证书机构,证书机构会返还一个公钥回来

第三步:配置Nginx负载均衡服务器配置,加载私钥和证书信息

[root@lb01 server_key]# cat /application/nginx/conf/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream oldboy {
       server 10.0.0.7:80;
       server 10.0.0.8:80;
       server 10.0.0.9:80;    
     }
    #永久定向
    server {
        listen 80;
        server_name www1.etiantian.org;
        rewrite ^(.*)$ https://$host$1 permanent;

    }
    #ssl认证
    server {
        listen  10.0.0.3:443 ssl;
        server_name www1.etiantian.org;
        ssl_certificate /server/server_key/server.crt;
        ssl_certificate_key /server/server_key/server.key;
        root   html;
        index  index.html index.htm;
        location / {
           proxy_pass http://oldboy;
           proxy_set_header Host $host;
           proxy_set_header X-Forwarded-For $remote_addr;
        }
    }
    server {
        listen 10.0.0.4:80;
        server_name bbs.etiantian.org;
        root   html;
        index  index.html index.htm;
        location / {
           proxy_pass http://oldboy;
           proxy_set_header Host $host;
           proxy_set_header X-Forwarded-For $remote_addr;
        }
    }
}
[root@lb01 server_key]# 

第四步:测试访问

访问www1.etiantian.org会自动跳转

访问bbs正常访问

posted @ 2019-03-11 09:32  游走在边缘的人  阅读(3088)  评论(0编辑  收藏  举报