给 API 加一个 HTTPS 网关

申请 SSL 证书

可以在腾讯云上申请免费证书,按照提示添加验证域名解析内容,然后下载,一般选择 Nginx 格式

下载后得到 4 个文件

  • {host}.key:私钥
  • {host}.csr:请求签名文件
  • {host}_bundle.crt/{host}_bundle.pem:这两个内容一样,都是证书文件

如果需要可以单独下载根证书

配置 Apisix

创建一个 Apisix 的配置文件如下,填入相应的 API 服务地址,匹配 URL 路径,自定义的 key-auth,以及私钥和证书内容

代码语言:yaml
复制
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,无需对外暴露端口

代码语言:bash
复制
docker create network ${NETWORK_NAME}
docker run -d \
    --name ${SERVER_NAME}\
    --network ${NETWORK_NAME} \
    ${SERVER_IMAGE}:0.0.1

然后启动 apisix

代码语言:bash
复制
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 请求接口

代码语言:bash
复制
curl -XPOST -H 'X-Apikey: mykey' https://host:8443/ping

通过 HTTPS 和 key-auth,无法通过抓包破解接口内容,对于后端或是编译后的代码发出的请求来说已经足够安全。然而如果是 web 发起的请求,由于浏览器会解析请求详情,用户可以看到请求的 header 和里面的 apikey,还需要其他更安全的方案。