web之三建立https

书接上文,复习一条:elinks -dump:获取到页面数据后直接退出进程。我们的keepAlive在根据需求定义不同的时长,如果繁忙,则调短一些。

如何将http使用成https

ssl:secure socket layer 安全套接字层

ssv1

ssv2

ssv3 ~tls1

tls  传输层安全

因为http协议时明文的,基于文本编码。

telnet

使用telnet发起请求,此时我们的服务器仍是192.168.1.126

而我们的客户端多了一个192.168.1.134了

[[email protected] cdrom]# telnet 192.168.1.126 80
Trying 192.168.1.126...
Connected to 192.168.1.126.
Escape character is ‘^]‘.
GET /index.html HTTP/1.0
Host: www.bigfire.com

HTTP/1.1 200 OK
Date: Sun, 10 Aug 2014 01:18:18 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Sat, 09 Aug 2014 21:18:22 GMT
ETag: "a0008-e-50038dc9ae2ea"
Accept-Ranges: bytes
Content-Length: 14
Connection: close
Content-Type: text/html; charset=UTF-8

this is host2 网页内容
Connection closed by foreign host.这里http1.0不支持持久连接,所以网页资源一旦全部响应完了,服务就都全断开了。

如果我们想在telnet使用中,连接使用KeepAlive,需要在配置文件里找到它,把它ON起来。这也验证http是明文的。

在笔者做实验的时候出了点小问题,笔者的服务器开启了KeepAlive服务,但是用telnet连接的时候由于把http/1.1写成了http空格/1.1,结果输出结果就一下断开。这里与大家分享,希望引以为戒。

在tcp/ip模型下,如果应用层本身不具备加密功能,则整个tcp/ip传输都是明文的方式的,如果我们想在连接的时候加密怎么办?

1、客户端与服务器的程序两者之间本身是加密的,如:浏览器是加密的,程序自身也是加密的,但是这样,我们要在应用层协议做统一和规范就很难。

则2、 在模型中,应用层与传输层增加了半个层,叫做ssl层。它的实现是OpenSSL的库文件实现的,叫libssl,httpd程序开发时,一旦调用了OpenSSL库的接口,则

httpd:对ssl功能启用与否,在于httpd是否加载了ssl模块。ssl是个模块是单独成包的。

我们使用yum list all mod*

可以查找到mod_ssl信息,然后用yum info mod_ssl,如下:

[[email protected] ~]# yum info mod_ssl
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
Available Packages
Name        : mod_ssl
Arch        : x86_64
Epoch       : 1
Version     : 2.2.15
Release     : 29.el6.centos
Size        : 90 k
Repo        : new1
Summary     : SSL/TLS module for the Apache HTTP Server
URL         : http://httpd.apache.org

如果想使用https,需要先安装并加载mod_ssl模块才能使用。

再次回顾下ssl的会话当客户端和服务器端要基于ssl,由于ssl在tcp/ip协议之上,意味借助tcp协议本身来实现ssl报文的传输,由此当客户端向服务器端发出请求之后,接下来tcp三次握手之一次握手,客户端在浏览器中输入地址,DNS会解析域名到ip地址,这时ip地址进行交互。在三次握手完成之前,http的请求报文并没有发送过去。当三次握手建立成功,服务器发现http的请求是https,它要基于SSL进行会话,它再次建立基于SSL会话的握手,双方要协商如何实现加密通信。协商内容比如:双方都支持使用什么对称加密方式、双方支持什么公钥加密方式,双方使用SSL协议的版本。等等

接下来开始实现数据加密,但是有个前提,需要密钥交换的,如何实现密钥交换,比如你新访问一个站点,怎么获得密钥呢?去验证服务器端的证书,服务器要发服务端的证书给客户端,服务端证书的名字一定是你在浏览器中输入的名称,服务端发来证书以后,要看看是哪个CA给服务器发的证书,接着验证证书有效性,比如检查CA的公钥能否解密签名,再用同样的单向加密的算法计算证书的指纹信息,比较特征码,没有问题的话,完整性就得到了校验。还需要验证证书是否有效,还验证在没在证书的吊销列表,当一切都检验妥当,才是SSL建立会话的过程。我们的客户端选择一个对称加密的密钥用服务器端的公钥加密以后发送给服务器端,因此服务器用自己的私钥解密来获得对称加密的密钥,然后用这个密钥加密网络文件再发给客户端。

ssl会话是基于ip地址建立的,仅仅是基于主机名验证你的证书,所以说只有ssl通道建立后,用户的请求才能达到服务器端。若你访问了虚拟主机,所有的虚拟主机只能使用同一个SSL进行通信。所以说,如果某公司做了三个网站,三个网站都是一个IP地址,三个网站没有办法同时使用SSL进行通话,只有一个才可以使用SSL通话的。否则证书会全部混乱。

