Window下phpstudy使用nginx配置https

1、自生成私钥和私有证书

在 Windows 环境下搭建 Web 服务器跑 php 应用,难免大家都会想起 WAMP  和  PHPSTUDY 这些集成一键部署软件,以下分享下 Window 下 phpstudy 使用 nginx 配置 SSL 证书

首先保证有一个可以正常访问到网页的域名在手。
安装 OpenSSL (点击跳转下载地址)
⚠️ 下载完整 MSI 版
安装完成后开始配置环境变量
变量名:OPENSSL_HOME  变量值: OpenSSL 的安装目录\bin (变量值为 OPENSSL 安装位置下的 bin 目录)

在 Path 变量结尾添加一条: %OPENSSL_HOME%

打开  phpstudy  安装目录下找到  nginx 文件夹 新建  openssl  文件夹

在文件夹路径栏敲击进入 CMD

创建 Key 私钥

创建 2048 bit 级别 Key 私钥
openssl genrsa -des3 -out google_test.key 2048

创建并配置 CSR 证书

继续创建 2048 bit 级别 CSR 证书
openssl req -new -nodes -newkey rsa:2048 -keyout google_test.key -out google_test.csr
⚠️ 这里的 google_test.key 文件为同一目录下的文件

1
2
3
4
5
6
7
8
9
10
11
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Guangdong
Locality Name (eg, city) []:ZhuHai
Organization Name (eg, company) [Internet Widgits Pty Ltd]:google_test.cn Team
Organizational Unit Name (eg, section) []:BiNoL Project
Common Name (e.g. server FQDN or YOUR name) []:google_test.cn
Email Address []:postmaster@google_test.cn
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

⚠️ A challenge password 不需要填写,不然日后在 Nginx 需要再次去除
至此,在 CMD 的根目录就生成了私有 CSR 证书。

2、NGINX  配置  SSL

本文档指导您在  NGINX HTTP  服务器上安装并配置  SSL  证书,关于  NGINX  在各个平台上的安装不再涉及。

配置  SSL  证书

1.  最正规的且完整的  SSL  证书分为四个部分:

CA  根证书  (root CA)  中级证书  (Intermediate Certificate)  域名证书 证书密钥  (仅由您持有)
以  COMODO PositiveSSL  证书为例,您将收到四份文件:
根证书  - AddTrustExternalCARoot.crt  中级证书  - COMODORSAAddTrustCA.crt  中级证书  - COMODORSADomainValidationSecureServerCA.crt  您的域名证书  - example_com.crt

2.  一般地,证书签发中心签发的 SSL 证书只有两个:

CA  证书串  - example_com.ca-bundle  您的域名证书  - example_com.crt

3.  最简单的只有一个 PEM 证书:

CA 证书  - full_chain.pem
接着需要要依照  域名证书  ->  中间证书  ->  根证书  的顺序串联为证书链,才能被绝大多数浏览器信任。提议在 Liunx 系统上使用  cat  命令串联证书,以下列举第一种情况:
cat example_com.crt COMODORSADomainValidationSecureServerCA.crt COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > example_com.bundle.crt
而第二种情况如下:
cat example_com.crt example_com.ca-bundle > example_com.bundle.crt
而第三种则不需要处理!
得到的新文件(example_com.bundle.crt)或(full_chain.pem)后,和私钥文件  xxx.key  一同上传至服务器并保存在安全的位置。

修改  NGINX  站点配置

下面是一份针对较新版本的  NGINX  的  SSL  部分配置,请将其添加到站点配置文件中  server  的部分,并根据注释和您的需求修改。

1
2
3
4
5
6
7
8
9
10
11
listen 443 ssl;    # 侦听端口
# listen [::]:443 ssl ipv6only=on; # 如果您希望同时侦听 IPv6,请取消此行注释
server_name example.com; # 请改为您的域名
ssl_certificate /etc/ssl/private/example_com.bundle.crt; # 证书链
ssl_certificate_key /etc/ssl/private/example_com.key; # 密钥
ssl_protocols TLSv1.2 TLSv1.1 TLSv1; # 支持的协议,Windows XP 不支持
ssl_prefer_server_ciphers on; # 启用 Forward Secrecy
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
keepalive_timeout 70;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;

如果您希望至少支持一些老式浏览器,并且在能够使用  ECDHE  时尽可能使用此算法,您可以使用下面的配置:

