码迷,mamicode.com
首页 > Web开发 > 详细

HTTPS

时间:2018-03-11 17:13:47      阅读:587      评论:0      收藏:0      [点我收藏+]

标签:网络安全

HTTPS

第1章  关于网络安全问题

1.1 网络安全涉及的问题:

数据机密性问题    ---数据可能会被第三方看到

数据完整性问题    ---传输的数据不能随意让任何人进行修改

身份验证问题      ---第一次进行通讯时,需要确认通讯双方的身份确认

1.1.1 数据机密性问题解决

a.       利用普通加密算法解决机密性问题

利用相应算法,对传输数据进行加密,再利用这个算法解密成真实数据

优点:实现了数据机密传输,避免了明文传输数据的危险性

缺点:利用机密算法,将明文改成密文,如果第三方获得加密算法,即可将传输密文再次变为明文

b.      利用对称加密算法解决机密性(重要的一种加密方式)

对称加密算法就好比将普通算法的规则手册放入到保险柜里,只有获取保险柜和保险柜钥匙才能获取算法手册

优点:密钥加密算法计算速度非常快,解决普通加密算法的安全问题

缺点:加解密过程的安全性完全依赖于密钥,并且对称加密密钥时公开的,当通讯对象过多时,无法解决密钥管理问题

1.1.2 数据完整性问题解决

1.1.2.1  利用单项加密算法(全网备份数据完整性)

根据数据生成特征码(数据指纹信息),接受数据防获取数据信息算出特征码,验证是否与发送过来的特征码相同

若特征码一致,表示数据完整性没有被破坏,若特征码不一致,表示数据被破坏,直接丢弃

扩展说明:

不同数据的特征码(数据指纹信息)是不可能一致的

                                              技术分享图片

优点:有效的解决了数据完整性的问题

缺点:没有考虑中间人攻击对数据信息的影响

a.       利用单项加密算法(加密特征码)

利用对称加密算法对数据加密的同时,也对特征码进行加密接收方拥有和发送方一样的密钥,才可以解密加密后的数据和特征码,而中间人的加密的特征码是没有办法让接收方进行解密的,所以接收方获取不了特征码,,接丢弃数据

扩展说明:

对称密钥如何有效的让通讯双方获取呢?

需要实现密钥协商过程,即通过密钥交换机制,实现密钥交换机制的协议称为diffie-hellman协议

1.1.3 身份验证问题解决办法:

a.       利用非对称密钥加密算法(公钥加密算法)

发送方建立私钥和公钥,将公钥发送给接受方,从而实现发送数据方的身份验证

1.2 网络安全问题结论:实现网络安全性需要解决问题的顺序为:

1.      身份验证问题

2.      数据完整性问题

3.      数据机密性问题

1.3 网络安全证书由来:

根据上述结论可知,网络安全性最首先要解决的就是身份验证问题,而解决身份验证问题,最主要的方式就是借助私钥和公钥,而最主要的公钥信息获取就变得非常重要,利用第三方公正者,公正公钥信息

目前,标准的证书存储格式是x509,还有其他的证书格式等,

证书需要包含的内容为: 证书×××

                                          公钥信息,以及证书过期时间

                                        证书该如何被使用     不用关注

                                          ca颁发机构信息

                                         ca签名的校验码

1.4 总结生成随机数的方法:

第2章 openssl软件详细说明:

用途:openssl就是一个模拟ca的行为的工具,有了它你就是一个ca,可以签发请求证书文件,以及生成crl列表

2.1 查看openssl版本信息:

[root@web01 ~]# openssl version

OpenSSL 1.0.1e-fips 11 Feb 2013

2.2 获取openssl配置文件信息:

[root@web01 ~]# cat /etc/pki/tls/openssl.cnf       此配置文件350多行,主要用与配置成私有ca时使用

2.2.1 举例说明:加密一个文件

[root@web01 tmp]# cat jiang.txt

nihaojintian

[root@web01 tmp]# openssl enc -des3 -salt -a -in jiang.txt -out ceshi

enter des-ede3-cbc encryption password:

Verifying - enter des-ede3-cbc encryption password:

[root@web01 tmp]# ll

total 8

-rw-r--r--  1 root root 45 Mar  2 14:42 ceshi

-rw-r--r--  1 root root 14 Mar  2 14:41 jiang.txt

 

[root@web01 tmp]# openssl enc -des3 -salt -a -in ceshi -out jiang.txt

enter des-ede3-cbc encryption password:

Verifying - enter des-ede3-cbc encryption password:

[root@web01 tmp]# cat jiang.txt

U2FsdGVkX1+37dvGJAqspOZLFKPkK1TCnaJjC7VRCooj8d27d4pZIH5ySlM1xLi1

N2Z+QwCHMP/3kquYrO/3Aw==

salt参数,主要用于避免密码加密后,对密码串的反推

2.3 生成和用户一样的密码串

openssl passwd -1

2.4 生成伪随机数方法:

[root@web01 tmp]# openssl rand -base64 22

atl7XjeNmYKhmmjezbNQm1aLFSbE0g==

