ios - Swift 3 如何使用 SSL Pinning 和 AlamoFire 验证服务器证书?

标签 ios rest ssl certificate swift3

我正在用 swift 3 编写一个需要与我的服务器通信的应用程序。我有 der 和 crt 格式的完整证书链,我是 CA(不要与自签名混淆)。我如何在我的应用程序中使用它来验证我的服务器?以下是我的休息电话和回复

休息电话:

var request = URLRequest(url: URL(string: "https://myserver/login")!)
    request.addValue("Content-Type", forHTTPHeaderField: "application/json")
    request.httpMethod = "GET"
    let session = URLSession.shared

    session.dataTask(with: request) {data, response, err in         
        print("=========================DATA===============================")
        if data != nil {
            print(data!)
        }
        print("=========================RESPONSE===============================")
        if response != nil {
            print(response!)
        }
        print("=========================ERR===============================")
        if err != nil {
            print(err!)
        }
        }.resume()

输出:

=========================DATA===============================
=========================RESPONSE===============================
=========================ERR===============================
Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x60800011f020>, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, NSErrorPeerCertificateChainKey=(
"<cert(0x7fae4803d200) s: myserver i: MySubCA>",
"<cert(0x7fae48047000) s: MySubCA i: MyRootCA>",
"<cert(0x7fae48044600) s: MyRootCA i: MyRootCA>"
), NSUnderlyingError=0x60800005a040 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x60800011f020>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerCertificates=(
"<cert(0x7fae4803d200) s: myserver i: MySubCA>",
"<cert(0x7fae48047000) s: MySubCA i: MyRootCA>",
"<cert(0x7fae48044600) s: MyRootCA i: MyRootCA>"
)}}, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSErrorFailingURLKey=https://myserver/login, NSErrorFailingURLStringKey=https://myserver/login, NSErrorClientCertificateStateKey=0}

最佳答案

我很简单地利用在线博客、AlamoFire 和 openssl 解决了这个问题。

我用了AlamoFire用于 iOS 上的网络。

我使用了一篇关于 SSL pinning on iOS 的文章走上正确的方向。

我使用 openssl 将我的证书转换为 der 格式。

Der 通过openssl 转换。

openssl x509 -in cert.crt -out cert.der -outform DER

您需要将 der 格式的证书添加到您的应用程序包中。

swift 3 实现

// Your hostname and endpoint
let hostname = "YOUR_HOST_NAME"
let endpoint = "YOUR_ENDPOINT"
let cert = "YOUR_CERT" // e.g. for cert.der, this should just be "cert"

// Set up certificates
let pathToCert = Bundle.main.path(forResource: cert, ofType: "der")
let localCertificate = NSData(contentsOfFile: pathToCert!)
let certificates = [SecCertificateCreateWithData(nil, localCertificate!)!]

// Configure the trust policy manager
let serverTrustPolicy = ServerTrustPolicy.pinCertificates(
    certificates: certificates,
    validateCertificateChain: true,
    validateHost: true
)    
let serverTrustPolicies = [hostname: serverTrustPolicy]
let serverTrustPolicyManager = ServerTrustPolicyManager(policies: serverTrustPolicies)

// Configure session manager with trust policy
afManager = SessionManager(
    configuration: URLSessionConfiguration.default,
    serverTrustPolicyManager: serverTrustPolicyManager
)


afManager.request(endpoint, method: .get).responseJSON { response in
    debugPrint("All Response Info: \(response)")
}

关于ios - Swift 3 如何使用 SSL Pinning 和 AlamoFire 验证服务器证书?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40638690/

相关文章:

ios - 在 xcode 中访问 JSON 对象

javascript - 为什么此链接在 iOS Safari 上不可点击?

java - 在 Jersey REST API 中为 CORS 配置 Web.xml

java - 导入我的证书时出现 jdk keytool 异常

azure - 无法从 Windows Azure 网站删除证书 "Updating configuration failed"

ios - 将动态文本 GPUImage 添加到过滤后的视频

IOS静态调试符号含义

java - 使用 "keepalive"连接从 Restful Web 服务轮询数据

java - 如何通过Spring Boot API获取特定字段

apache - ReSTLer ssl https 重定向