Linux apache下导入SSL证书

自制ssl凭证

建立凭证文件


[root@bird certs]# cd /etc/pki/tls/certs/

[root@bird certs]# make xxx.key

[root@bird certs]# mv xxx.key xxx.key.raw

[root@bird certs]# openssl rsa -in xxx.key.raw -out xxx.key

[root@bird certs]# rm -f xxx.key.raw

[root@bird certs]# chmod 400 xxx.key

[root@bird certs]# make xxx.crt SERIAL=随即数字 (避免本机生成多个crt 浏览器识别时会有错误)

根据提示输入

[root@bird certs]# ll xxx.*

-rw-------. 1 root root 1407 11月 26 07:53 xxx.crt

-r--------. 1 root root 1675 11月 26 07:49 xxx.key


修改ssl.conf内容 使用自制凭证


[root@www ~]# vim /etc/httpd/conf.d/ssl.conf


SSLCertificateFile /etc/pki/tls/certs/xxx.crt    <==約在 105 行


SSLCertificateKeyFile /etc/pki/tls/certs/xxx.key <==約在 112 行


apache 要支持https 必须要有mod_ssl软件


[root@bird www]# yum install mod_ssl


[root@www ~]# /etc/init.d/httpd restart


修改防火墙添加443


Centos 6.x 已经提供了预设的ssl机制所需私钥与凭证文件


* /etc/httpd/conf.d/ssl.conf            mod_ssl提供的 Apache 设定文件;


* /etc/pki/tls/private/localhost.key     系統私钥文件,可以用來制作凭证的!


* /etc/pki/tls/certs/localhost.crt      就是加密过的凭证文件!(signed certificate)


添加了https 同一个页面http https都可访问 其实没什么意义 要把https和http的页面分离开


可以采用apache的虚拟机机制进行分离


[root@www ~]# mkdir /var/www/https


[root@www ~]# echo "This is https' home" > /var/www/https/index.html


修改 ssl.conf 的內容

[root@www ~]# vim /etc/httpd/conf.d/ssl.conf

Listen 443                      <==预设的监听端口!不建议修改!

<VirtualHost _default_:443>     <==就是虚拟主机的设定!

DocumentRoot "/var/www/https"   <==大概84行,拿掉注释更改目录名称

ServerName *:443                <==拿掉注释,並将主机名称设定为 *

SSLEngine on                    <==支持 SSL 的意思!

SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW

SSLCertificateFile /etc/pki/tls/certs/vbird.crt

SSLCertificateKeyFile /etc/pki/tls/certs/vbird.key

</VirtualHost>


[root@www ~]# /etc/init.d/httpd restart


Web服务器在默认情况下使用HTTP,这是一个纯文本的协议。正如其名称所暗示的,纯文本协议不会对传输中的数据进行任何形式的加密。而基于HTTP的Web服务器是非常容易配置,它在安全方面有重大缺陷。任何”中间人”,通过精心防止的数据包嗅探器,是能够看到任何经过的数据包内容。更进一步,恶意用户甚至可以在传输路径设置一个假冒的WEB服务器冒名顶替实际的目标Web服务器。在这种情况下,最终用户可能实际上与假冒者服务器,而不是真正的目的服务器进行通信。这样,恶意用户可以通过精心设计的表单欺骗终端用户获取到敏感信息,如用户名密码。


为了处理这些类型的漏洞,大多数供应商往往在他们的web服务器应用HTTPS协议。对于只读类型的网站,用户只能读取内容,并没有实际提交任何信息,HTTP仍然是一个可行的选择。但是,对于保存敏感信息的网站,比如:用户需要登录来获得网站的服务,那么HTTPS是必须的。 HTTPS能够为一个网站提供以下能力。


确保所有经过服务器传输的数据包都是经过加密的。

建立了一个官方数字证书证书,使得假冒服务器无法冒充真正的服务器。

需要建立支持HTTPS的WEB服务器所要做的第一件事就是获得数字证书。数字证书可以在以下任一方法来获得。


自签名证书被推荐用于测试目的和个人项目。自签名证书,也可以用于服务提供商,不过一般适用于用

户互相信任的情形。另外,自签名证书不用花钱购买。

证书可以由社区为基础的认证供应商如StartSSL和CACERT办法。这些证书也不需要花钱,但建议为个人项目。


对于全球性商业网站,建议从值得信赖的知名证书颁发机构购买证书。这些证书需要花钱,但他们增加

了网络服务提供商的信誉。

 

1. 准备


在这篇文档中,我们将使用自签名证书。假设CentOS已经安装了Apache Web服务器。我们需要使用OpenSSL生成自签名证书。如果尚未安装OpenSSL,它可以使用yum来安装。


yum install mod_ssl openssl


安装完毕后,会自动生成 /etc/httpd/conf.d/ssl.conf 文件,下文配置会用到!

 


