HTTPS

APISIX 支持通过 TLS 扩展 SNI 实现加载特定的 SSL 证书以实现对 https 的支持。

SNI(Server Name Indication)是用来改善 SSL 和 TLS 的一项特性,它允许客户端在服务器端向其发送证书之前向服务器端发送请求的域名,服务器端根据客户端请求的域名选择合适的SSL证书发送给客户端。

单一域名指定

通常情况下一个 SSL 证书只包含一个静态域名,配置一个 ssl 参数对象,它包括 certkeysni三个属性,详细如下:

  • cert: SSL 密钥对的公钥,pem 格式
  • key: SSL 密钥对的私钥,pem 格式
  • sni: SSL 证书所指定的域名,注意在设置这个参数之前,你需要确保这个证书对应的私钥是有效的。
  1. curl http://127.0.0.1:9080/apisix/admin/ssl/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
  2. {
  3. "cert": "...",
  4. "key": "....",
  5. "sni": "test.com"
  6. }'
  7. # 测试一下
  8. curl --resolve 'test.com:9443:127.0.0.1' https://test.com:9443/hello -vvv
  9. * Added test.com:9443:127.0.0.1 to DNS cache
  10. * About to connect() to test.com port 9443 (#0)
  11. * Trying 127.0.0.1...
  12. * Connected to test.com (127.0.0.1) port 9443 (#0)
  13. * Initializing NSS with certpath: sql:/etc/pki/nssdb
  14. * skipping SSL peer certificate verification
  15. * SSL connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  16. * Server certificate:
  17. * subject: CN=test.com,O=iresty,L=ZhuHai,ST=GuangDong,C=CN
  18. * start date: Jun 24 22:18:05 2019 GMT
  19. * expire date: May 31 22:18:05 2119 GMT
  20. * common name: test.com
  21. * issuer: CN=test.com,O=iresty,L=ZhuHai,ST=GuangDong,C=CN
  22. > GET /hello HTTP/1.1
  23. > User-Agent: curl/7.29.0
  24. > Host: test.com:9443
  25. > Accept: */*

泛域名

一个 SSL 证书的域名也可能包含泛域名,如*.test.com,它代表所有以test.com结尾的域名都可以使用该证书。 比如*.test.com,可以匹配 www.test.commail.test.com甚至a.b.test.com

看下面这个例子,请注意 sni 这个属性:

  1. curl http://127.0.0.1:9080/apisix/admin/ssl/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
  2. {
  3. "cert": "...",
  4. "key": "....",
  5. "sni": "*.test.com"
  6. }'
  7. # 测试一下
  8. curl --resolve 'www.test.com:9443:127.0.0.1' https://www.test.com:9443/hello -vvv
  9. * Added test.com:9443:127.0.0.1 to DNS cache
  10. * About to connect() to test.com port 9443 (#0)
  11. * Trying 127.0.0.1...
  12. * Connected to test.com (127.0.0.1) port 9443 (#0)
  13. * Initializing NSS with certpath: sql:/etc/pki/nssdb
  14. * skipping SSL peer certificate verification
  15. * SSL connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  16. * Server certificate:
  17. * subject: CN=test.com,O=iresty,L=ZhuHai,ST=GuangDong,C=CN
  18. * start date: Jun 24 22:18:05 2019 GMT
  19. * expire date: May 31 22:18:05 2119 GMT
  20. * common name: test.com
  21. * issuer: CN=test.com,O=iresty,L=ZhuHai,ST=GuangDong,C=CN
  22. > GET /hello HTTP/1.1
  23. > User-Agent: curl/7.29.0
  24. > Host: test.com:9443
  25. > Accept: */*

多域名的情况

如果一个 SSL 证书包含多个独立域名,比如www.test.commail.test.com,通配符方式又会导致匹配不严谨。 所以针对不同域名,设置不同 SSL 证书对象即可。