nginx配置https

最近做点小程序,服务端api必须是https域名,配置方法如下:

创建ssh证书

自己生成CA证书:(自己生成的根证书浏览器不认,会提示不安全,但https可访问)
cd /home/openssl
openssl genrsa -des3 -passout pass:123456 -out test.pem 2048  #生成RSA私钥
openssl rsa -passin pass:123456 -in test.pem -out test.key  #提取密钥中的公钥
openssl req -new -key test.key -out test.csr -subj /C=CN/ST=beijing/L=beijing/O=YAN/CN=www.yanjingang.com #生成证书请求文件
openssl x509 -req -days 365 -in test.csr -signkey test.key -out test.crt  #生成自签名证书
openssl x509 -in test.crt -noout -text  #查看证书文件

阿里云、百度云有免费的单域名DV证书(下载注意选择nginx版本证书)

nginx配置

vim conf/vhost/php.conf
server {
  listen 8080;   #监听http
  server_name www.yanjingang.com yanjingang.com;
  rewrite ^(.*) https://$server_name$1 permanent;
}
server {
  listen 8443 ssl;  #监听https
  #开启ssl并设置证书
  ssl on;
  ssl_certificate /home/openssl/www.yanjingang.crt;
  ssl_certificate_key /home/openssl/www.yanjingang.key;
  ...
}

重启nginx后使用https://www.yanjingang.com访问即可(注:私人生成的证书会提示不安全,忽略即可)。

https端口转发

#80->8080、443->8443 端口转发
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443

service iptables save
iptables -L -t nat  	#查看当前nat规则
	Chain PREROUTING (policy ACCEPT)
	target     prot opt source               destination         
	REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:http redir ports 8080
	REDIRECT   tcp  --  anywhere             anywhere             tcp dpt:https redir ports 8443

注:公网80、443、8080、8443等端口需要在aliyun安全组中入方向打开才可访问

使用https://www.yanjingang.com即可访问


看到这里满足需求的离开即可,遇到微信小程序TLS1.2问题的往后看。

在完成以上步骤后发现,https已经是安全的,百度小程序api调用也正常,但是微信小程序api调用提示“对应的服务器 TLS 为 TLS 1.0 ,小程序要求的 TLS 版本必须大于等于 1.2 。”

Nginx TLS 1.2配置

1.openSSL 版本需要 >= 1.0.2
  openssl version -a
2.nginx 版本为 0.7.65,0.8.19 及更高版本
  nginx -V
3.nginx是使用的openssl 1.0.2+编译的
  nginx -V |grep openssl
4.nginx tls1.2配置
  ssl_session_timeout 5m;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;

实际情况是我们的server使用内部自研开发框架,nginx编译依赖很多内部插件,且使用openssl 1.0.1编译的,所以怎么设置TLS都是1.0,nginx -V如下:

解决方法:

1.长线方案
下载内部插件源码自己使用openssl1.0.2重新编译nginx
# 更新openssl版本
cd odp/nginx/download/nginx-release.git/libs/
wget http://ftp.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz
rm openssl-1.0.1s.tar.gz
# 重新编译nginx
sh build.sh module-for-odp3.conf  
# 替换nginx
mv /home/work/odp/webserver/sbin/nginx /home/work/odp/webserver/sbin/nginx.openssl-1.0.1s
cp tmp/webserver/sbin/nginx /home/work/odp/webserver/sbin/

2.短线方案
使用外部openssl1.0.2编译的nginx做代理,将iptables端口删除,转发改为nginx代理转发
#设置nginx代理server
vim proxyserver/conf/proxy.conf
    #80->8080端口转发
    server {
        listen              80;
        server_name         _;

        access_log  /home/proxyserver/log/proxyserver.log;
        error_log  /home/proxyserver/log/proxyserver.log.wf;

        location / {
            proxy_set_header Host $http_host;
            proxy_set_header X-Host $http_host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X_ORIG_URI $request_uri;
            proxy_set_header CLIENTIP $remote_addr;
            proxy_set_header X-Forwarded-For-Proto https;
            proxy_set_header Https 1;

            proxy_pass http://127.0.0.1:8080;

        }
    }
    #443->8080端口转发
    server {
        listen              443 ssl;
        server_name         _;

        access_log  /home/proxyserver/log/proxyserver.log;
        error_log  /home/proxyserver/log/proxyserver.log.wf;

        #开启https ssl
        ssl on;
        ssl_certificate      /home/openssl/cert-1542784817162_www.yanjingang.com.crt;
        ssl_certificate_key  /home/openssl/cert-1542784817162_www.yanjingang.com.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

        location / {
            proxy_set_header Host $http_host;
            proxy_set_header X-Host $http_host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X_ORIG_URI $request_uri;
            proxy_set_header CLIENTIP $remote_addr;
            proxy_set_header X-Forwarded-For-Proto https;
            proxy_set_header Https 1;

            proxy_pass http://127.0.0.1:8080;

        }
    }
#启动代理nginx
/usr/sbin/nginx -c /home/proxyserver/conf/proxy.conf

#删除iptables端口转发
iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -D PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443
service iptables save
iptables -L -t nat
#删除nginx webserver的8443端口监听和ssl配置并重启

#使用https://www.yanjingang.com验证TLS1.2和小程序调用

重启小程序开发工具后测试调用成功,收工~!

yan 18.11.21 22:00

资料:

openssl 非对称加密算法RSA命令详解:https://www.cnblogs.com/gordon0918/p/5363466.html

openssl 证书请求和自签名命令req详解:https://www.cnblogs.com/gordon0918/p/5409286.html

微信小程序要求的TLS版本大于等于1.2的问题:https://www.cnblogs.com/xjnotxj/p/7252043.html

欢迎关注下方“非著名资深码农“公众号进行交流~

发表评论

邮箱地址不会被公开。