首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nginx代理证书自动发给MS IIS

Nginx代理证书自动发给MS IIS
EN

Stack Overflow用户
提问于 2015-10-25 18:49:16
回答 1查看 3.5K关注 0票数 2

Nginx1.9.5(LinuxIIS8.5)nginx:443->>IIS:443+客户端证书验证。

示例位置代理pass,这里还有我尝试过的注释命令。

代码语言:javascript
复制
location ^~ /test/ {
#proxy_buffering off;
#proxy_http_version 1.0;
#proxy_request_buffering off;
#proxy_set_header Connection "Keep-Alive";
#proxy_set_header X-SSL-CERT $ssl_client_cert;
# proxy_ssl_name domain.lv;
#proxy_ssl_trusted_certificate /etc/nginx/ssl/root/CA.pem;
#proxy_ssl_verify_depth 2;

proxy_set_header HOST domain.com;
proxy_ssl_certificate /etc/nginx/ssl/test.pem;
proxy_ssl_certificate_key /etc/nginx/ssl/test_key.pem;
proxy_ssl_verify off;
proxy_pass https://10.2.4.101/;

 }

在IIS simple。

  1. 创建新的网站。
  2. 在受信任的根中导入CA证书。
  3. 设置所需的ssl证书。

测试我得到了什么:

  1. 直接浏览到IIS客户端证书所需-工作。
  2. Nginx对其他nginx客户证书的要求--工作过。
  3. Nginx到IIS客户端证书忽略--已工作
  4. Nginx到IIS客户端证书需要或接受-不工作

错误: Nginx侧:*4622上游超时(110:连接超时),同时从上游IIS端读取响应头: 500 0 64 119971

所以我希望有人能知道为什么?

编辑1.也尝试从不同的服务器使用nginx 1.8,没有任何帮助。

代码语言:javascript
复制
proxy_ssl_verify off;
proxy_ssl_certificate /etc/nginx/ssl/test/test.pem;
proxy_ssl_certificate_key /etc/nginx/ssl/test/test_key.pem;
proxy_pass https://domain.com;

2.对Apache2.4进行同样的尝试

代码语言:javascript
复制
SSLProxyEngine On
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
SSLProxyMachineCertificateFile /etc/httpd/ssl/test.pem
ProxyPass "/test" "https://domain.com"

也许在nginx中重新谈判ssl?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-10 15:31:14

你对TLS重新谈判的预感是正确的。自0.8.23版本以来,Nginx一直不允许TLS重新协商(参见http://nginx.org/en/CHANGES)。但是,默认情况下,IIS在请求客户端证书时将使用TLS重新协商。(我找不到原因--如果有人能指点我,我将不胜感激!)

您可以使用包嗅探器(如wireshark )查看此操作:

  1. IIS和Nginx首先使用服务器证书执行TLS握手。
  2. Nginx请求资源。
  3. 该资源需要客户端身份验证,因此IIS向Nginx发送一条“Hello请求”消息,以启动TLS重新协商。
  4. Nginx不响应Hello请求,因为TLS重新协商已被禁用。
  5. IIS然后关闭连接,因为它没有得到响应。(参见https://technet.microsoft.com/en-us/library/cc783349(v=ws.10).aspx关于重新谈判的一节)

若要解决此问题,必须强制IIS在初始TLS握手时请求客户端证书。您可以使用powershell中的netsh实用程序或命令行来完成此操作:

  1. 打开具有管理员权限的powershell提示符。
  2. 输入netsh
  3. 输入http
  4. 输入show sslcert。您应该看到计算机上所有当前SSL绑定的列表:

  1. 请注意要为其启用客户端证书协商的证书的IP:端口和证书哈希。我们现在将删除此绑定,并将其重新添加,并将协商客户端证书属性设置为“已启用”。在本例中,IP:port为0.0.0.0:44300,证书散列为71472159d7233d56bc90cea6d0c26f7a29db1112。
  2. 输入delete sslcert ipport=[IP:port from above]
  3. 输入add sslcert ipport=[IP:port from above] certhash=[certificate hash from above] appid={[any random GUID (can be the same one from the show sslcert output)]} certstorename=MY verifyclientcertrevocation=enable verifyrevocationwithcachedclientcertonly=disable clientcertnegotiation=enable
  4. 现在,您可以通过再次运行show sslcert来确认此操作是否有效。您应该会看到一个几乎相同的输出,但是将协商客户证书设置为已启用:

请注意,此方法仅适用于单个证书--如果需要更改或更新证书,则必须再次运行这些步骤。当然,为了便于部署和维护,您应该将它们封装在批处理脚本或MSI安装程序自定义操作中。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33333609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档