【问题标题】:Do I have to buy a domain in order to run my app that is using an EC2 instance on AWS server in order to use HTTPS?我是否必须购买域才能运行我的应用程序,该应用程序在 AWS 服务器上使用 EC2 实例才能使用 HTTPS?
【发布时间】:2019-12-04 00:41:07
【问题描述】:

我在 TestFlight 上有一个 iOS 应用程序,它使用在 AWS 上的 EC2 实例上运行的 LAMP 服务器。它具有弹性 IP,因此具有公共 DNS:ec2-xx-xx-xx-xx.us-east-2.compute.amazonaws.com

所以目前我从应用程序本身直接通过弹性 IP 运行命令,如下所示:

let url = URL(string: "http://xx.xx.xx.xx/API/SignIn.php?username=\(username)");

现在这很好用,但是我想开始将所有内容都转移到 HTTPS。

所以我希望这样做,使用公共 DNS:

let url = URL(string: "https://ec2-xx-xx-xx-xx.us-east-2.compute.amazonaws.com/API/SignIn.php?username=\(username)");

但是这个方法一直在骂我:

“发生 SSL 错误并且与服务器的安全连接 无法制作”

到目前为止,我所做的是openSSL过程,我创建了一个证书和密钥,并将其放入apache配置文件中:

<VirtualHost _default_:443>
    ServerName ec2-xx-xx-xx-xx.us-east-2.compute.amazonaws.com
    ServerAlias www.ec2-xx-xx-xx-xx.us-east-2.compute.amazonaws.com
    DocumentRoot /var/www/htdocs

    SSLEngine on
    SSLCertificateFile /home/ubuntu/cert.pem
    SSLCertificateKeyFile /home/ubuntu/key.pem
</VirtualHost>

当然,我将安全组设置为 HTTPS 端口 443。

HTTPS 实际上可以从 Safari 访问,但显然它仍然不是一个受信任的 网站。

我尝试通过 CertBot 免费路径 - 但它们不允许 AWS 创建的域使用 SSL 证书(可以理解,它们不太可靠并且经常更改)。

我也尝试通过 AWS 本身,在证书管理器中创建了一个证书(它已被批准并颁发给我),但是当我尝试在负载均衡器中使用它时 - 但证书没有显示那里(也许我做错了,我尝试了很多方法,但似乎不起作用)

我真的很想在不必购买域名的情况下进行此操作,但现在我看不到任何其他方式。有人知道另一种方法吗?

编辑

另外,我宁愿避免告诉 iOS 忽略安全性的部分,因为我不希望 Apple 拒绝我的应用:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

【问题讨论】:

  • 您可以使用您的 ISP 分配给您 IP 的域。您也可以自己运行 LAMP 服务器。
  • 如果您没有任何域,您在 AWS Certificate Manager 中为哪个域生成了证书?
  • 哦,您将自签名证书上传到 ACM,您没有要求 ACM 为您的域生成一个。如果您不想使用自签名证书,那么您将不得不购买一个域,因为您无法为您不拥有的域请求有效的 SSL 证书。请注意,这不是 AWS 限制,而是 SSL 限制。
  • 如果您可以访问任何域,您可以创建一个子域。
  • 啊,如果您正在构建将进入 App Store 的东西,那么我会断言另一个域的成本相当微不足道!

标签: ios amazon-web-services ssl lamp


【解决方案1】:

使用

URLSessionDelegate

如果您使用 URLSession 执行请求并实现以下功能,则信任证书

func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {
    print("delegate call")
    if challenge.protectionSpace.host == "ec2-xx-xx-xx-xx.us-east-2.compute.amazonaws.com" {
        completionHandler(.useCredential, URLCredential(trust: challenge.protectionSpace.serverTrust!))
    } else {
        completionHandler(.performDefaultHandling, nil)
    }
}

信任自 SS1 发生以来的认证,因为证书的选择不匹配。如果您使用 Alamofire 执行请求,请使用 4.7 版本,因为版本 5 尚无法验证无效证书。

【讨论】:

    猜你喜欢
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 2014-01-06
    • 1970-01-01
    相关资源
    最近更新 更多