做项目的时候遇到一个难题,要为 IP 地址配置HTTPS请求。怎么办?

一般来说,都是给域名上HTTPS,怎么给IP上呢。

有请 ZeroSSL 出场,也是一家类似 Let’s Encrypt 的证书签发商,注册成为他们的免费用户就可以签发出 90 天有效期的证书,但是不同的是,他们家能签发 IP 的 SSL 证书哦,这个就比较少见了~

另外需要注意的是,ZeroSSL 限制每个账号能签发的免费证书数量为 3 个。但邮箱=账号

开始注册

注册1

图里面这个 1.1.1.1 处就是要填写你自己要申请的 IP 的

选择申请证书的有效时间的默认选择的是 1-Year 一年的,记得要换成 90-Day Certificate(90 天有效期),一年的证书是要花钱才能用的。

CSR 信息这个一般没需求的话让他自己自动生成(Auto-Generate CSR)就行了。

然后他需要我们进行验证,这个IP属于你

验证IP属于你

因为我们申请的是 IP 证书,所以无法像常规的域名证书那样通过 DNS 来进行检验,只能通过 HTTP 文件的形式来验证 IP。

他的大概意思是你必须要在服务器上面部署一个文件,别人能够通过the following link指向的链接下载验证文件。

如何部署我们第二节再说。你可以手动访问这个链接来看能否下载下来。

一旦验证成功,他就会生成证书,证书是一个.zip压缩包,后面我们讲怎么用

下载证书

安装Openresty

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

openresty的下载

如何验证

安装后,1pannel会自动启动一个docker。我们把ZeroSSL的验证文件放置在1panel安装目录/1panel/apps/openresty/openresty/www之下

因为这个文件挂载到了docker容器的/www之下,/www一般就存放网页的内容。

然后在1panel左栏点击网站-网页-设置(如图)

Niginx配置1

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

niginx配置2

改为如下内容(记得修改文件名哦,三个地方,还有一处地址)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
http {
# 原有的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监听端口和部署服务的端口不要一样!

自动配置

自动配置代理1

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

自动配置代理2

然后点一下最上面的配置文件,

你会看到类似于

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容器试试。