故,每一个ip地址仅能创建一个ssl会话。

建立好了会话以后,如果还是工作在一个非持久连接的状态下,每一个的三次握手并且建立ssl会话通道、加密解密等等,会特别占用消耗。

ssl比http多了很多步骤,不管是服务器端还是客户端都有巨大压力,为了加速会话速度和cpu消耗,现在出现了很多本身就完成ssl会话支持加密的硬件芯片。

下图对比了http会话和基于ssl通道的https会话。

未加密的http事务,都是tcp发送和响应请求的,然后在关闭。

https中多了ssl连接和断开,多消耗很多资源,对CPU压力很大。

https中很重要的还是证书,证书格式如下:

证书版本号

证书序列号

证书签名算法

证书颁发者

证书有效期

对象的名称(需要与服务器的主机名保持一致)

对象的公钥

其他信息

CA的数字签名

Ra ca CTL还有证书存取库  共称为PKI,核心是CA

ssl握手要完成的工作

交换协议版本号,选择双方都支持的加密方式,客户端向服务器端都实现身份验证,(解密对方上的证书签名)密钥交换(客户端要选择一个对称加密的密钥交换,然后用对方的公钥加密后传递给对方)。所以http称为https,http是文本编码,而https是基于ssl做二进制编码的。

因此我们的服务器是https,我们客户端想基于ssl做认证,要使用Openssl+s_client的工具与服务器端做交互。能够证明证书有效性,能够与对方做协商以及数据加密解密传输。

https将监听在443端口,不能在FQDN做认证。

客户端验证服务器端证书、

1.有效期的检测

2.CA的有效性检测(用本地的CA解密CA的签名,能则成功)

3、证书签名检测

4、持有者的身份验证。(看浏览器输入的名称是否跟CA颁发的证书上的主机名是否一致)

开始模拟建立https

一、 安装mod_ssl模块
        # yum install mod_ssl

rpm -ql mod_ssl
/etc/httpd/conf.d/ssl.conf

查看ssl.conf,看里面配置文件 是否开启叫SSLEngine

#   SSL Engine Switch:
#   Enable/Disable SSL for this virtual host.
SSLEngine on

<VirtualHost _default_:443>  默认在443上

# General setup for the virtual host, inherited from global configuration
#DocumentRoot "/var/www/html"这里的根目录文件默认被注释掉了
#ServerName www.example.com:443

一个网站很可能在浏览时是基于http的,一旦出现支付页面则需要开启https了。

二、为服务端器生成私钥(演示过程在同一主机上)

1.为CA生成私钥

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

查看CA私钥,是否是600权限。

[[email protected] CA]# ll private/
total 4
-rw------- 1 root root 1679 Aug 11 17:42 cakey.pem

2、生成自签证书,但要保证证书前面格式 一致。

openssl req -new -x509(表示自发自签,仅限个人做CA实验用) -key private/cakey.pem -out cacert.pem -days 360
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]: 一直到提示你输入CA证书格式信息

3.创建serial和index.txt,并且echo 01 > serial

4.cd到httpd目录内,在/etc/httpd中为httpd生成一个ssl目录,要给我们的服务器自己生成密钥。

另外还有生成一个证书签署软件,让CA给我们签。

openssl req –new –key httpd.key(对当前已经生成的密钥) –out httpd.csr(生成一个签名请求)1024 (长度为1024的)

在签署时这项很关键,要与你服务器的主机名保持一致。

由于本机也是CA,所以自签了。

按y继续。

ll查看当前目录,发现生成-rw-r--r-- 1 root root 3716 Aug 12 19:52 httpd.crt

然后返回到httpd目录下,并cd到conf.d目录下,编辑ssl.conf,找到SSL证书那

把刚才生成的路径文件填写到那里。因为刚才签署证书时使用的主机名是我们的www.aaabig.com,所以在/etc/httpd/conf/httpd.conf中找到对应的那个虚拟主机,然后在ssl.conf文件中找到DocumentRoot一项,改为对应虚拟主机的根文件目录保持一致。注意一个ip地址只能有一个ssl会话连接!

改掉以后重启服务

在浏览器中输入https://www.aaabig.com

显然是有证书的,但是客户端没有CA的公钥,无法验证证书的合法性。点锁查询证书信息。于是这样,利用xftp把证书传给windows一份,最好让它保存在一个良好的位置,然后在重命名为cacert.crt。

导入成功,找到证书文件,安装证书至受信任的证书中。

说明开始基于ssl开始进行会话了。

