【问题标题】:How do I add a self-signed root certificate authority to a device?如何将自签名根证书颁发机构添加到设备?
【发布时间】:2015-05-26 21:10:33
【问题描述】:

如何在设备上安装根证书颁发机构?

只有我的应用需要证书,如果可能的话可以安装在它的沙箱中。

当我drag the certificate onto the simulator and install it 时有效,但不使用以下代码:

let rootCertPath = NSBundle.mainBundle().pathForResource("server", ofType: "der")!
let rootCertData = NSData(contentsOfFile: rootCertPath)!
let rootCert     = SecCertificateCreateWithData(kCFAllocatorDefault, rootCertData).takeRetainedValue()

let error = SecItemAdd(
[
    NSString(format: kSecClass):    NSString(format: kSecClassCertificate),
    NSString(format: kSecValueRef): rootCert
], nil)

SecItemAdd 没有错误返回,并且似乎已正确安装在设备上,但仍然无法连接到服务器并出现错误:

NSURLConnection/CFURLConnection HTTP 加载失败 (kCFStreamErrorDomainSSL, -9813)

连接服务器的代码:

let request = NSURLRequest(URL: NSURL(string: "https://" + server + ":" + port)!)
let session = NSURLSession(configuration: .defaultSessionConfiguration())

session.dataTaskWithRequest(request, completionHandler:
{(data, response, error) in
    println(error)
}).resume()

error 打印以下内容:

Error Domain=NSURLErrorDomain Code=-1202 "此服务器的证书无效。

但同样,如果我在模拟器的配置文件中手动安装相同的证书,它就可以正常连接。

【问题讨论】:

    标签: ios swift certificate


    【解决方案1】:

    这是不安全的,不需要证书

    设法使用套接字(NSStream 和 CFStream)使其工作。

    需要注意的重要一点是,我需要禁用 kCFStreamSSLValidatesCertificateChain 才能使我的证书正常工作。

    class Authentication: NSObject, NSStreamDelegate
    {
        private var  inputStream: NSInputStream?
        private var outputStream: NSOutputStream?
    
        func connectToServer(server: String, port: Int)
        {   
            let sslSettings =
            [
                NSString(format: kCFStreamSSLValidatesCertificateChain): kCFBooleanFalse
            ]
    
            NSStream.getStreamsToHostWithName(server, port: port, inputStream: &inputStream, outputStream: &outputStream)
    
            CFReadStreamSetProperty(inputStream, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelTLSv1)
            CFReadStreamSetProperty(inputStream, kCFStreamPropertySSLSettings, sslSettings)
    
             inputStream!.delegate = self
            outputStream!.delegate = self
    
             inputStream!.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
            outputStream!.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode: NSDefaultRunLoopMode)
    
             inputStream!.open()
            outputStream!.open()
        }
    }
    

    有用的链接:

    iOS: Pre install SSL certificate in keychain - programmatically

    Overriding TLS Chain Validation Correctly

    HTTPS Server Trust Evaluation

    SSL Socket connection iOS

    Toll-free bridging and pointer access in Swift

    Adding a self-signed certificate to iphone Simulator?

    【讨论】:

      最近更新 更多