我们的网络应用程序托管在.com
域名,但在不同的国家/地区使用。应用程序运行在简单的SSL证书上,但我们考虑使用EV证书。在每个国家,我们都有不同的本地公司,因此我们考虑为每个国家/地区提供EV证书。
nginx
是否可以根据IP地址位置或至少按网址中的路径(/en/home/
,/it/...
,/fr/...
提供不同的SSL EV证书?
感谢。
答案 0 :(得分:1)
我知道从单个Nginx实例提供不同证书的最佳方式是通过域名。 (理论上可以根据客户端IP发送不同的证书,但我认为Nginx不支持此功能。不可能使用URL路径,因为在路由传输之前会进行SSL协商。)
我们假设您的网站是www.example.com。首先,设置国家/地区特定的子域名,例如es.example.com,fr.example.com等。
然后,您可以使用geoip module将流量重定向到相应的子域,如this tutorial中所示。
设置完成后,您可以为每个子域定义不同的nginx服务器块,每个子域都有自己的证书。这将使用SNI根据请求的域名确定在SSL协商期间提供的相应证书。您还需要包含默认通配符证书,因为并非所有浏览器都支持SNI。
答案 1 :(得分:0)
是的,如果您将其LUA后端与ssl部分一起使用,则可以使用ssl_certificate_by_lua_block
根据客户端发送的数据(例如其IP地址)来决定要公开的证书,请查看{{ 1}}功能。
您无法访问与URL相关的任何内容,因为该内容属于HTTP协议,其数据在TLS交换中晚得多。充其量,您可以在TLS握手的SNI部分中访问客户端请求的主机名(网站名称)。
有关所有详细信息:https://github.com/openresty/lua-resty-core/blob/master/lib/ngx/ssl.md和https://github.com/openresty/lua-nginx-module/#ssl_certificate_by_lua_block
一些摘要:
raw_client_addr
语法:ssl_certificate_by_lua_block {lua-script}
当NGINX即将启动SSL时,此指令运行用户Lua代码 下游SSL(https)连接的握手。
这对于设置SSL证书链和 每个请求对应的私钥。
并且:
ssl_certificate_by_lua_block
语法:addr_data,addr_type,err = ssl.raw_client_addr()
返回当前SSL连接的原始客户端地址。
前两个返回值是代表地址数据的字符串 和地址类型。地址值被解释 根据地址类型的值不同:
raw_client_addr
以及网站名称:
unix : The address data is a file path for the UNIX domain socket. inet : The address data is a binary IPv4 address of 4 bytes long. inet6 : The address data is a binary IPv6 address of 16 bytes long.
语法:name,err = ssl.server_name()
上下文:任意
返回客户端设置的TLS SNI(服务器名称指示)名称。 客户端未设置时返回nil。
万一失败,它将返回nil和描述错误的字符串。
通常,我们使用此SNI名称作为域名(例如 www.openresty.org),以在加载网站时标识当前网站 该网站的相应SSL证书链和私钥。