Lanmp环境之SSL证书配置
SSL证书配置
一. 环境准备
需要apache服务至少加载 如下ssl相关模块,可以的话,推荐开启所有模块 # vim /etc/httpd/conf/httpd.conf Include conf/extra/ssl.conf LoadModule ssl_module modules/mod_ssl.so LoadModule rewrite_module modules/mod_rewrite.so LoadModule socache_shmcb_module modules/mod_socache_shmcb.so 需要nginx服务支持编译支持ssl模块
证书签发说明:
1)一般,自签证书均在同一台服务器执行进行签署,按照如下操作即可 2)如果,CA证书服务器和用户请求的服务器是不同机器,CA服务器只负责生成CA根证书和签发,用户服务器负责进行申请,CA服务器将用户服务器发送给自己的httpd.csr 证书请求文件进行签发,并生成httpd.crt证书文件,然后发放给用户服务器端,进行配置即可,用户服务器目的是要获取httpd.crt证书文件。
二. 部署Apache跳转
1. 部署SSL(自签证书)
1.1 签发端-生成CA自签根证书
A. 生成CA证书私钥
cd /etc/pki/CA && (umask 077; openssl genrsa -out private/cakey.pem 2048)
B. 生成自签根证书
修改openssl.cnf文件,生成过程中减少二次输入相关内容
[root@localhost CA]# vim /etc/pki/tls/openssl.cnf
130 countryName_default = CN//修改为CN 135 stateOrProvinceName_default = Beijing//省份名称 138 localityName_default = Beijing//城市名称 141 0.organizationName_default = zxl//组织名称 148 organizationalUnitName_default = Tech//部门名称
[root@localhost CA]# pwd
/etc/pki/CA
[root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650
[root@localhost pki]# vim ../tls/openssl.cnf
42 dir = /etc/pki/CA //修改CA证书路径
如果certs crl newcerts目录不存在手动创建目录即可
[root@localhost CA]# touch index.txt [root@localhost CA]# echo 01 > serial [root@localhost CA]# ls cacert.pem certs crl index.txt newcerts private serial
1.2 申请端-申请签发证书
A. 安装apache服务
创建存放证书的目录 /app/httpd2.4.25/conf/ssl
B. 生成证书私钥
[root@localhost ssl]# pwd /app/httpd2.4.25/conf/ssl [root@localhost ssl]# (umask 077; openssl genrsa 2048 > httpd.key)
C. 生成证书签署请求文件
//生成证书请求,由于是自签证书,所以以下信息必须和CA服务器根证书签发一致 [root@localhost ssl]# openssl req -new -key httpd.key -out httpd.csr
D. CA证书服务器用刚签署的请求文件进行签发证书
//签发证书十年3650天,信息内容,回车,会输入两个y [root@localhost ssl]# openssl ca -in httpd.csr -out httpd.crt -days 3650 [root@localhost CA]# ls /etc/pki/CA/ cacert.pem certs crl index.txt index.txt.attr index.txt.old newcerts private serial serial.old [root@localhost CA]# cat /etc/pki/CA/index.txt
V 210418070116Z 01 unknown /C=CN/ST=BeiJing/O=pxjy/OU=IT\xC3\xA4\xC2\xBA\xC2\xA7\xC3\xA5\xC2\x93\xC2\x81\xC3\xA7\xC2\xA0\xC2\x94\xC3\xA5\xC2\x8F\xC2\x91\xC3\xA9\xC2\x83\xC2\xA8/CN=www.pdjy.com
E. 申请的私钥和证书齐全如下
httpd.key httpd.crt
1.3 配置SSL证书访问
[root@localhost conf]# vim httpd-vhosts.conf ……自签证书,配置两行证书文件即可实现和购买的证书有点区别 SSLEngine on SSLCertificateFile conf/ssl/httpd.crt SSLCertificateKeyFile conf/ssl/httpd.key
2. 部署SSL(购买证书)
2.1 配置全局站点
# For ssl证书配置-针对泛域名 <VirtualHost *:80> ServerAlias *.pxjy.com RewriteEngine on RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*)?$ https://%{SERVER_NAME}$1 </VirtualHost>
2.2 方法二
# For ssl证书配置-针对单域名 RewriteEngine on RewriteCond %{SERVER_PORT} !^443$ RewriteCond %{REQUEST_URI} !^/tz.php RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]
解释:
%{SERVER_PORT} —— 访问端口 %{REQUEST_URI} —— 比如如果url是 http://localhost/tz.php,则是指 /tz.php。 %{SERVER_NAME} —— 比如如果url是 http://localhost/tz.php,则是指 localhost。 以上规则的意思是,如果访问的url的端口不是443,且访问页面不是tz.php,则应用RewriteRule这条规则。 这样便实现了:访问了 http://localhost/index.php 或者 http://localhost/admin/index.php 等页面的时候会自动跳转到 https://localhost/index.php
或者 https://localhost/admin/index.php,但是访问 http://localhost/tz.php 的时候就不会做任何跳转,也就是说 http://localhost/tz.php
和 https://localhost/tz.php 两个地址都可以访问
2.3 方法三
RewriteEngine On RewriteBase / RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://www.firx.cn/$1 [R,L] #这样跳转的好处是独立IP主机也支持,访问ip能自动跳转到https
2.4 方法四
RewriteEngine on RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=301,L] #整站跳转
2.5 方法五
RewriteEngine on RewriteBase /yourfolder RewriteCond %{SERVER_PORT} !^443$ #RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [R=301,L] RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L] #以上至针对某个目录跳转, yourfolder就是目录名
2.6 方法六
redirect 301 /你的网页 https://你的主机+网页 #至针对某个网页跳转
2.7 方法七
RewriteCond %{http_host} ^firx.cn [nc] RewriteRule ^(.*)?$ https://www.firx.cn$1 [R=301,L] RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^(.*)?$ https://www.firx.cn/$1 [R=301,L]
2.8 方法八-ssl跳转出现跨域的问题
# For ssl证书配置-针对单域名 ServerName proxy.mimvp.com Redirect permanent / https://xxx.xxx.com/ <Directory "/app/website/jituanguanwang_web"> …… Header set Access-Control-Allow-Origin https://xxx.xxx.com …… </Directory> 附: 如上,标红处配置,是解决http协议跳转https协议时,出现跨域的问题; 后面的域名,可以用 * ,或者指定域名均可; 有跨域的问题就可以加上此配置,若无此问题,也可以不加
2.9 apache案例线上SSL配置参考
…… SSLEngine on SSLCertificateFile conf/ssl/xxx.com.cer SSLCertificateKeyFile conf/ssl/xxx.com.key SSLCertificateChainFile conf/ssl/xxx.com.crt ……
三. 部署Nginx跳转
1. 自签名证书Nginx
1.1 生成私钥
openssl genrsa -des3 -out ssl.key 1024
1.2 创建证书签名请求
openssl req -new -key ssl.key -out ssl.csr
1.3 清除SSL启动nginx时提示必须输入密钥
cp ssl.key ssl.key.org openssl rsa -in ssl.key.org -out ssl.key
1.4 使用刚生成的私钥和CSR进行证书签名
openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt
1.5 把私钥和证书加入到nginx.conf的配置文件中
ssl_certificate /etc/nginx/ssl/ssl.crt; ssl_certificate_key /etc/nginx/ssl/ssl.key;
2. 配置线上Nginx证书
注意:
A. 准备好SSL证书或采购或自签生成 B. Nginx需要支持ssl模块
2.1 方法一(推荐)
#cat /usr/local/nginx1.10.3/conf/conf.d/project.conf server { listen 80; listen 443 ssl; server_name pxsnx.pxjy.com; ### 配置网站域名 root /app/webroot/project; access_log /app/applog/project.log main; error_log /app/applog/project.error.log error; ssl_certificate ssl/pxsnx.pxjy.com.crt; ### 路径需要进行创建,证书文件 ssl_certificate_key ssl/pxsnx.pxjy.com.key; ### 证书秘钥文件 # 协议优化(可选,优化https协议,增强安全性) ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_prefer_server_ciphers on; # 自动跳转到https //注释此跳转,则实现的是兼容80和443端口访问 if ($server_port = 80) { rewrite ^(.*)$ https://$host$1 permanent; } location / { index index.php; if (!-e $request_filename){ rewrite ^/(.*)$ /index.php?s=$1; } } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } location ~ \.php { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PHP_VALUE "open_basedir=/app/webroot/project:/tmp/"; include fastcgi_params; } }
2.2 方法二
#cat /usr/local/nginx1.10.3/conf/conf.d/project.conf server { listen 80; server_name pxsnxg.pxjy.com; ### 配置网站域名 rewrite ^(.*)$ https://$host$1 permanent; ### 配置永久重定向 } #附: 如果想用泛域名进行配置的话,可以配置 “server_name *.pxjy.com;” ,单独命名一个全局的配置文件,便于管理 server { listen 443 ssl; server_name pxsnx.pxjy.com; ### 配置网站域名 root /app/webroot/project; access_log /app/applog/project.log main; error_log /app/applog/project.error.log error; ssl_certificate ssl/pxsnx.pxjy.com.crt; ### 路径需要进行创建,证书文件 ssl_certificate_key ssl/pxsnx.pxjy.com.key; ### 证书秘钥文件 # 协议优化(可选,优化https协议,增强安全性) ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_prefer_server_ciphers on; location / { index index.php; if (!-e $request_filename){ rewrite ^/(.*)$ /index.php?s=$1; } } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } location ~ \.php { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PHP_VALUE "open_basedir=/app/webroot/project:/tmp/"; include fastcgi_params; } }
3. 域名之间进行重定向跳转
3.1 方法一
#cat /usr/local/nginx1.10.3/conf/conf.d/project.conf server { listen 80; server_name m.zmnedu.com wap.zmnedu.com; root /app/webroot/project; access_log /app/applog/project.log main; error_log /app/applog/project.error.log error; #域名跳转 if ( $host = 'wap.zmnedu.com' ) { rewrite ^/(.*)$ http://m.zmnedu.com/$1 permanent; } location / { …… } error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { } location ~ \.php { …… } }
欢迎来访! yangsir!!