给后端 API 接口加一个 HTTPS 网关,提升接口的安全性
申请 SSL 证书
可以在腾讯云上申请免费证书,按照提示添加验证域名解析内容,然后下载,一般选择 Nginx 格式
下载后得到 4 个文件
- {host}.key:私钥
- {host}.csr:请求签名文件
- {host}_bundle.crt/{host}_bundle.pem:这两个内容一样,都是证书文件
如果需要可以单独下载根证书
配置 Apisix
创建一个 Apisix 的配置文件如下,填入相应的 API 服务地址,匹配 URL 路径,自定义的 key-auth,以及私钥和证书内容
upstreams:
- id: 1
name: "my-api"
type: roundrobin
nodes:
"api-server:80": 1 # 原服务地址,原 HTTP 服务端口可以只对本机开发无需暴露给互联网
routes:
- name: "my-api"
uri: /* # URL 匹配路径
methods: ["POST"] # 运行请求的 method
upstream_id: 1 # 上面填的 upstream 的 id
plugins:
key-auth: {
"header": "X-Apikey", # 自定义的 header,请求时按照 -H 'X-Apikey: {key}' 传入
}
consumers:
- username: {username}
plugins:
key-auth:
key: {key} # 为接口加上 key-auth 提升安全性
ssls:
- sni: "{domain}"
cert: |
-----BEGIN CERTIFICATE-----
{cert content}
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
key: |
-----BEGIN RSA PRIVATE KEY-----
{private key}
-----END RSA PRIVATE KEY-----
#END
启动 Apisix
先启动服务,可以创建 docker 网络讲服务暴露给 apisix,无需对外暴露端口
docker create network ${NETWORK_NAME}
docker run -d \
--name ${SERVER_NAME}\
--network ${NETWORK_NAME} \
${SERVER_IMAGE}:0.0.1
然后启动 apisix
docker run -d --restart unless-stopped \
--network ${NETWORK_NAME} \
--name ${APISIX_NAME} \
-p 8080:9080/tcp \
-p 8443:9443/tcp \
-e APISIX_STAND_ALONE=true \
-e TZ=Asia/Shanghai \
-v ${PWD}/apisix.yaml:/usr/local/apisix/conf/apisix.yaml:ro \
apache/apisix:${APISIX_VERSION}
然后可以通过 HTTPS 请求接口
curl -XPOST -H 'X-Apikey: mykey' https://host:8443/ping
通过 HTTPS 和 key-auth,无法通过抓包破解接口内容,对于后端或是编译后的代码发出的请求来说已经足够安全。然而如果是 web 发起的请求,由于浏览器会解析请求详情,用户可以看到请求的 header 和里面的 apikey,还需要其他更安全的方案。