openssl软件建立私有ca(证书颁发机构)

第3章 实现https:

3.1 生产环境中实现过程:

1.      生成私钥(相当于出生证明)和请求证书文件(户口本)

2.      根据请求的证书文件信息,证书机构生成证书文件(×××)

3.      企业网站利用证书,实现用户安全认证访问

3.2 模拟证书颁发机构颁发程序:

3.2.1 生成私钥文件信息的三种方法:

[root@web01 server]# mkdir key

[root@web01 key]# openssl genrsa 128 >server.key                       ---128表示指定生成私钥的长度

[root@web01 key]# openssl genrsa -out server.key 128

[root@web01 key]# (umask 077;openssl genrsa -out server1024.key 1024)  ---利用小括号实现子shell功能

3.2.2 生成一个随机密码串:

[root@web01 key]# openssl passwd 2344555

3DavZjsuEfQ1A

说明:在企业中,用户可能会忘记自己的密码,这时需要工作人员帮助其进行重置密码,可利用openssl命令生成加密信息,复制到数据库中,将密码告知用户,并当用户登录后及时修改密码

3.2.3 生成自签署的证书:

[root@web01 key]# openssl req -new -x509 -key server1024.key -out server.crt -days 365

req     ---用与创建新的证书

new    ---表示创建的是新的证书

x509   ---表示定义证书的格式为标准格式

key    ---表示调用的私钥文件信息

out    ---表示输出证书文件信息

days   ---表示证书的有效期

    Country Name (2 letter code) [XX]:CN                    <- 定义生成证书的国家

    State or Province Name (full name) []:BJ                <- 定义生成证书的省份

    Locality Name (eg, city) [Default City]:BJ              <- 定义生成证书的城市

    Organization Name (eg, company) [Default Company Ltd]:oldboy        <- 定义生成证书的组织

    Organizational Unit Name (eg, section) []:it                        <- 定义生成证书的职能部门

Common Name (eg, your name or your server's hostname) []:oldboy.com.cn    <- 定义主机服务器名称

[root@web01 key]# openssl x509 -text -in server.crt      查看证书中的信息

3.2.4 ca自签发证书实际创建过程

[root@web01 key]# cd /etc/pki/CA/private/         进入到私钥保存目录

[root@web01 private]# (umask 077;openssl genrsa -out ./cakey.pem 2048)          创建一个ca私钥文件

[root@web01 private]# cd /etc/pki/CA/             进入到ca自签发保存目录

[root@web01 CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem  生成自签发证书

第4章 利用证书实现https访问nginx服务:

4.1 安装openssl软件:

# yum install openssl

# yum install openssl-devel

4.2 进行证书目录规划

[root@web01 CA]# cd /application/nginx/conf

[root@web01 conf]# mkdir key

4.3 创建私钥文件       ----生成自己的身份信息

创建服务器私钥,命令会让你输入一个口令:这里是jiang

[root@web01 conf]# openssl genrsa -des3 -out server.key 1024

Generating RSA private key, 1024 bit long modulus

.++++++

.++++++

e is 65537 (0x10001)

Enter pass phrase for server.key:jiang

Verifying - Enter pass phrase for server.key:jiang

4.4 创建请求证书:

创建签名请求的证书(CSR):

[root@web01 key]# openssl req -new -key server.key -out server.csr

扩展说明:去掉私钥文件口令密码信息

[root@web01 key]# cp  server.key  server.key.org

[root@web01 key]# openssl rsa -in server.key.org  -out server.key

4.5 配置nginx服务,使其支持证书访问:

       server {

           server_name YOUR_DOMAINNAME_HERE;

           listen    443;

           ssl        on;

           ssl_certificate     /application/nginx/conf/key/server.crt;

           ssl_certificate_key /application/nginx/conf/key/server.key;

       }

4.6 单台web实现http访问自动跳转到https:

4.6.1 方法一:利用优雅显示错误跳转功能实现---497内置错误码

[root@web01 conf]# vim nginx.conf

    server {

        listen       443;

        listen       80;

        ssl          on;

        ssl_certificate /server/key/server.crt;

        ssl_certificate_key /server/key/server1024.key;

        server_name  blog.etiantian.org;

        location / {

            root     html/blog;

            index    index.php index.html index.htm;

        }

        error_page   500 502 503 504  /50x.html;

        error_page   497      https://$host$uri;

        location = /50x.html {

            root     html;

        }

        location ~* .*\.(php|php5)?$ {

           root      html/blog;

           fastcgi_pass  127.0.0.1:9000;

           fastcgi_index index.php;

           include fastcgi.conf;

        }

     }

4.6.2 方法二:利用地址重写,实现80端口跳转443端口

    server {

        listen 80;

        server_name blog.etiantian.org;

        rewrite ^(.*)$ https://$host$1 permanent;

          }           http模块中假如即可

4.6.3 方法三:利用返回状态码实现跳转访问

    server {

        listen 80;

        server_name blog.etiantian.org;

        return 301 https://$host$uri;

        }

4.7 利用反向代理服务器进行http跳转到https:

负载均衡的配置文件,但是这只是客户访问https,访问http时将会报错

[root@lb01 conf]# vim nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile           on;

    keepalive_timeout  65;

    upstream server_pools {

      server 10.0.0.7:443;

    }

    server {

        listen 443;

            server_name blog.etiantian.org;

            ssl on;

            ssl_certificate     /application/nginx/conf/key/server.crt;

            ssl_certificate_key /application/nginx/conf/key/server1024.key;

        location / {

            proxy_pass       https://server_pools;

            proxy_set_header Host $host;

            proxy_set_header X-Forwarded-For $remote_addr;

        }

    }

}

进一步完善nginx配置文件:增加跳转信息,实现客户访问80端口跳转到443端口

4.7.1 第一种方法:

[root@lb01 conf]# cat nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile           on;

    keepalive_timeout  65;                                

    upstream server_pools {

      server 10.0.0.7:443;

    }

    server {

        listen 80;

        server_name blog.etiantian.org;

        rewrite ^(.*)$ https://$host$1 permanent;

          }

    server {

        listen 443;

            server_name blog.etiantian.org;

            ssl on;

            ssl_certificate     /application/nginx/conf/key/server.crt;

            ssl_certificate_key /application/nginx/conf/key/server1024.key;

        location / {

            proxy_pass       https://server_pools;

            proxy_set_header Host $host;

            proxy_set_header X-Forwarded-For $remote_addr;

        }

    }

}

