我有一个 EC2 实例,Apache 作为网络服务器(和 Wildfly 作为应用服务器,虽然我不确定它与这个问题有什么关系)。在 EC2 前面,我有一个负载均衡器,它终止 HTTPS 并应用 SSL 证书。
HTTP 和 HTTPS 在 Chrome 中都可以正常工作,但不幸的是在 Safari 中不行。访问http://test.papereed.com工作正常,但访问https://test.papereed.com会出现错误
"Safari can't open the page. The error is "The operation couldn't be completed. Protocol error" (NSPOSIXErrorDomain:100)"
Run Code Online (Sandbox Code Playgroud)
我查看了 /etc/httpd/logs/error_log 和 /etc/httpd/logs/access_log 以及 Safari 控制台,但没有找到解决问题的任何提示。这就是我的知识有多远:-( 任何有关如何追踪此问题的提示将不胜感激。
我们刚刚从 GoDaddy 获得了一个新的 SSL 证书。而且,虽然所有浏览器都可以使用该证书,但 Safari 会出现以下错误:
此证书由未知机构签署。
我们在 Apache 的以下配置中使用链文件:
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/godaddy.crt
SSLCertificateKeyFile /etc/apache2/ssl/godaddy.key
SSLCertificateChainFile /etc/apache2/ssl/gd_bundle2.crt
Run Code Online (Sandbox Code Playgroud)
环顾网络,似乎其他人也遇到了这个问题(http://blog.boxedice.com/2009/05/11/godaddy-ssl-certificates-and-cannot-verify-identity-on-macsafari/ ) 但似乎没有解决方案可以解决这个问题。
有谁知道为什么会导致这种情况,或者有过这种情况发生的经验,以及如何解决?
问题:由于 iOS 9 现在使用 ATS,我们的移动应用程序无法再与我们的网络服务建立安全连接。
背景: iOS 9 引入了应用传输安全
服务器设置: Windows Server 2008 R2 SP1 (VM) IIS 7.5,来自 digicert 的 SSL 证书。Windows 防火墙关闭。
密钥 RSA 2048 位 (e 65537)
发行人 DigiCert SHA2 安全服务器 CA
签名算法SHA512withRSA
这些是应用传输安全要求:
服务器必须至少支持传输层安全 (TLS) 协议版本 1.2。连接密码仅限于提供前向保密的密码(请参阅下面的密码列表。)证书必须使用 SHA256 或更好的签名散列算法进行签名,使用 2048 位或更高的 RSA 密钥或 256 位或更高的椭圆曲线(ECC) 键。无效的证书会导致硬故障和无连接。这些是公认的密码:
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
已经尝试过的:
我的 NGINX 服务器上的 HTTP2 协议有问题,这是我的配置
listen 443 ssl http2;
server_name adomain.com;
root /var/www/project;
limit_req zone=one burst=60 nodelay;
add_header Strict-Transport-Security "max-age=2592000; includeSubdomains;" always;
ssl_certificate /etc/letsencrypt/live/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
resolver 8.8.8.8;
ssl_stapling on;
ssl_stapling_verify on;
keepalive_timeout 70;
Run Code Online (Sandbox Code Playgroud)
我在我的 iOS 设备(safari 11)上看不到错误,很奇怪网页是一个 SPA(angular),应用程序向 API 发出请求,应用程序通过 HTTP2 加载,但是当应用程序必须向API 失败,禁用listen
HTTP2 使一切正常
两个服务器前端/后端的密码相同
在 Chrome/Firefox/IE 中工作正常,我不知道 Safari 或我的服务器配置有什么问题
Safari 失败时 error.log 和 adomain-error.log 为空
nginx版本
nginx version: nginx/1.12.2
built by gcc …
Run Code Online (Sandbox Code Playgroud)