2. 生成一个自签名证书


下面的命令可以被用来产生一个自签名的证书。


首先,生成2048位的加密私钥


openssl genrsa -out server.key 2048


然后,生成证书签名请求(CSR),这里需要填写许多信息,如国家,省市,公司等


openssl req -new -key server.key -out server.csr


最后,生成类型为X509的自签名证书。有效期设置3650天,即有效期为10年


openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt


生成密钥流程如下图,供参考

Linux apache下导入SSL证书

创建证书后,将文件复制到对应的目录。


# cp server.crt /etc/pki/tls/certs/

# cp server.key /etc/pki/tls/private/        

# cp server.csr /etc/pki/tls/private/


3. 配置Apache Web服务器


首先,修改下面的配置文件。仅需配置红色部分 SSLCertificateFile 和 SSLCertificateKeyFile


vim /etc/httpd/conf.d/ssl.conf


### overwrite the following parameters ###


SSLCertificateFile /etc/pki/tls/certs/server.crt


SSLCertificateKeyFile /etc/pki/tls/private/server.key


### The following parameter does not need to be modified in case of a self-signed certificate. ###


### If you are using a real certificate, you may receive a certificate bundle. The bundle is added using the following parameters ###

SSLCertificateChainFile /etc/pki/tls/certs/example.com.ca-bundle


然后,重新启动httpd服务使更改生效


service httpd restart           // 或者  /etc/init.d/httpd restart


Web服务器现在可以使用HTTPS


4. 调整虚拟主机


Apache Web服务器可以配置为多个Web站点。这些站点在httpd的配置文件中以虚拟主机的形式定义。例如,让我们假设我们的Apache Web服务器托管站点为proxy.mimvp.com,网站所有的文件都保存在/var/www/html/virtual-web目录。


对于虚拟主机,典型的HTTP配置是这样的。


vim /etc/httpd/conf/httpd.conf


NameVirtualHost *:80


<VirtualHost *:80>

    ServerAdmin email@example.com

    DocumentRoot /var/www/html/virtual-web

    ServerName proxy.mimvp.com

</VirtualHost>



我们可以参考上面的配置创建HTTPS虚拟主机。


# vim /etc/httpd/conf/httpd.conf


NameVirtualHost *:443

<VirtualHost *:443>

    SSLEngine on

    SSLCertificateFile /etc/pki/tls/certs/server.crt

    SSLCertificateKeyFile /etc/pki/tls/private/server.key


    <Directory /var/www/html/virtual-web>

        AllowOverride All

    </Directory>

    ServerAdmin email@example.com

DocumentRoot /var/www/html/virtual-web

ServerName proxy.mimvp.com

</VirtualHost>


需要按照上面的配置,定义每个虚拟主机。添加虚拟主机后,重新启动Web服务。


# service httpd restart


现在的虚拟主机就可以使用HTTPS


5. 强制Apache Web服务器始终使用https


如果由于某种原因,你需要站点的Web服务器都只使用HTTPS,此时就需要将所有HTTP请求(端口80)重定向到HTTPS(端口443)。 Apache Web服务器可以容易地做到这一点。


1,强制主站所有Web使用(全局站点)

如果要强制主站使用HTTPS,我们可以这样修改httpd配置文件:


# vim /etc/httpd/conf/httpd.conf


ServerName www.example.com:80


Redirect permanent / https://www.example.com


重启Apache服务器,使配置生效:


# service httpd restart

 


2,强制虚拟主机(单个站点)


如果要强制单个站点在虚拟主机上使用HTTPS,对于HTTP可以按照下面进行配置:


# vim /etc/httpd/conf/httpd.conf


<VirtualHost *:80>

    ServerName proxy.mimvp.com

    Redirect permanent / https://proxy.mimvp.com/

</VirtualHost>


重启Apache服务器,使配置生效:


# service httpd restart


单个站点全部使用HTTPS,则 http://proxy.mimvp.com 会强制重定向跳转到 https://proxy.mimvp.com




openssl genrsa -out domain.key 2048


openssl req -utf8 -out domain.csr -key domain.key -new -sha256


当一个站点绑定多个域名,全部强制https访问:


RewriteEngine On

RewriteBase /

RewriteCond %{SERVER_PORT} !^443$

RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [L,R]


当一个站点绑定多个域名,但是只要求其中一个域名强制https访问的时候:


RewriteEngine On

RewriteBase /

RewriteCond %{SERVER_NAME} ^domain$

RewriteCond %{SERVER_PORT} !^443$

RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [L,R]




          nginx强制跳转https

由于nginx没有配置中级证书的参数,所以根证书和证书文件需要合并起来配置,这个apache有点区别,证书链文件建议是配置上去apache有相应参数可以配置nginx没有。

cat domain.crt domian.ca > domian.pem

 

