做项目的时候遇到一个难题,要为 IP 地址配置HTTPS请求。怎么办?
一般来说,都是给域名上HTTPS,怎么给IP上呢。
有请 ZeroSSL 出场,也是一家类似 Let’s Encrypt 的证书签发商,注册成为他们的免费用户就可以签发出 90 天有效期的证书,但是不同的是,他们家能签发 IP 的 SSL 证书哦,这个就比较少见了~
另外需要注意的是,ZeroSSL 限制每个账号能签发的免费证书数量为 3 个。但邮箱=账号
开始注册

图里面这个 1.1.1.1 处就是要填写你自己要申请的 IP 的
选择申请证书的有效时间的默认选择的是 1-Year 一年的,记得要换成 90-Day Certificate(90 天有效期),一年的证书是要花钱才能用的。
CSR 信息这个一般没需求的话让他自己自动生成(Auto-Generate CSR)就行了。
然后他需要我们进行验证,这个IP属于你

因为我们申请的是 IP 证书,所以无法像常规的域名证书那样通过 DNS 来进行检验,只能通过 HTTP 文件的形式来验证 IP。
他的大概意思是你必须要在服务器上面部署一个文件,别人能够通过the following link
指向的链接下载验证文件。
如何部署我们第二节再说。你可以手动访问这个链接来看能否下载下来。
一旦验证成功,他就会生成证书,证书是一个.zip
压缩包,后面我们讲怎么用

安装Openresty
我的阿里云服务器用的是1pannel,在1pannel面板的应用中心找到openresty,安装就行。

如何验证
安装后,1pannel会自动启动一个docker。我们把ZeroSSL的验证文件放置在1panel安装目录/1panel/apps/openresty/openresty/www
之下
因为这个文件挂载到了docker容器的/www
之下,/www
一般就存放网页的内容。
然后在1panel左栏点击网站-网页-设置(如图)

再点一下配置修改,就可以看到nginx的配置

改为如下内容(记得修改文件名哦,三个地方,还有一处地址)
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| http {
server { listen 80; server_name 地址;
location /.well-known/pki-validation/文件名.txt { alias /www/文件名.txt; add_header Content-Disposition 'attachment; filename="文件名.txt"'; add_header Content-Type 'application/octet-stream'; } } }
|
然后放开80端口,大功告成!你就可以让ZeroSSL验证啦
上传证书
我们成功从ZeroSSL下载证书压缩包并解压后会发现共有三块内容:
- ca_bundle.crt
- certificate.crt
- private.key
然后请把ca_bundle.crt以文本形式放置再certificate.crt 的末尾,这就是完整证书
然后打开1panel-网站-证书-上传证书。
私钥就是private.key的内容;而证书就是完整证书。
修改配置
下面讲如何配置代理。可以手动改,也可以可视化配置
手动改
假设我原来访问的 ip:port 是 http://1.2.3.4:8080
我这里设置: listen 443 ssl; 那么按照下面的代码配置,实现成功后,访问的 ip:port 变成
https://1.2.3.4:443。443 是 https 访问的默认端口,可以忽略 ,即访问 https://1.2.3.4 即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| server { listen 443 ssl; server_name 服务器ip;
ssl_certificate /www/server/nginx/ssl/服务器ip.pem; ssl_certificate_key /www/server/nginx/ssl/服务器ip.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_session_cache shared:SSL_Server1:1m; ssl_session_timeout 10m;
location / { proxy_pass http://127.0.0.1:服务端口; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
access_log /www/wwwlogs/access.log; error_log /www/wwwlogs/error.log; }
|
上面是使用默认端口,如果你想对指定端口也是用https。那么请这样
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| server { listen 8080 ssl http2 ; listen 443 ssl http2 ; server_name 服务器地址IPor域名; index index.php index.html index.htm default.php default.htm default.html; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; access_log /www/sites/服务器地址IPor域名/log/access.log main; error_log /www/sites/服务器地址IPor域名/log/error.log; location ^~ /.well-known/acme-challenge { allow all; root /usr/share/nginx/html; } if ($scheme = http) { return 301 https://$host$request_uri; } ssl_certificate /www/sites/服务器地址IPor域名/ssl/fullchain.pem; ssl_certificate_key /www/sites/服务器地址IPor域名/ssl/privkey.pem; ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1; ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; }
|
其中listen 8080 ssl http2 ;
就代表8080端口也要被https化,而且如果没有https的话,会通过下面这个片段升级为HTTPS。
1 2 3
| if ($scheme = http) { return 301 https://$host$request_uri; }
|
下面两端代码存储了ssl的公私钥的位置,记得放到openrsty对应容器的位置中。
1 2
| ssl_certificate /www/sites/服务器地址IPor域名/ssl/fullchain.pem; ssl_certificate_key /www/sites/服务器地址IPor域名/ssl/privkey.pem;
|
如果你想通过 ip:8080来访问,则需要让 Nginx 来绑定监听 8080 端口,而 Spring Boot 服务则需要绑定监听别的端口了。
即nginx监听端口和部署服务的端口不要一样!
自动配置

创建后,点击【配置】,然后选择https,打开并保存

然后点一下最上面的配置文件,
你会看到类似于
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| server { listen 你的端口; listen 443 ssl http2 ; server_name 服务器地址IPor域名; index index.php index.html index.htm default.php default.htm default.html; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; proxy_set_header X-Real-IP $remote_addr; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; access_log /www/sites/服务器地址IPor域名/log/access.log main; error_log /www/sites/服务器地址IPor域名/log/error.log; location ^~ /.well-known/acme-challenge { allow all; root /usr/share/nginx/html; } if ($scheme = http) { return 301 https://$host$request_uri; } ssl_certificate /www/sites/服务器地址IPor域名/ssl/fullchain.pem; ssl_certificate_key /www/sites/服务器地址IPor域名/ssl/privkey.pem; ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1; ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; error_page 497 https://$host$request_uri; proxy_set_header X-Forwarded-Proto https; add_header Strict-Transport-Security "max-age=31536000"; include /www/sites/服务器地址IPor域名/proxy/*.conf; }
|
其中listen 你的端口;
改为listen 你的端口 ssl http2;
否则这个端口的https请求还是不生效。并保存
然后记得去服务器开放你的端口,测试访问即可。如果不行,重启nginx容器试试。