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

  • cert: SSL 密钥对的公钥,pem 格式
  • key: SSL 密钥对的私钥,pem 格式
  • sni: SSL 证书所指定的域名,注意在设置这个参数之前,你需要确保这个证书对应的私钥是有效的。

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

  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. }'
  6. # 测试一下
  7. curl --resolve 'www.test.com:9443:127.0.0.1' https://www.test.com:9443/hello -vvv
  8. * Added test.com:9443:127.0.0.1 to DNS cache
  9. * About to connect() to test.com port 9443 (#0)
  10. * Trying 127.0.0.1...
  11. * Initializing NSS with certpath: sql:/etc/pki/nssdb
  12. * SSL connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  13. * Server certificate:
  14. * subject: CN=test.com,O=iresty,L=ZhuHai,ST=GuangDong,C=CN
  15. * start date: Jun 24 22:18:05 2019 GMT
  16. * expire date: May 31 22:18:05 2119 GMT
  17. * common name: test.com
  18. * issuer: CN=test.com,O=iresty,L=ZhuHai,ST=GuangDong,C=CN
  19. > GET /hello HTTP/1.1
  20. > User-Agent: curl/7.29.0
  21. > Host: test.com:9443

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