You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS 11应用与树莓派本地环境安全通信通道搭建问询

嘿,我帮你梳理了一套针对树莓派Python API和iOS 11应用的安全通信搭建方案,完全贴合你提到的私有CA、OpenSSL以及.local域名的场景,一步步来就行:

一、先搭建你的私有CA(用OpenSSL)

首先得创建自己的私有证书颁发机构,这是后续所有证书信任链的基础:

  • 先写一个CA配置文件ca.cnf,内容如下(可以直接复制到树莓派的命令行里创建):
    [req]
    distinguished_name = req_distinguished_name
    x509_extensions = v3_ca
    prompt = no
    
    [req_distinguished_name]
    CN = My Home Private CA
    O = Home Network
    C = CN
    
    [v3_ca]
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always,issuer
    basicConstraints = critical, CA:true
    keyUsage = critical, digitalSignature, cRLSign, keyCertSign
    
  • 生成CA私钥(记得妥善保存,别泄露):
    openssl genrsa -out ca.key 4096
    
  • 生成CA根证书(有效期设为10年,足够用了):
    openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt -config ca.cnf
    
二、为树莓派生成带.local域名的服务器证书

iOS 11对SSL证书的要求很严格,必须包含SAN(Subject Alternative Name)字段,不能只靠Common Name来验证域名,所以这一步要特别注意:

  • 创建服务器证书的配置文件server.cnf,重点要加SAN指向你的树莓派.local域名(比如raspberrypi.local):
    [req]
    distinguished_name = req_distinguished_name
    req_extensions = v3_req
    prompt = no
    
    [req_distinguished_name]
    CN = raspberrypi.local
    O = Home Network
    C = CN
    
    [v3_req]
    keyUsage = critical, digitalSignature, keyEncipherment
    extendedKeyUsage = serverAuth
    subjectAltName = DNS:raspberrypi.local
    
  • 生成服务器私钥:
    openssl genrsa -out server.key 2048
    
  • 生成证书签名请求(CSR):
    openssl req -new -key server.key -out server.csr -config server.cnf
    
  • 用刚才的私有CA签名服务器证书(有效期1年,到期再签就行):
    openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 365 -sha256 -extfile server.cnf -extensions v3_req
    
三、在树莓派的Python API中配置SSL

不管你用Flask还是FastAPI,都能轻松配置SSL,这里给你两种常用框架的示例:

Flask 示例

from flask import Flask

app = Flask(__name__)

@app.route("/api/test")
def test_endpoint():
    return {"status": "success", "message": "Secure communication works!"}

if __name__ == "__main__":
    # 443是HTTPS默认端口,需要sudo运行;如果用非特权端口(比如5000),不用sudo
    app.run(host="0.0.0.0", port=443, ssl_context=("server.crt", "server.key"))

FastAPI 示例

from fastapi import FastAPI
import uvicorn

app = FastAPI(title="Raspberry Pi Secure API")

@app.get("/api/test")
def test_endpoint():
    return {"status": "success", "message": "Secure communication works!"}

if __name__ == "__main__":
    uvicorn.run(
        app,
        host="0.0.0.0",
        port=443,
        ssl_keyfile="server.key",
        ssl_certfile="server.crt"
    )
四、iOS 11设备上安装并信任私有CA根证书

这一步是iOS能信任树莓派证书的关键,必须手动操作:

  • 把ca.crt传到iOS设备:可以用AirDrop发给自己,或者在树莓派上搭个简单的HTTP服务(比如python3 -m http.server 8000),然后iOS用Safari访问http://raspberrypi.local:8000/ca.crt下载。
  • 打开下载的证书文件,按照提示选择"安装",并验证你的设备密码。
  • 安装完成后,进入设置 > 通用 > 关于本机 > 证书信任设置,找到你刚才创建的CA(比如"My Home Private CA"),开启"信任该证书"的开关。
五、iOS 11应用中发起API调用的注意事项

ATS 配置

iOS 11的App Transport Security(ATS)默认会限制非标准的HTTPS连接,不过因为我们用了信任的CA,只需要在Info.plist里添加.local域名的例外配置(确保ATS允许连接):

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>raspberrypi.local</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <false/> <!-- 我们用的是HTTPS,所以设为false -->
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
        </dict>
    </dict>
</dict>

API 调用示例(Swift)

用URLSession发起HTTPS请求的示例代码:

import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        fetchSecureData()
    }
    
    func fetchSecureData() {
        guard let url = URL(string: "https://raspberrypi.local/api/test") else { return }
        
        let task = URLSession.shared.dataTask(with: url) { data, response, error in
            if let error = error {
                print("请求错误: \(error.localizedDescription)")
                return
            }
            
            guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 else {
                print("响应状态异常")
                return
            }
            
            if let data = data, let responseString = String(data: data, encoding: .utf8) {
                print("安全API响应: \(responseString)")
            }
        }
        task.resume()
    }
}
六、常见问题排坑
  • 证书验证失败:检查服务器证书的SAN字段是否包含你的树莓派.local域名,iOS 11不再认可仅靠Common Name的证书验证。
  • .local域名无法解析:确保树莓派上的Avahi服务(Bonjour兼容)正在运行,执行sudo systemctl status avahi-daemon检查,没启动的话用sudo systemctl start avahi-daemon开启。
  • Python API启动失败:如果用443端口,需要用sudo运行脚本;或者改用非特权端口(如5000、8443)。
  • iOS提示无法建立安全连接:确认CA根证书已经在iOS上安装并开启信任,同时检查树莓派和iOS设备在同一个本地网络。

内容的提问来源于stack exchange,提问作者Boixos Noi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:12:33