写2个server,80端口用return 301跳转即可。

cat domain-80.conf 

server {

    listen IP:80;

    server_name DOMAIN;

    if ( $host ~* ^[a-zA-Z0-9\-]+\.([a-zA-Z0-9]+)?$ ){

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

        }

    index index.php index.html index.htm;

    location / {

         return 301 https://domain$request_uri;

        limit_req zone=one burst=30;

        proxy_redirect off;

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header REMOTE-HOST $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header CLIENT_IP $proxy_add_x_forwarded_for;

        proxy_set_header AUTHZH aGZoZj13g5N2FmaDk4;

        proxy_pass http://IP:80/;

    }

    location ~* ^.+\.(gz|tar|tgz|tbz||zip|xz|bz2|rar|7z|sql|exe|dll|msi|iso|pdf)$ {

        limit_conn conn 2;

        limit_rate 200k;

        proxy_redirect off;

        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;

        proxy_set_header REMOTE-HOST $remote_addr;

        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header CLIENT_IP $proxy_add_x_forwarded_for;

        proxy_set_header AUTHZH aGZoZjg12321Zoc2FmaDk4;

        proxy_pass http://ip:80;

    }

    location ~* ^/(403|500|503)\.html { root html; }

}  



cat domain.com.conf 

server {

    listen          IP:443;

    server_name     domain;

    index           index.php index.html index.htm;



    ssl on;

    ssl_certificate /usr/local/nginx/conf/ssl/DOMINA/DOMAIN.pem;

    ssl_certificate_key /usr/local/nginx/conf/ssl/domain/domain.key;

    ssl_session_timeout    5m;

    ssl_protocols SSLv2 SSLv3 TLSv1;

    ssl_prefer_server_ciphers   on;


    location / {

        proxy_redirect          off;

        proxy_set_header        Host $host;

        proxy_set_header                X-Real-IP $proxy_add_x_forwarded_for;

        proxy_set_header                CLIENT_IP $proxy_add_x_forwarded_for;

        proxy_set_header                X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_set_header        AUTHZH aGZoZjg5N34Y3Zoc2FmaDk4;

    proxy_set_header    X_FORWARDED_PROTO  https;

        proxy_pass http://IP;

    }

    error_page   500 502 503 504  /50x.html;

    location = /50x.html {

        root   html;

    }

}




  1. 安装openssl 


apache2.0 建议安装0.9版本,我曾经试过2.0.59 对openssl-1.0编译不过去

下载Openssl:http://www.openssl.org/source/

       tar -zxf openssl-0.9.8k.tar.gz    //解压安装包   

       cd openssl-0.9.8k                 //进入已经解压的安装包   

       ./config                          //配置安装。推荐使用默认配置   

       make && make install              //编译及安装  


 

openssl默认将被安装到/usr/local/ssl 



2. 让apache支持ssl,编译的时候,要指定ssl支持


静态或者动态


静态方法即  --enable-ssl=static --with-ssl=/usr/local/ssl


动态方法  --enable-ssl=shared --with-ssl=/usr/local/ssl


其中第二种方法会在module/ 目录下生成 mod_ssl.so 模块,而静态不会有,


当然第二种方法也需要在httpd.conf 中加入


LoadModule ssl_module modules/mod_ssl.so


3. 1    创建私钥  


在创建证书请求之前,您需要首先生成服务器证书私钥文件。 

 

cd /usr/local/ssl/bin                    //进入openssl安装目录  

openssl genrsa -out server.key 2048      //运行openssl命令,生成2048位长的私钥server.key

文件。如果您需要对 server.key 添加保护密码,请使用 -des3 扩展命令。


Windows环境下不支持加密格式私钥,Linux环境下使用加密格式私钥时,每次重启Apache都需要您输入该私钥密码(例:openssl genrsa -des3 -out server.key 2048)。 


cp server.key   /usr/local/apache/conf/ssl.key/

  

3.2    生成证书请求(CSR)文件 


openssl req -new -key server.key -out certreq.csr  

 

Country Name:                           //您所在国家的ISO标准代号,中国为CN   

State or Province Name:                 //您单位所在地省/自治区/直辖市   

Locality Name:                          //您单位所在地的市/县/区   

Organization Name:                      //您单位/机构/企业合法的名称   

Organizational Unit Name:               //部门名称   

Common Name:                            //通用名,例如:www.itrus.com.cn。此项必须与您访问提供SSL服务的服务器时所应用的域名完全匹配。   

Email Address:                          //您的邮件地址,不必输入,直接回车跳过   

"extra"attributes                        //以下信息不必输入,回车跳过直到命令执行完毕。 

   

3.3    备份私钥并提交证书请求   

请将证书请求文件certreq.csr提交给天威诚信,并备份保存证书私钥文件server.key,等待证书的签发。服务器证书密钥对必须配对使用,私钥文件丢失将导致证书不可用。 