4.7.2 第二种方法:根据返回状态码进行跳转,如果返回什么状态码,我就进行跳转

[root@lb01 conf]# cat nginx.conf

worker_processes  1;

events {

    worker_connections  1024;

}

http {

    include       mime.types;

    default_type  application/octet-stream;

    sendfile           on;

    keepalive_timeout  65;                                

    upstream server_pools {

      server 10.0.0.7:443;

    }

    server {

        listen 80;

        server_name blog.etiantian.org;

        return 301 https://$host$uri;

        }

    server {

        listen 443;

            server_name blog.etiantian.org;

            ssl on;

            ssl_certificate     /application/nginx/conf/key/server.crt;

            ssl_certificate_key /application/nginx/conf/key/server1024.key;

        location / {

            proxy_pass       https://server_pools;

            proxy_set_header Host $host;

            proxy_set_header X-Forwarded-For $remote_addr;

        }

    }

}

第5章 关于nginxssl模块:

5.1 ssl模块:

            ssl on;                                                            表示开启ssl

            ssl_certificate     /application/nginx/conf/key/server.crt;        私钥文件位置

            ssl_certificate_key /application/nginx/conf/key/server1024.key;    请求证书位置

技术分享图片指定一个文件,其中宝库pem格式的ca证书,用于在启用ssl_stapling的情况下验证客户端证书和ocsp响应

 

技术分享图片

off---关闭此功能

none  ---缓慢使用会话缓存,但是nginx会告诉客户端会话可能会被重用,实际上不会将会话参数存储在缓存中

builtin   使用openssl内建缓存,为每worker进程私有

shared  在个worker之间使用一个共享的缓存

ssl_session_timeout   客户端可以复用ssl session cache中缓存的ssl桉树的有效时长

 

5.2 隐藏版本信息:

server_tokens off;     表示http响应报文中nginx版本号的显示

                    添加在http模块中即可

5.3 路径别名alias:

http://www.magedu.com/bbs/index.php

location /bbs/ {

    alias /web/forum/;

} --> /web/forum/index.html

location /bbs/ {

    root /web/forum/;

}     --> /web/forum/bbs/index.html

root  表示追加在root目录后面

alias  表示对location中的url进行替换

5.4 nginx缓存功能

nginx为什么要有缓存的这个功能?

缓存nginx的静态文件,因为这些文件都不是经常更新,便于缓存以减轻服务器的压力,另外,假如服务器有宕机的情况发生,对于用户发起的一些访问,web集群仍然可以进行处理

怎样实现nginx的缓存功能呢?proxy_cache就可以帮我们实现

proxy_cache zone | off;

定义用于缓存的共享内存区域,同一个区域可以在几个地方使用


proxy_cache_background_update
 on | off;

允许后台子请求来更新过期的缓存项目,而过时的缓存响应则返回给客户端,这里注意,有必要在更新时允许使用陈旧的缓存响应

proxy_cache_bypass string ...;

定义不会从缓存中获取响应的条件

proxy_cache_convert_head on | off;

启用或者禁用,head方法转换为get进行缓存,禁用转换时,应将缓存配置为包含$request_method

proxy_cache_key string;

定义缓存的关键字

proxy_cache_path path [levels=levels] [use_temp_path=on|offkeys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];

设置缓存的路径和其他参数,缓存数据存储在文件中,缓存中的文件名是将MD5函数应用于缓存件的结果,level参数定义缓存的层次结构级别,

proxy_cache_valid

为不同的响应状态码设置不同的缓存时间

 

 

 

 

 

 

第6章 openssl配置文件说明:

技术分享图片

技术分享图片

技术分享图片


HTTPS

标签:网络安全

原文地址:http://blog.51cto.com/13520772/2085155

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