我一直在努力解决这个问题,我似乎陷入了死胡同,不知道下一步该怎么做......
我接手了另一位休假员工留下的任务。他正在尝试为两个不同的网站设置 SSL 证书www.laenergiadelcambio.com和www.theenergyofchange.com。这些是针对单个域名的 thawte 证书。注意:我们在测试环境中进行这些更改,因此对 NGINX URL 的 vHosts 文件的更改尚未公开。
HTTPS 连接由 NGINX 服务器建立,在确保连接安全后,代理密码到提供网站内容的 Apache 机器。
首先,他遇到了两个网站总是收到相同证书(laenergiadelcambio.com)的问题。经过一番阅读,我们发现这是因为我们的操作系统(Centos 5.5)由于旧版本的 openssl(0.9.8e)而缺乏 TLS SNI(服务器名称指示)支持。我们决定为每个服务器块分配一个唯一的 IP 进行监听,如NGINX 文档。
事情是这样的。它可以工作,但不是在所有浏览器和版本中都有效。
对于以下经过测试的浏览器:
Opera 31.0.1889.174
Firefox 40.0
Firefox 38.0
Google Chrome 44.0.2403.157
Internet Explorer 11.0.9600.17691
Internet Explorer 9.0.8112.16421
每个人都能识别证书并建立安全连接。一切顺利,没有问题。
但对于以下这些,
Firefox 39.0.3
Firefox 40.0.3
lynx 2.8.5
我有证书不受信任错误。
火狐抱怨这个:(错误代码:sec_error_unknown_issuer)
我附上了证书的详细信息。
山猫把这个扔给我……
lynx www.theenergyofchange.com/wp-admin
Making HTTPS connection to www.theenergyofchange.com
Retrying connection without TLS.
Looking up www.theenergyofchange.com
Making HTTPS connection to www.theenergyofchange.com
Secure 256-bit TLSv1/SSLv3 (DHE-RSA-AES256-SHA) HTTP connection
Sending HTTP request.
HTTP request sent; waiting for response.
SSL error:unable to get local issuer certificate-Continue? (y)
SSL error:host(www.theenergyofchange.com)!=cert(theenergyofchange.com)- Continue? (y)
Alert!: Unexpected network read error; connection aborted.
Can't Access `https://www.theenergyofchange.com/wp-admin'
Alert!: Unable to access document.
接下来,我发布两个 nginx vHosts 配置,仅用于一个站点www.theenergyofchange.com,HTTP 和 HTTPS。另一个站点除了 server_names 之外完全相同
072-blogs_391_ing.conf
server {
server_name theenergyofchange.com theenergyofchange.es theenergyofchange.info theenergyofchange.eu www.theenergyofchange.es www.theene
rgyofchange.info www.theenergyofchange.eu;
rewrite ^ $scheme://www.theenergyofchange.com$request_uri permanent;
}
server {
listen 80;
server_name theenergyofchange.com theenergyofchange.es www.theenergyofchange.com pre.theenergyofchange.abg.corp www.theenergyofchange.
es www.theenergyofchange.com www.theenergyofchange.info www.theenergyofchange.eu;
access_log /var/log/nginx/blog_391ing.access.log;
error_log /var/log/nginx/blog_391ing.error.log error;
error_page 404 403 /handle404.html;
# error_page 502 503 504 /handle503.html;
error_page 500 502 503 504 /handle500.html;
location = /handle404.html {
root html/errores-prxy;
}
location = /handle503.html {
root html/errores-prxy;
}
location = /handle500.html {
root html/errores-prxy;
}
location = / {
proxy_pass http://wordpressprepro391.simosa.inet/;
}
location / {
proxy_pass http://wordpressprepro391.simosa.inet/;
}
location ~* /colab/web/system/modules/general/pages/captcha.jsp {
proxy_pass http://wordpressprepro391.simosa.inet;
}
location ~* /colab/web/system/modules/general/resources/js/ {
proxy_pass http://wordpressprepro391.simosa.inet;
}
location ~* /colab/ {
proxy_pass http://wordpressprepro391.simosa.inet;
}
# Redirect wp-admin and wp-login requests to HTTPS.
location ~ /wp-(?:admin|login|content|includes) {
return 301 https://$host$request_uri;
}
}
073-blogs_ing_392-ssl.conf
server {
listen 80;
rewrite ^(.*) https://$host$1 permanent;
}
server {
listen 192.168.14.141:443 ssl;
server_name www.theenergyofchange.com;
access_log /var/log/nginx/blog_392-ING-PRUEBA-SSL.access.log;
error_log /var/log/nginx/blog_392-ING-PRUEBA-SSL.error.log error;
error_page 404 403 /handle404.html;
# error_page 502 503 504 /handle503.html;
error_page 500 502 503 504 /handle500.html;
ssl on;
ssl_certificate /etc/nginx/openssl/CA/certs/ssl_certificate_ing.crt;
ssl_certificate_key /etc/nginx/openssl/CA/private/theenergyofchange.com.key;
ssl_client_certificate /etc/nginx/openssl/CA/certs/Intermediate_CA.crt;
location = /handle404.html {
root html/errores-prxy;
}
location = /handle503.html {
root html/errores-prxy;
}
location = /handle500.html {
root html/errores-prxy;
}
location = / {
proxy_pass http://wordpressprepro391.simosa.inet/;
}
location / {
proxy_pass http://wordpressprepro391.simosa.inet/;
}
proxy_read_timeout 3500;
proxy_connect_timeout 3250;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header SSL_PROTOCOL $ssl_protocol;
proxy_set_header SSL_CLIENT_CERT $ssl_client_cert;
proxy_set_header SSL_CLIENT_VERIFY $ssl_client_verify;
proxy_set_header SSL_SERVER_S_DN $ssl_client_s_dn;
}
那么..我在这里遗漏了什么,导致某些浏览器保护连接而其他浏览器不信任证书颁发者?
非常感谢!!
答案1
我怀疑您的同事误解了与 ssl 相关的指令:指向的文件ssl_certificate
应包含您的服务器证书,后面是中间证书,并且ssl_client_certificate
仅用于客户端证书验证和 OCSP - 我认为他将中间证书复制到了该文件中。现在,缓存中已有适当中间证书的浏览器将允许该页面,而尚未拥有这些证书的浏览器将失败,因为它们无法构建信任链。
尝试将该ssl_client_certificate
行放入注释中,并将中间证书复制到ssl_certificate_ing.crt
文件中如果还没有,并这样做后您的服务器的证书。
因此,ssl_certificate_ing.crt
看起来应该是这样的:
----- BEGIN CERTIFICATE -----
.. your server's certificate
----- END CERTIFICATE -----
----- BEGIN CERTIFICATE -----
.. first intermediate certificate
----- END CERTIFICATE -----
另请参阅文档。
在线检查证书内容的好工具:https://www.sslshopper.com/certificate-decoder.html