【发布时间】: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