1
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS +RC4 RC4";

能够最低支持到  Android 2.3 (不支持  IE6)  的方案:

1
2
ssl_ciphers "CHACHA20:ECDH+AESGCM:ECDH+AES256:RSA+AESGCM:RSA+AES:DH+AESGCM:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+3DES:!aNULL:!eNULL:!EXPORT:!CAMLLIA:!DES:!MD5:!PSK:!RC4";

或者使用最简单的方案:

1
ssl_ciphers "EECDH+aRSA+AES";

当然你也可以使用您可能需要使用  LibreSSL  以支持  CHACHA20  算法,以下不再枚举。

生成  DHE  参数

为了避免使用  OpenSSL  默认的  1024bit DHE  参数,我们需要生成一份更强的参数文件:
openssl dhparam -out dhparam.pem 4096
建议您使用性能强劲的平台生成此文件,例如最新版的至强物理机。如果您只有一台小型  VPS,请使用以下命令生成  2048bit  的参数文件。
openssl dhparam -out dhparam.pem 2048
完成后,在  SSL  配置下添加一行:
ssl_dhparam /etc/ssl/certs/dhparam.pem;

启用  HSTS

HTTP Strict Transport Security (HSTS)  可以使浏览器第一次访问您的站点后即记住仅通过  HTTPS  与您的站点通信,可以大大提升安全性。
在  SSL  配置下添加:

1
2
3
add_header Strict-Transport-Security max-age=63072000;
# add_header X-Frame-Options DENY; # 如果不需要引用 iframe 则可以加上
add_header X-Content-Type-Options nosniff;

强制定向到  HTTPS

这里提供三种方法,使到访问域名的使用不约而同的使用 https 通道。

1.  侦听  HTTP 80  端口

1
2
3
4
5
6
7
8
server {
listen 80;
# listen [::]:80; # 如果您需要同时侦听 IPv6,请取消此行注释
server_name example.com; # 您的域名
location / {
return 301 https://example.com$request_uri; # 要重定向的地址,请将 example.com 改为您的域名
}
}

2.  使用重写

1
rewrite ^ https://example.com$request_uri? permanent;    # 请将 example.com 改为您的域名

3.  使用解析 301 跳转

示例,这里是基于  NGINX 1.15.11  的一份完整配置样例,结合实际,仅供参考。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
listen 80 ;
listen 443 ssl;
ssl_certificate "C:\phpstudy_pro\Extensions\Nginx1.15.11\conf\ssl\52cxw_cn.bundle.crt"; # 证书链
# ssl_certificate "C:\phpstudy_pro\Extensions\Nginx1.15.11\conf\ssl\full_chain.pem"; # 证书链
ssl_certificate_key "C:\phpstudy_pro\Extensions\Nginx1.15.11\conf\ssl\fecmall.key"; # 密钥
ssl_prefer_server_ciphers on;
ssl_dhparam "C:\phpstudy_pro\Extensions\Nginx1.15.11\conf\ssl\dhparam.pem";
ssl_protocols TLSv1.2 TLSv1.1 TLSv1; # 支持的协议,Windows XP 不支持
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
keepalive_timeout 70;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security max-age=63072000;
# add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
server_name appfront.52cxw.cn www.xxx.cn xxx.cn;
root "D:\wwwroot\fecshop\appfront\web";
server_tokens off;
include none.conf;
index index.php index.html index.htm;
}

3、常见问题

Q:Nginx  部署 ssl 证书出现[emerg] PEM_read_bio_X509_AUX failed

问题在于证书合并出现了异常“—–END CERTIFICATE———-BEGIN CERTIFICATE—–”粘在了一起,分开即可。

Centos 7.5 nginx+web 集群配置 https 报错 报错信息: [root@lb01 conf.d]# nginx -t nginx: [emerg] BIO_new_file(“/etc/nginx/ssl_key/server.crt”) failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen(‘/etc/nginx/ssl_key/server.crt’,’r’) error:2006D080:BIO routines:BIO_new_file:no such file) nginx: configuration file /etc/nginx/nginx.conf test failed

没有证书,解决方法:/etc/nginx/ssl_key 里面放置证书

作者

Catooilg

发布于

2020-10-15

更新于

2023-05-28

许可协议

评论