1

在准备提交应用程序时,我发现 Apple 要求所有调用都必须使用 HTTPS。在我的代码中,服务器 URLSyncUser.logIn只是一个普通的普通HTTP调用http://mywebsite:9080

我的配置详情

  • 我有一个注册域http://example.com。它只是一个域,它下面没有托管任何东西。
  • ROS 安装在 Amazon EC2 实例上 (Ubuntu 16.04)
  • 从 的域注册商处http://example.com,我将 URL 指向我的 EC2 实例上的弹性 IP 地址。
  • 我可以通过以下方式访问领域仪表板:http://example.com:9080

困境

SSL / HTTPS 对我来说是一个新领域。我做了一些阅读,我意识到我的域需要一个 SSL 证书。然而:

  1. 我通过AWS Certificate Manager为域颁发了证书,但它无法部署到我的实例上。不支持 EC2
  2. 我还尝试了 certbot——它生成了保存在我的 EC2 实例的 /etc 目录下的密钥,但我不知道如何使用它们。

因此,当我在 SSL 检查器中输入我的网站时,它正确地说没有找到 SSL 证书。

我需要退出 AWS 吗?

我在这里找到了答案,但这似乎是一个过时的答案(或者可能太老套了)。我还发现这些幻灯片可以做到这一点,但它们完全超出了我的想象。

4

2 回答 2

1

Apple 的要求比您最初的问题更细微,截止日期已延长,但尚未具体说明。

请参阅2017 年 2 月的固定论坛帖子,其中引用了要点:

  • NSAllowsArbitraryLoadsInWebContent让您拥有严格的 ATS 字典,但仍可在 Web 视图中加载任意内容 ( WKWebView, UIWebView, WebView)
  • 自 WWDC 以来新增NSAllowsLocalNetworking允许您选择退出 ATS 进行本地网络 - 要了解更多信息,请参阅 信息属性列表密钥参考NSAppTransportSecurity部分。
  • 自 WWDC 以来新增NSAllowsArbitraryLoadsForMedia允许您选择退出 ATS 以获取媒体资源 — 要了解更多信息,请参阅 信息属性列表密钥参考NSAppTransportSecurity部分。
  • NSRequiresCertificateTransparency让您选择加入 证书透明度检查
  • 现在默认禁用使用 RC4 的密码套件
  • SSLv3 协议现在在安全传输层默认禁用
  • 仍然支持使用 SHA-1 或 3DES 的密码套件,但您应该考虑远离它们
  • 自 WWDC 以来新增NSURLConnection现在支持 ATS 最低 TLS 版本——以前 NSURLConnection 将忽略 ATS 规定的最低 TLS 版本(r. 23167645)。此错误已修复。如果您将 NSURLConnection 用于网络,请确保在最新发布的操作系统上运行您的应用程序,以确保它仍然按预期工作。

Apple于 2016 年 12 月 21 日宣布此截止日期已延长,我们将在新的截止日期确定后提供另一次更新

于 2017-03-15T13:33:36.563 回答
0

我对 AWS 的 SSL 内容并不十分熟悉,但实现这一点的一种简单方法是在您的 EC2 实例上使用 Nginx 作为 SSL 反向代理。您将使用 Nginx 设置 SSL 证书,并让 Nginx 将流量路由到您的领域对象服务器。您还可以获得监听标准端口 443(如果您愿意)的好处,并且您可以保持 9080 端口对外部流量关闭。

以下是使用 Nginx 设置反向代理的说明:https ://www.techandme.se/set-up-nginx-reverse-proxy/

以下是有关设置 WebSockets 代理(ROS 使用)的信息:https ://www.nginx.com/blog/websocket-nginx/

此外,这里是关于如何使用 Let's Encrypt(一个免费的、受信任的证书颁发机构)获取免费证书以及保持更新的指南:https ://www.digitalocean.com/community/tutorials/how-to-secure -nginx-with-let-s-encrypt-on-ubuntu-16-04

这是我使用上述所有内容的实际工作 Nginx 配置:

# Realm Object Server http to https redirection
#
server {
    listen 80;
    listen [::]:80;
    server_name yourdomain.com;
    return 301 https://yourdomain.com$request_uri;
}

# Realm Object Server reverse proxy
#
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    ssl_session_cache shared:SSL:200m;
    ssl_session_timeout 180m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/yourdomain.com/chain.pem;
    resolver 8.8.8.8 8.8.4.4;

    add_header Strict-Transport-Security "max-age=31536000" always;

    server_name yourdomain.com;

    set $upstream 127.0.0.1:9080;

    location / {
        proxy_pass http://$upstream;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass_request_headers      on;
        proxy_buffering off;
        client_max_body_size 0;
        proxy_read_timeout 36000s;
        proxy_redirect off;
        proxy_ssl_session_reuse off;
    }
}
于 2017-03-13T22:20:25.483 回答