CC00053.LinuxNetwork——|Linux&Apache.V03|——|https=Apache+openssl|...

一、Apache+openssl实现https(重点):环境准备
### --- Apache+openssl实现https(重点)

~~~     HTTPS(全称:Hypertext Transfer Protocol Secure,超文本传输协议)
~~~     是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSl层,
~~~     用于安全的HTTP数据传输,这个系统被内置浏览器中,提供身份验证与加密通讯方法,
~~~     现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。
### --- 准备工作
~~~     检查Apache是否支持SSL,检查相应模块是否安装,若安装则将模块启用

[root@localhost ~]# vim /usr/local/apache2/etc/httpd.conf
                                       // 默认是开启的
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin

 LoadModule ssl_module modules/mod_ssl.so                   // 默认是未开启的,需要开启
~~~     模块存放目录:/usrl/local/apache2/modules

[root@localhost ~]# ls /usr/local/apache2/modules/ |grep mod_ssl.so 
mod_ssl.so                                                  // 有这个模块
~~~     检查是否启用,apachectl -M

[root@localhost ~]# apachectl restart
[root@localhost ~]# apachectl -M
 ssl_module (shared)                                        // 开启了模块就可以查看到shared可以查看到
二、CA证书申请
### --- CA证书申请:
~~~     建立服务器私钥,生成RSA秘钥

[root@server11 cert]# openssl genrsa -out ca.key 1024       // 生成秘钥文件
Generating RSA private key, 1024 bit long modulus
....++++++
..........................++++++
e is 65537 (0x10001)
~~~     需要一次输入国家/地区/城市/组织/组织单位/Email等信息,
~~~     最重要的是有一个common name,可以写你的名字或者域名,如果为了https申请,
~~~     这个必须和域名吻合,否则会引发浏览器警报,生成的csr文件交给CA签名后形成服务端自己的证书

[root@server11 cert]# openssl req -new -key ca.key -out atyanqi.csr // 生成证书
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]:atyanqi
Organizational Unit Name (eg, section) []:yjs
Common Name (eg, your name or your server's hostname) []:www.atyanqi.com
Email Address []:[email protected]
A challenge password []:
An optional company name []:
~~~     使用CA服务器签发证书,设置证书的有效期等信息

[root@server11 cert]# openssl x509 -req -days 365 -sha256 -in atyanqi.csr -signkey ca.key -out atyanqi.crt
Signature ok
subject=/C=CN/ST=BJ/L=BJ/O=atyanqi/OU=yjs/CN=www.atyanqi.com/[email protected]
Getting Private key  
[root@server11 cert]# ls
atyanqi.crt  atyanqi.csr  ca.key
~~~     #注意1:生成完秘钥和证书文件后,将文件存放在Apache的安装目录下的cert目录下
~~~     #注意2:在生产环境中必须要在https证书厂商注册(否则浏览器不识别)

[root@server11 ~]# mkdir /usr/local/apache2/cert            // 创建cert目录
三、配置文件参数
### --- 配置文件修改:
~~~     调用ssl模块,并启用ssl独立配置文件

[root@server11 ~]# vim /usr/local/apache2/etc/httpd.conf
LoadModule ssl_module modules/mod_ssl.so                    // 取消注释
# Secure (SSL/TLS) connections
Include etc//extra/httpd-ssl.conf                           // 取消注释
~~~     修改conf/extra/httpd-ssl.conf配置文件,调用证书等文件

[root@server11 ~]# vim /usr/local/apache2/etc/extra/httpd-ssl.conf 
#SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5                     // 加密套件,默认是开启的,注释掉 
#SSLCertificateFile "/usr/local/apache2/etc//server.crt"    // 注释掉
#SSLCertificateKeyFile "/usr/local/apache2/etc//server.key"
#添加如下内容
#SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5

SSLProtocol all -SSLv2 -SSLv3
#添加SSL协议支持协议,去掉不安全的协议
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM         
SSLHonorCipherOrder on
#修改加密套件
SSLCertificateFile cert/atyanqi.crt                     
#证书公钥配置(签字的)
SSLCertificateKeyFile cert/ca.key                       
#证书私钥配置
~~~     修改主配置文件,添加虚拟主机

[root@server11 ~]# vim /usr/local/apache2/etc/httpd.conf
                                 // _default_:443也可以写成:*:443
        #DocumentRoot目录位置要和httpd.conf里面的一致
        DocumentRoot "/usr/local/apache2/htdocs"
        ServerName localhost:443
        SSLCertificateFile cert/atyanqi.crt
        SSLCertificateKeyFile cert/ca.key
        SSLCertificateChainFile cert/atyanqi.crt
四、实验验证
### --- 验证结果

~~~		#报错信息
[root@server11 ~]# apachectl -t                                 // 检查配置文件语法
AH00526: Syntax error on line 86 of /usr/local/apache2/etc/extra/httpd-ssl.conf:
SSLSessionCache: 'shmcb' session cache not supported (known names: ). Maybe you need to load the appropriate socache module (mod_socache_shmcb?).
~~~		#解决方案:
[root@server11 ~]# vim /usr/local/apache2/etc/httpd.conf        // 把这个模块加上
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so    // 默认是注释掉的,开启即可
[root@server11 ~]# apachectl -t
Syntax OK                                                                                                                             
[root@server11 ~]# apachectl restart                             // 重启Apache,并测试是否可以使用https访问                                                                                                            
tcp6       0      0 :::80                   :::*                    LISTEN      1747/httpd          
tcp6       0      0 :::443                  :::*                    LISTEN      1747/httpd                                                                                                                                       
~~~		#既有80端口也有443端口,两个端口都可以使用
### --- 原件

~~~		#报错信息:AH00526:Syntax error on line 78 of /usr/local/apache2/etc/extra/httpd-ssl.conf:
SSLSessionCache:'shmcb' session cache not supported (known names:).Maybe you need to load the appropriate socache module (mod_socache_shmcb?)
~~~		#解决方案:要么不调用此模块,要么让调用的模块加载上。
~~~		#http访问:http://10.10.10.11/     
www.yanqiv1.com 
~~~		#https访问:https://10.10.10.11/                           // 但会显示证书有风险,因为我们是自己创建的证书,生产环境中都是找专业的证书厂商注册。                                                                                                                      
It works!
五、强制跳转https
### --- 强制跳转https
~~~     有些时候为了安全,网站不允许使用http访问,仅允许使用https访问,
~~~     目的是为了更加安全在http部分目录权限标签中添加以下内容

[root@server11 ~]# vim /usr/local/apache2/etc/httpd.conf          // 添加规则,当用户访问时使用80端口时,必须用443端口。

    Require all granted                                           // 默认就有;添加如下内容
    RewriteEngine on
    #开启转发规则
    RewriteCond %{SERVER_PORT} !^443$
    #检查访问端口只要目标不是443的
    RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=301,L]
    #全部使用https重新访问
