Realm Object Server URL的HTTPS设置

时间:2017-03-13 14:03:07

标签: amazon-ec2 https ssl-certificate realm-mobile-platform realm-object-server

在准备提交应用时,我发现Apple要求所有通话都必须使用HTTPS。在我的代码中,SyncUser.logIn中的服务器网址只是普通的普通HTTP电话http://mywebsite:9080

我的配置详情

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

困境

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

  1. 我通过AWS Certificate Manager为域颁发了证书,但无法将其部署到我的实例上。 EC2 isn't supported
  2. 我也试过certbot - 它生成的密钥保存在我的EC2实例的/ etc目录下,但我不知道如何使用它们。
  3. 因此,当我在SSL检查器中输入我的网站时,它正确地说没有找到SSL证书。

    我是否需要选择退出AWS?

    我找到了一个answer here,但这似乎是一个过时的答案(或者可能太过于hacky)。 我还发现这些slides完成了整个技巧,但它们完全超出了我的想法。

2 个答案:

答案 0 :(得分:1)

Apple的要求比原来的问题更加微妙,截止日期已经延长,但尚未明确规定。

请参阅带引号的pinned forum post from Feb 2017

  • NSAllowsArbitraryLoadsInWebContent让您拥有严格的ATS 字典但仍在Web视图中加载任意内容(WKWebView, UIWebView, WebView
  • 自WWDC以来的新内容NSAllowsLocalNetworking可以让您 退出ATS进行本地联网 - 要了解更多信息,请参阅 Information Property List Key Reference.
  • NSAppTransportSecurity部分
  • 自WWDC以来的新内容NSAllowsArbitraryLoadsForMedia可以让您 退出ATS获取媒体资源 - 要了解更多信息,请参阅 Information Property List Key Reference.
  • NSAppTransportSecurity部分
  • NSRequiresCertificateTransparency让您选择加入 Certificate Transparency检查
  • 现在使用RC4的密码套房 默认情况下已禁用
  • 默认情况下,SSLv3协议现已禁用 安全传输层
  • 使用SHA-1或3DES的密码套件 仍然支持,但你应该考虑远离他们
  • WWDC以来的新内容NSURLConnection现在荣获ATS最低TLS版本 - 以前NSURLConnection会忽略最小TLS版本 ATS(r。23167645)规定的。此错误已得到修复。如果你是 使用NSURLConnection进行网络连接,请务必运行您的应用 在最新发布的操作系统上,确保它仍然按预期工作。

Apple announced on Dec 21 2016 此截止日期已延长,我们将在确认新截止日期后再次提供更新

答案 1 :(得分:0)

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

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

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

另外,这里有一个关于如何使用Let的加密(一个免费的,可信的证书颁发机构)来获取免费证书并保持续订的指南: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;
    }
}