apache+openssl设置https单向认证和双向认证以及反向代理

闲话少说,下面介绍企业在项目开发过程中需要使用自己申请的域名通过https(单向或双向认证)访问应用服务器的实现方式。

1、域名申请,这个应该it人都知道。自己上网申请免费的,或者付费的域名。申请域名过程中,绑定自己企业的对外ip地址。

2、部署apache和openssl前置linux服务器。稍后详细说明

3、配置https单向和双向认证服务

4、配置反向代理服务

下面是对部署前置linux服务器的说明

安装openssl

首先我们需要安装的是openssl,安装的方法在网上有很多说法,有的直接使用yum进行联网安装。但是如果是在一些企业机关可能yum无法使用。那么就需要读者登录openssl官网下载。我下载的版本是:openssl-0.9.8zg.tar.gz

把gz包上传到对应的前置服务器,然后解压出来。

进入解压后的目录 cd openssl-0.9.8zg/

目录里面应该有一个config文件。执行下面的命令(我们是安装到/usr/local/ssl

  ./config --prefix=/usr/local/ssl -fPIC

注意:#其中-fPIC这个参数在某些linux环境下需要使用(如redhat5.4)。否则后面会有问题

注册完后,需要编译安装。在当前的目录执行如下语句

make && make install

等待一段时间,应该会安装完成。

安装apache

一般的linux安装后,都会自带一个apache服务的。但是我们今天不使用linux自带的apache服务,而是重现从apache官网下载一个apache服务。

版本如下:httpd-2.2.31.tar.gz  (其他版本可能在配置上会有所差异,需要读者自行查阅官方资料解决)

下载下来的gz文件是一个还没有编译安装的版本,所以需要我们进行编译安装。

把gz文件放到一个目录里面并在目录下解压

进入解压后的目录 cd httpd-2.2.31

里面应该有一个configure文件,执行下面命令(我们是安装到/usr/local/apache 目录)

./configure --prefix=/usr/local/apache --enable-proxy --enable-proxy-balancer --enable-proxy-http --enable-ssl --with-ssl=/usr/local/ssl --enable-mods-shared=most

注册完后,需要编译安装。在当前的目录执行如下语句

make && make install

等待一段时间,应该会安装完成。

这里稍微穿插一个内容,

简单说明下https的原理以及它所完成的工作。

https证书大概分三类
1、根证书(ca证书)
2、服务端证书
3、客户端证书
他们之间的关系如下:
ca根证书负责认证和签发服务端证书以及客户端证书
服务端证书与客户端证书之间没有交互的地方。唯一有关系的是,在一个企业应用里面,他的服务端证书和客户端证书原则上都是通过一个ca证书进行签发和认证的。
ca根证书可以通过openssl自己产生,进行自认证。也可以通过提交认证请求,把认证请求的文件发给合法的认证机构进行认证。

https是提供一个安全数据传输通道的通信协议和通信方案。那么他是如何实现、保证数据传输安全的呢?
答:我们需要从https的整个通信过程说起。如下:
1、客户端(浏览器)访问一个https的网站或者服务
2、网站(服务)向客户端返回这个网站的服务端证书
3、客户端会验证这个服务端证书是否授信机构颁发的。世界上三大认证机构的ca证书都默认的安装到各厂家的浏览器上,所以浏览器上就可以通过自身安装的ca证书去验证服务端证书。如果客户端上已经安装了企业自己生成的ca证书,那么浏览器也可以自动认为服务端证书是可信的。这样,浏览器上就不会出现那个安全警告提示
4、客户端验证完服务端证书后,就会使用证书里面的公钥去加密客户端随机生成的通讯密码。并把这个经过加密的通讯密码发送给服务端(注意:现行的浏览器都有这个随机生成通讯密码的功能)
5、服务端把客户端发送过来的加密密码进行解密(使用服务端自己的私密密钥进行解密)。并向客户端返回一个确认信息
6、客户端接收到服务端的确认信息后,在后续的通讯过程中就使用刚才随机生成的随机密码对通讯数据进行加密。

此时整个https的通讯握手就完成了。但是上面所说的只是单向认证(认证服务端的合法性)

如果是双向认证,就是在上面的过程中,加上服务端对客户端证书的合法性认证。过程如下:
1、客户端在首次访问服务端时,服务端会要求客户端传送客户端证书过来。
2、客户端提示用户选择一个有效的客户端证书进行发送,并把选择后的客户端证书发送给服务端
3、服务端通过部署在服务端上的ca证书进行验证(验证方式,主要是验证这个客户端证书是否通过服务端的ca证书进行签发和认证的)。如果服务端认证成功,那么网站(服务)向客户端返回这个网站的服务端证书。
后面环节就和单向认证的后续环境一致。

说到这里,大家应该就明白,https的双向认证或者单向认证,其本质实现了如下这个目标:
1、通过客户端自带的ca证书认证服务端证书的合法性(ca证书包括自带的和企业自己生成的ca证书)。通过服务端的自创建ca证书或者向合法认证机构申请的次级ca根证书进行验证客户端证书。
2、在前面的通讯握手过程中,客户端和服务端分别通过公钥加密通讯密码、使用私钥解密通讯密码(非对称加密方式)。最终达到通讯密码同步的安全性。
3、在握手成功后,后续的双方通讯,就统一使用握手时产生的通讯密码进行信息加密(对称加密方式)

创建https需要使用到的证书

言归正传,我们下面主要介绍通过openssl自己生成ca根证书以及签发服务端证书和客户端证书等工作。

创建证书的必要条件,我们经过上面的安装部署已经具备了。如果是企业级应用,那么还需要申请一个域名。这个域名在后面创建证书时候需要用到。
在这里我们先简单的说明一下证书的种类和他们之间的关系。

上面我们已经安装了openssl。
我们进入openssl的安装目录 
 cd /usr/local/ssl/bin
 在bin下面创建两个目录,private(存放证书签名请求文件、私钥)和certificates(存放证书)
 mkdir private
 mkdir certificates

 创建ca根证书,执行下面三句命令(顺序不能乱),分别创建了ca证书的私钥、ca证书签名请求文件、ca根证书。其中,这里的私钥是使用2048长度加密,也可以改成1024。

#证书和私钥都需要设置密码
#创建ca私钥和ca证书

#执行下面三句命令(顺序不能乱)
#创建ca私钥 
openssl genrsa -out private/ca.key.2048 2048
#创建ca证书签发请求 在输入完下面命令后,需要录入如下信息
#第一个是国家  CN
#第二个是省份  GD
#第三个是市区
#第四个是公司
#第五个是部门
#第六个是域名  自己创建的根证书可以输入*进行通配。如果是次级证书可以输入 *.xxx.xxx (如域名是www.ddd.com,就输入*.ddd.com)
#后面还会提示输入密码,那么就输入一个密码,但是自己要记住这个密码
openssl req -new -key private/ca.key.2048 -out private/ca.csr -- 这个需要输入*到common name里面 (密码nanyue@msap)
#自己签发ca根证书 根据命令执行后的提示进行输入信息。(参数3650的意思是有效期10年)
openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey private/ca.key.2048 -in private/ca.csr -out certificates/ca.cer

#执行下面三句命令(顺序不能乱)
#创建服务端私钥
openssl genrsa -out private/server.key.2048 2048

#创建服务端证书签发请求, 在输入完下面命令后,需要录入如下信息
#第一个是国家  CN
#第二个是省份  GD
#第三个是市区
#第四个是公司
#第五个是部门
#第六个是域名  如域名是www.ddd.com,就输入wwww.ddd.com)
#后面还会提示输入密码,那么就输入一个密码,但是自己要记住这个密码
openssl req -new -key private/server.key.2048 -out private/server.csr --这个需要输入具体的域名和ip地址 (需要输入密码,并且记住)

#利用CA根证书,签发服务端证书
openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA certificates/ca.cer -CAkey private/ca.key.2048 -CAserial ca.srl -CAcreateserial -in private/server.csr -out certificates/server.cer

#创建客户端证书 执行提示的输入内容同服务端证书的填写方式
openssl genrsa -out private/client.key.2048 2048
openssl req -new -key private/client.key.2048 -out private/client.csr --需要设置密码

#利用CA根证书,签发客户端证书
openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA certificates/ca.cer -CAkey private/ca.key.2048 -CAserial ca.srl -CAcreateserial -in private/client_msap.csr -out certificates/client.cer 

如果客户端是ios,那么需要创建一个p12的客户端证书给ios的开发人员。

openssl pkcs12 -export -clcerts -inkey private/client.key.2048 -in certificates/client.cer -out certificates/client.p12 --需要设置密码,并把密码告诉ios的开发人员


此时,证书就全部创建成果了。下面是在apache里面设置单向或者双向认证

设置单向活着双向认证

之前我们已经安装了apache,进入apache的安装目录
#设置conf/extra里面的httpd-ssl.conf文件的内容
cd /usr/local/apache/conf/extra
--开启ssl服务

SSLEngine on

--开启客户端认证
 SSLCACertificateFile "/usr/local/apache/conf/ca.cer
 SSLVerifyClient require
 SSLVerifyDepth  10
--开启服务端认证
 SSLCertificateFile "/usr/local/apache/conf/server.cer
 SSLCertificateKeyFile "/usr/local/apache/conf/server.key.2048


设置反向代理

cd /usr/local/apache/conf
vim httpd.conf
#设置httpd.conf里面的监听端口
Listen xx(所需要监听的端口)
#如果是根据上面的步骤进行编译安装apache,那么LoadModule所需要的模块就都加载了。否则要自己加载,并且保证所需要使用的模块已经编译
#设置servername
ServerName localhost:xx(对外服务的ip和端口)
#包含扩张配置文件
Include conf/extra/httpd-vhosts.conf
#进入httpd-vhosts.conf进行设置反向代理
cd /usr/local/apache/conf/extra
vim httpd-vhosts.conf
#注释掉NameVirtualHost这行
#注释原来的一堆例子,如下
#
#    ServerAdmin [email protected]
#    DocumentRoot "/usr/local/apache/docs/dummy-host.example.com"
#    ServerName dummy-host.example.com
#    ServerAlias www.dummy-host.example.com
#    ErrorLog "logs/dummy-host.example.com-error_log"
#    CustomLog "logs/dummy-host.example.com-access_log" common
#



#
#    ServerAdmin [email protected]
#    DocumentRoot "/usr/local/apache/docs/dummy-host2.example.com"
#    ServerName dummy-host2.example.com
#    ErrorLog "logs/dummy-host2.example.com-error_log"
#    CustomLog "logs/dummy-host2.example.com-access_log" common
#



#新建一个virtualhost 。这个是http的反向代理

    ServerName 10.211.55.5 (自己的ip)
    ProxyRequests Off
   
       Order deny,allow
       Allow from all
   

    (下面是根据不同的访问相对路径转发给不同的http服务地址)


    ProxyPass / http://11.8.121.72:7001/console/login/LoginForm.jsp
    ProxyPassReverse / http://11.8.121.72:7001/console/login/LoginForm.jsp
    ProxyPass /console http://11.8.121.72:7001/console   
    ProxyPassReverse /console http://11.8.121.72:7001/console
    ErrorLog logs/82error_log
    CustomLog logs/82access_log common
 

到这里就基本完成设置了。重启apache,验证吧!

你可能感兴趣的:(apache)