博客是我工作的好帮手,遇到困难就来博客找资料
分类: 系统运维
2017-03-13 20:23:56
自制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 <==预设的监听端口!不建议修改!
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
[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
生成密钥流程如下图,供参考
创建证书后,将文件复制到对应的目录。
# 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
ServerAdmin email@example.com
DocumentRoot /var/www/html/virtual-web
ServerName proxy.mimvp.com
我们可以参考上面的配置创建HTTPS虚拟主机。
# vim /etc/httpd/conf/httpd.conf
NameVirtualHost *:443
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/server.crt
SSLCertificateKeyFile /etc/pki/tls/private/server.key
AllowOverride All
ServerAdmin email@example.com
DocumentRoot /var/www/html/virtual-web
ServerName proxy.mimvp.com
需要按照上面的配置,定义每个虚拟主机。添加虚拟主机后,重新启动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 0
Redirect permanent /
重启Apache服务器,使配置生效:
# service httpd restart
2,强制虚拟主机(单个站点)
如果要强制单个站点在虚拟主机上使用HTTPS,对于HTTP可以按照下面进行配置:
# vim /etc/httpd/conf/httpd.conf
ServerName proxy.mimvp.com
Redirect permanent /
重启Apache服务器,使配置生效:
# service httpd restart
单个站点全部使用HTTPS,则 会强制重定向跳转到
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 ^/(.*)$ permanent;
}
index index.php index.html index.htm;
location / {
return 301
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
}
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
}
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
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
安装openssl
apache2.0 建议安装0.9版本,我曾经试过2.0.59 对openssl-1.0编译不过去
下载Openssl:
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: //通用名,例如:。此项必须与您访问提供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
看是否显示有 MyHeader "Hello"
vim nginx.conf
在http模块中加入:
add_header myheader "the coments of myheader";
这里的myheader 是自定义的名字,你自己随便写。
加完后,测试:
curl -I
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访问我们的系统站