### --- 验证apache配置文件是否正确

[root@server11 ~]# apachectl -t
Syntax OK
[root@server11 ~]# apachectl restart
[root@server11 ~]# netstat -antp                                  // 两个端口都存在,但是使用80访问时会自动强制跳转到443端口https。
tcp6       0      0 :::80                   :::*                    LISTEN      1747/httpd          
tcp6       0      0 :::443                  :::*                    LISTEN      1747/httpd
### --- http://10.10.10.11/yanqiv1/访问会自动跳转到:https://10.10.10.11/yanqiv1/
~~~     在做后面实现时为了更加方便理解,我们可以先把https关闭掉,
~~~     需要关闭:跳转&虚拟主机&ssl配置文件调用

[root@server11 ~]# vim /usr/local/apache2/etc/httpd.conf
#关闭跳转

    #RewriteEngine on                                                   
    #开启转发规则
    #RewriteCond %{SERVER_PORT} !^443$          
    #检查访问端口只要目标不是443的
    #RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=301,L]            
    #全部使用https重新访问

#关闭虚拟主机
#
        #DocumentRoot目录位置要和httpd.conf里面的一致
#       DocumentRoot "/usr/local/apache2/htdocs"
#       ServerName localhost:443
#       SSLCertificateFile cert/atyanqi.crt
#       SSLCertificateKeyFile cert/ca.key
#       SSLCertificateChainFile cert/atyanqi.crt
#
#关闭https的配置文件关闭
#Include etc//extra/httpd-ssl.conf
#关闭虚拟主机的配置文件
#Include etc//extra/httpd-vhosts.conf
### --- 重启Apache服务器
[root@server11 ~]# apachectl -t
Syntax OK
[root@server11 ~]# apachectl restart  

~~~     清理浏览器
http://10.10.10.11/                                             // 验证访问OK
It works!

你可能感兴趣的:(linux,java,https,nginx,python)