我在TestFlight上有一个TestFlight应用程序,它使用LAMP服务器运行在AWS上的EC2实例上。它有一个弹性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忽略安全性的部分,因为我不希望苹果拒绝我的应用程序:
<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>发布于 2019-07-25 18:41:05
使用
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)
}
}信任自SSl触发的证书,因为证书操作的唱歌有错误匹配。如果您正在使用Alamofire来执行请求,请使用Version4.7,因为版本5还不能验证无效的证书。
https://stackoverflow.com/questions/57206992
复制相似问题