你想验证服务器的证书,你作为客户端首先要有CA的证书。我们使用命令行试试:

[[email protected] ~]# openssl s_client -connect 192.168.1.121:443
CONNECTED(00000003)
depth=0 C = CN, ST = hebei, O = mageedu, OU = ops, CN = www.aaabig.com
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 C = CN, ST = hebei, O = mageedu, OU = ops, CN = www.aaabig.com
verify error:num=27:certificate not trusted
verify return:1
depth=0 C = CN, ST = hebei, O = mageedu, OU = ops, CN = www.aaabig.com
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
0 s:/C=CN/ST=hebei/O=mageedu/OU=ops/CN=www.aaabig.com
   i:/C=CN/ST=hebei/L=baoding/O=mageedu/OU=ops/CN=caserver.mageedu.com
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDNjCCAh6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBuMQswCQYDVQQGEwJDTjEO
MAwGA1UECAwFaGViZWkxEDAOBgNVBAcMB2Jhb2RpbmcxEDAOBgNVBAoMB21hZ2Vl
ZHUxDDAKBgNVBAsMA29wczEdMBsGA1UEAwwUY2FzZXJ2ZXIubWFnZWVkdS5jb20w
HhcNMTQwODEyMTE1MjUwWhcNMTUwMjI4MTE1MjUwWjBWMQswCQYDVQQGEwJDTjEO
MAwGA1UECAwFaGViZWkxEDAOBgNVBAoMB21hZ2VlZHUxDDAKBgNVBAsMA29wczEX
Q+jhVPz7HKpOXoenXEeIRcr+DxPvcQJzjjfp70JdEPb3JJ/aIDrzMh716RnDsrHf
lOD/W9sid4niwg==
-----END CERTIFICATE-----
subject=/C=CN/ST=hebei/O=mageedu/OU=ops/CN=www.aaabig.com
issuer=/C=CN/ST=hebei/L=baoding/O=mageedu/OU=ops/CN=caserver.mageedu.com
---
No client certificate CA names sent
---
SSL handshake has read 1575 bytes and written 499 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-GCM-SHA384
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : DHE-RSA-AES256-GCM-SHA384
    Session-ID: 0129F689AB259250E90701FC73FF0B79DD7B62D9BBF7C7C475A48EAA63DC8FD9
    Session-ID-ctx:
    Master-Key: 9DD25205B672FD9A6ECF51DC8DF2CEEE1F9DBD49962972DD01E6231B1F8A3B4AA6909FBB1BA33CBF36D6AD665B550976
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 1d 5e f8 d1 15 0a 71 81-8d b6 ab 3c 43 e1 4a a3   .^....q....<C.J.
    0010 - 4c ef c6 fe 71 40 0d 6e-e0 92 78 91 79 9e f5 82   [email protected]
    0020 - d9 bb c5 72 38 29 0f 96-22 e5 34 3c 7a fd 99 c4   ...r8)..".4<z...
    0030 - 55 17 fc bd 9d 71 30 d3-71 e3 d4 f1 ee 2a 0b 85   U....q0.q....*..
    0040 - 23 eb 31 fa b8 7e 35 39-bc 8a e9 54 b5 72 d2 12   #.1..~59...T.r..
    0050 - e5 ae 32 b7 83 ff 08 51-b3 bb d7 e6 7c 59 d4 b3   ..2....Q....|Y..
    0060 - 3e 2f a0 5b 57 88 bb 30-e9 a6 72 22 d5 28 fc f5   >/.[W..0..r".(..
    0070 - b2 28 3c 5c ce 86 19 06-7d 08 39 48 c9 4b 24 02   .(<\....}.9H.K$.
    0080 - 8c a6 dc 52 19 4d 64 65-fd 20 10 7d c7 98 c7 fb   ...R.Mde. .}....
    0090 - f2 ac 06 a9 7a ca c5 da-9b 4d 58 09 f0 d1 d5 87   ....z....MX.....
    00a0 - 17 26 b5 0c fa 60 60 52-41 ae d8 2e 84 2b c2 89   .&...``RA....+..
    00b0 - 85 ed 0b 12 6a 55 f4 93-50 28 80 10 ee ba ee 9a   ....jU..P(......

Start Time: 1407901775
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)这边写着无法验证证书。只是对方服务器身份无法验证,不过会话可以建立。

如果我们仍想校验证书,可以利用scp 命令

[[email protected] ~]# scp 192.168.1.121:/etc/pki/CA/cacert.pem ./ 找到对方CA证书的位置,放到本地即可。

表明可以获取数据了。SSL会话通信成功,我们可以利用GET HTTP Host来获取信息

还可以设置keepAlive!

web之三建立https

