Nginx:基于国家/地区的SSL证书

时间:2016-11-12 22:03:45

标签: ssl nginx

我们的网络应用程序托管在.com域名,但在不同的国家/地区使用。应用程序运行在简单的SSL证书上,但我们考虑使用EV证书。在每个国家,我们都有不同的本地公司,因此我们考虑为每个国家/地区提供EV证书。

nginx是否可以根据IP地址位置或至少按网址中的路径(/en/home//it/.../fr/...提供不同的SSL EV证书?

感谢。

2 个答案:

答案 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.mdhttps://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证书链和私钥。