我有一个使用 apache mod_proxy 的反向代理设置:
<VirtualHost *:443>
ServerName reverse.server.com
ProxyPass / http://10.1.9.11:3000/
ProxyPassReverse / http://10.1.9.11:3000/
ProxyPreserveHost on
...snip ssl stuff...
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
这在大多数情况下都能正常工作。问题在于内部服务器何时进行重定向。虽然 proxypassreverse 应该捕获该位置,但它似乎会重定向到http://reverse.server.com而不是https://reverse.server.com。所以它工作了一半,地址正确更改,但协议仍然作为内部服务器。
我不清楚为什么这样做,因为代理连接是 SSL - 有什么想法吗?
我在网络 A 上运行了几台主机,这些主机向网络 B 上的服务器(我不拥有)发出请求,该服务器位于 Internet 的某处。不幸的是,这些请求中的许多都被破坏了。如果我通过未加密的 HTTP 发出请求,我会收到暗示请求损坏的奇怪错误。如果我通过 HTTPS 发出请求,则会收到 SSL 级别的错误。我可以通过运行来重现问题:
sh -e -c 'while true; do curl $SERVER > /dev/null; sleep 1; done'
Run Code Online (Sandbox Code Playgroud)
通常在 20 个请求内,curl 失败并显示“未知 SSL 协议错误”或“tlsv1 警报解密错误”等错误。我可以在网络 A 中的多个主机上重现这个,访问网络 B 上的多个服务器。但我无法从网络 A 复制到其他服务器,或从其他主机复制到网络 B。在这些情况下,循环将永远运行而不会出错。
所以很明显我的 TCP 流在 A 和 B 之间被破坏了。顺便说一下,这已经持续了 3 天多。
第一个问题:这怎么可能发生?TCP 具有数据包级校验和,通过校验和的损坏数据包应该比我看到的要少得多。此外,如果我运行网络捕获,我不会看到很多重新传输(根据wireshark 的 tcp.analysis.retransmit 过滤器),如果数据包被损坏并且 TCP 校验和失败,您会期望这些。我想某些路由器必须进行更高级别的数据处理(NAT?透明代理?)并破坏数据但修复校验和?
第二个问题:我可以使用任何工具来隔离问题吗?我找不到任何。如果我知道网络拓扑结构并且可以在 A 和 B 之间的每一跳后面找到 HTTPS 服务器,我就可以对它们进行测试。但我没有。还有哪些测试会显示网络损坏?
我已经联系了网络 A 和网络 B 的所有者,但到目前为止他们没有帮助。
更新:对于任何建议路径中可能存在哪种错误设备的人,除了联系所有者之外,还有其他方法可以检测到这种情况吗?
简而言之:此请求失败。
$ curl 'https://secure.ogone.com/ncol/prod/orderstandard.asp' -vv
* About to connect() to secure.ogone.com port 443 (#0)
* Trying 213.254.248.101... connected
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* Unknown SSL protocol error in connection to secure.ogone.com:443
* Closing connection #0
curl: (35) Unknown SSL protocol error in connection to secure.ogone.com:443
Run Code Online (Sandbox Code Playgroud)
我知道 sslv2 安全风险需要将一些连接手动设置为 sslv1 或 sslv3。
但是,这也不起作用:
$ curl 'https://secure.ogone.com/ncol/prod/orderstandard.asp' -3
curl: (60) SSL certificate problem, verify that the CA cert …Run Code Online (Sandbox Code Playgroud) 我想设置具有多个域和 IP 的 nginx 反向代理,以便每个域使用不同的 SSL 证书。我将 Ubuntu 作为操作系统运行,该操作系统安装在 KVM/Qemu VM 上。
据我了解 nginx,它应该能够通过一个 IP 为一个域(以及属于它的子域)提供服务。但我无法让它运行......
这是我的 nginx 配置:
/etc/nginx/sites-enabled/my_first_domain
server {
listen x.x.x.84:80; # this is a public ip
server_name firstdomain.com;
access_log /var/log/nginx/access.log proxy; # I made my own logformat
error_log /var/log/nginx/error.log;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Client-IP $remote_addr;
proxy_set_header X-Host $host;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
location / {
rewrite ^/(.*) https://firstdomain/$1; # redirect to https
}
}
server {
listen x.x.x.84:443 ssl; # this is a public …Run Code Online (Sandbox Code Playgroud) 我从未在网站上使用过 https,现在想尝试一下。我做了一些研究,但不确定我是否理解了一切。非常感谢答案和更正。
开始了:
要使用 https,我需要为我使用的 Web 服务器生成“私有”和“公共”密钥。就我而言,它是 apache(手册:http : //httpd.apache.org/docs/2.0/ssl/ssl_faq.html)
Https 协议应该绑定到端口 443。
问:怎么做?是默认完成的吗?我在哪里可以检查配置?
应用https。
Q:如果我在浏览器中看到 https 是否意味着页面上的数据流量被加密了?页面上的任何表单都会通过 https 提交数据?
尽管所有数据都将被加密,但浏览器仍会显示难看的红色消息。这只是因为他们对我的证书一无所知。他们预装了大约一百个证书,但显然我的不是其中之一。但是数据是通过https加密的。
如果我希望浏览器识别我的证书,我需要由预安装其证书的证书颁发机构 (ca) 之一(例如 thawte、geotrust、rapidssl 等)对其进行签名。
UPD:要阅读 ssl/tsl:HTTPS 连接的前几毫秒,我发现它非常有用。有关如何在服务器端使用 ssl/tsl 加密的 PHP 代码示例在此处发布。
基本上,我需要 DNS 以不同的 CNAMES 响应,具体取决于请求是针对 HTTPS 还是 HTTP 对象发出的。
s.test.com -> IF(https) RESPONSE special.domain.com ELSE simple.domain.com
Run Code Online (Sandbox Code Playgroud)
是否可以?还有什么其他可能的方法来做到这一点?
我有一个 nginx 服务器设置(两个配置文件),其中有两个 gunicorn Web 服务器设置和运行。一个 gunicorn 是生产,另一个是登台。
我希望 nginx 向 xyz.com 提供 http 请求以及向 xyz.com 提供 https 请求到生产 gunicorn 服务器 @ 127.0.0.1:8000。
我已经完成了这个:
server {
listen 80;
server_name xyz.com;
return 301 https://$http_host$request_uri;
}
server {
listen 443 ssl;
server xyz.com;
..... <<< ssl stuff
location /{
.... proxy_stuff
proxy_pass http://127.0.0.1:8000;
}
}
Run Code Online (Sandbox Code Playgroud)
我还希望到 xyz.com:8080 的 http 流量和到 xyz.com:8080 的 https 流量到达临时服务器 @ 127.0.0.1:8081。我已经能够获得 https 流量到 xyz.com:8080 工作如下:
server {
listen 8080 ssl;
server_name xyz.com;
...... << ssl stuff
location …Run Code Online (Sandbox Code Playgroud) 您刚刚获得了一个新的 HTTPS (SSL/TLS) 证书,您希望得到正确的中间证书。
这是在 Apache 中设置的:
SSLCertificateKeyFile /etc/ssl/www.example.com.key
SSLCertificateChainFile /etc/ssl/www.example.com.chn
SSLCertificateFile /etc/ssl/www.example.com.crt
Run Code Online (Sandbox Code Playgroud)
或者在 Nginx 中使用:
ssl_certificate_key /etc/apache2/ssl/www.example.com.key;
ssl_certificate /etc/apache2/ssl/www.example.com.pem;
Run Code Online (Sandbox Code Playgroud)
记住apachectl configtest只检查这些文件是否存在;并且nginx -t“如果网站证书不是 crt 文件中的第一个,并且密钥错误,则会失败”(感谢Drifter104)。
那么,如何在重新启动之前检查所有内容?
您有错误的中间体(例如,GeoTrust 在一页上列出了它们的所有中间体)。
您不小心将中间证书文件与您的网站证书文件混合在一起。
您包含了根证书(影响性能,因为这会发送不必要的数据)。
您缺少一个或多个中级证书。
证书用于错误的密钥。
您已将这些文件保留为服务器上的任何人都可以读取(例如chmod 644)。
提取有关密钥、CSR 或证书文件的信息:
openssl rsa -check -in "www.example.com.key";
openssl req -text -noout -verify -in "www.example.com.csr";
openssl x509 -text -noout -in "www.example.com.crt";
Run Code Online (Sandbox Code Playgroud)
使用 sha256 获取公钥哈希(例如用于设置 HPKP):
openssl rsa …Run Code Online (Sandbox Code Playgroud) 我们的客户有一个基于 PrestaShop 的网上商店 ( https://www.hoerschiff.at ),现在他的托管商安装了 SSL 证书。我们更新了 PrestaShop 的配置,因此所有页面都强制通过 SSL 传送。我们现在面临的问题是,在 Chrome(也在 Safari 中)通过 HTTPS 加载页面的时间非常缓慢,而在 Firefox 中则可以正常加载。
开发人员工具表明,许多资产(JS、CSS、PNG 等)的“初始连接”时间非常长(从 5 秒到 1.5 分钟)。这仅在加载完整页面时发生。如果我直接加载一项资产(例如https://www.hoerschiff.at/themes/PRS030068/js/megnor/custom.js),它加载得很好。
我还发现了这个问题:Chrome 在 https 站点上运行缓慢,尤其是内部站点 但无法与之相关,因为当资产已经缓存时,站点正常加载。
首先,我认为这可能是 Apache/SSL 配置问题,但由于它在 Firefox 中正常加载,不应该是这种情况。
您有什么想法会导致初始连接时间变慢吗?
提前致谢!
我希望消除我对使用 Let's Encrypt 用于内部站点/应用程序的一些困惑。我无法在其他地方找到这些信息。
我想将 Let's Encrypt 与 Certbot 配对使用,以允许在应用程序上使用 SSL。
问题:
如果我的任何问题是无知的,我深表歉意,我对这类东西的了解非常有限。也就是说,甚至可能有更好的选择来完成我需要的事情,所以我愿意接受建议。我选择了让我们加密而不是自签名证书,因为使用此解决方案,我不需要向需要访问的每台客户端计算机添加 CA。
https ×10
ssl ×6
nginx ×3
apache-2.2 ×2
amazon-ec2 ×1
certificate ×1
corruption ×1
curl ×1
internet ×1
lets-encrypt ×1
mod-proxy ×1
networking ×1
tcp ×1
tls ×1
ubuntu ×1