时间: 2024-10-09 05:44:07

web之三建立https的相关文章

确保web安全的https、确认访问用户身份的认证(第七章、第八章)

第七章 确保web安全的https 1.http的缺点: (1)通信使用明文,内容可能会被窃听 (2)不验证通信方的身份,因此有可能遭遇伪装 (3)无法证明报文的完整性,因此有可能已遭篡改. 2.通信的加密 (1)http没有加密机制,但可以通过和SSL或TLS的组合使用,加密http的通信内容,与SSL组合的http被称为https (2)内容的加密,就是将需要传输的内容进行加密,不过这种还是有可能被篡改内容. 3.不验证通信方可能遭遇伪装 SSL不仅提供了加密处理,而且还使用了一种被称为证书

实现kbmmw web server 支持https

在以前的文章里面介绍过kbmmw 做web server. 前几天红鱼儿非要我给他做一个支持https 的web server. 其实kbmmw 支持https 有好几种方法: 1. 使用isapi 部署到iis 或者是apache 上,使用iis 或apache 的https 功能: 2.通过代理方式,使用使用iis 或apache 的https 功能. 今天通过kbmmw 的原生indy 方式实现一下https 支持. 由于是测试,不可能使用真正的证书服务.要应用到商业使用,要申请商用证书.

ASP.NET Web配置使用HTTPS实用案例

Step by Step 配置使用HTTPS的ASP.NET Web应用 有关HTTPS.SSL以及SSL证书的工作原理,参见 <HTTPS那些事(一)HTTPS原理> <HTTPS那些事(二)SSL证书> <HTTPS那些事(三)攻击实例与防御> 本文将演示如何在IIS中配置一个HTTPS的ASP.NET Web Application. (1)打开Internet Information Services (IIS) Manager (2)创建一个Self-Sign

py3 web.py转https://blog.csdn.net/weixin_42024288/article/details/80364441

https://blog.csdn.net/weixin_42024288/article/details/80364441 1.安装webpy模块: pip install web.py==0.40.dev 另外将: C:\Python34\Lib\site-packages\web.py-0.40.dev0-py3.4.egg\web\template.py 中约1022行return Template(open(path).read(), filename=path, **self._ke

HTTP协议(二)之确保web安全的HTTPS

一.概述 https并非是应用层的一种新协议.只是HTTP通信接口部分用SSL和TLS协议替代. 通常,HTTP直接和TCP通信.当使用SSL时,则演变成先和SSL通信,再由SSL和TCP通信了. 简而言之,所谓HTTPS其实就是身披SSL协议这层外壳的HTTP. HTTPS采用对称加密和非对称加密并用的混合加密机制. 二.验证公开密钥正确性的证书: 1.服务器把自己的公开密钥登录至数字证书认证机构 2.数字证书认证机构用自己的私有密钥向服务器的公开密码部署数字签名并颁发公钥证书 3.客户端拿到

web安全:HTTPS

E1:搭建zoobar网站开启apache服务和mysql服务service apache2 startservice mysql start 建立数据库和表mysql->create database myzoo;use myzoo;create table Person(PersonID int primary key auto_increment, Password varchar(100),Salt varchar(100),Username varchar(100),Token var

linux总结应用之三 建立内核

          建立内核  (1):第一:检验linux源程序是否已在 /usr/include 目录中建立了两个符号连接: #   cd /usr/include #   ls  -l  asm  linux lrwxrwxrwx    1  root   root  26 Jul  4  17:27   asm -> /usr/src/linux /include/asm lrwxrwxrwx    1  root   root  28  Jul  4 17:27    linux->

确保Web安全的HTTPS

HTTP在安全方面主要有以下不足: 1. 通信使用明文不加密,内容可能会被窃听:(TCP/IP就是可能被窃听的网络) 2. 不验证通信方的身份,因此有可能遭遇伪装: (无法判断请求或响应是否正确,是否有权限,是否有意义) 3. 无法证明报文的完整性,内容有可能已遭篡改: 解决办法: 1.加密处理防止被窃听:通信的加密 HTTPS(SSL安全套接层+HTTP) ,TSL安全层传输协议                                                       内容的

nginx 代理https后,spring mvc web应用redirect https变成http

前几天用nginx 代理https后,应用redirect https变成http,导致网站无法访问的问题,在网上找了半天,终于找到了解决方法了. 虽然自己解决了,我相信还有其他朋友遇到过这个问题,所以转载分享一下: 原因分析: 浏览器到nginx是https,nginx到应用服务器变成http, 应用服务器,再做302 redirect的时候,返回的redirect 地址就好变成http的地址: 原因是spring mvc的servlet的secheme取值,request.getScheme