4.安装证书

4.1 获取服务器证书中级CA证书   

为保障服务器证书在客户端的兼容性,服务器证书需要安装两张中级CA证书(不同品牌证书,可能只有一张中级证书)。   

从邮件中获取中级CA证书:   

将证书签发邮件中的从BEGIN到 END结束的两张中级CA证书内容(包括“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”)粘贴到同一个记事本等文本编辑器中,中间用回车换行分隔。修改文件扩展名,保存为conf/ssl.crt/intermediatebundle.crt文件(如果只有一张中级证书,则只需要保存并安装一张中级证书)。   

4.2 获取EV服务器证书   

将证书签发邮件中的从BEGIN到 END结束的服务器证书内容(包括“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”) 粘贴到记事本等文本编辑器中,保存为ssl.crt/server.crt文件 

   

4.3 apache的配置 2.0的配置


httpd.conf 中增加

Listen  443

NameVirtualHost *:443


    DocumentRoot "/data/web/www"

    ServerName aaa.com:443

    ErrorLog "logs/error.log"

    CustomLog "logs/access.log" combined

     

        SSLEngine on

        SSLCertificateFile /usr/local/apache/conf/ssl.crt/server.crt

        SSLCertificateKeyFile /usr/local/apache/conf/ssl.key/server.key

        SSLCertificateChainFile /usr/local/apache/conf/ssl.crt/intermediatebundle.crt


apache 禁止trace或track防止xss攻击


TRACE和TRACK是用来调试web服务器连接的HTTP方式。

支持该方式的服务器存在跨站脚本漏洞,通常在描述各种浏览器缺陷的时候,把"Cross-Site-Tracing"简称为XST。

攻击者可以利用此漏洞欺骗合法用户并得到他们的私人信息。


禁用trace可以使用rewrite功能来实现

RewriteEngine On

RewriteCondi %{REQUEST_METHOD} ^TRACE

RewriteRule .* - [F]


或者还可以直接在apache的配置文件中配置相应参数

TraceEnable off


apache设置自定义header


1. 在设置自定义header前,需要先检测一下你的httpd是否加载了mod_headers

/usr/local/apache2/bin/apachectl  -l 

如果,显示有mode_headers.c  则是加载了这个模块,否则就需要重新编译一下了。

另外,如果你使用的是rpm安装的话,那肯定是已经加载了mod_headers这个模块的。


2.  在httpd.conf 中加入

Header add MyHeader "Hello"

保存后,重启apache就可以了

双引号中的内容为自定义内容。当然这里的"MyHeader"也是可以自定义的。

3. 测试

curl  -I http://localhost 

看是否显示有  MyHeader  "Hello"


nginx 设置自定义header

vim   nginx.conf 


在http模块中加入:

add_header  myheader  "the coments of myheader";


这里的myheader 是自定义的名字,你自己随便写。


加完后,测试:

curl  -I  http://IP


apache设置自定义header




nginx https服务

Nginx 的HTTPS 服务

产生证书

说明

这里我们自己做测试,可以自己产生证书,但是我们的浏览器会提示证书不受信任,如果运行在互联网的应用推荐去购买HTTPS证书。


使用openssl产生一个RSA的密钥


Shell># openssl genrsa -des3 -out server.key 1024


拷贝一个无需输入密码的密钥文件


Shell># openssl rsa -in server.key  -out server_nopass.key


生成一个证书请求文件


Shell># openssl req -new -key server.key -out server.csr


自己给自己签发证书


Shell># openssl x509 -req -days 1200 -in server.csr  -signkey server.key  -out server.crt

 

创建密码存放目录,并修改权限


Shell># mkdir /var/openssl


Shell># mv server* /var/openssl


Shell># chown –R nginx /var/openssl


配置Nginx


Shell>#vi /etc/nginx/nginx.conf

user nginx;

worker_processes  1;

events {

       use  epoll

       worker_connections  1024;

       multi_accept  on;

}

http {

     include       mime.types;

     default_type   application/octet-stream;

     sendfile        on;

     keepalive_timeout  65;

       server  {

         listen       443;

         server_name  localhost;

           ssl on;

           ssl_certificate /var/openssl/server.crt;

           ssl_certificate_key /var/openssl/server_nopass.key;

         location / {

            root   /var/www/html/;

             index  index.html index.htm;

         }

         error_page   500 502 503  504  /50x.html;

         location = /50x.html {

             root   html;

         }

    }

   

}

重启nginx,然后开放443端口。

测试,我们可以尝试是使用https访问我们的系统站











本文转自 chengxuyonghu 51CTO博客,原文链接:http://blog.51cto.com/6226001001/1906058,如需转载请自行联系原作者
上一篇:为测试框架model类自动生成xml结果集


下一篇:LeetCode第 266 场周赛