首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ios9自签名证书和应用程序传输安全

ios9自签名证书和应用程序传输安全
EN

Stack Overflow用户
提问于 2015-12-17 06:18:58
回答 2查看 3K关注 0票数 4

我花了一段时间试着让这件事起作用。我有一个API,我正在连接它,我试图用自签名的证书切换到SSL。我控制着服务器和应用程序。

根据此,我生成了一个自签名证书:

https://kyup.com/tutorials/create-ssl-certificate-nginx/

代码语言:javascript
复制
sudo openssl genrsa -des3 -out ssl.key 2048
sudo openssl req -new -key ssl.key -out ssl.csr
sudo cp ssl.key ssl.key.orig & sudo openssl rsa -in ssl.key.orig -out ssl.key
sudo openssl x509 -req -days 365 -in ssl.csr -signkey ssl.key -out ssl.crt

我在服务器上尝试了一些配置选项(NGINX)

代码语言:javascript
复制
ssl on;
ssl_certificate /etc/nginx/ssl/ssl.crt;
ssl_certificate_key /etc/nginx/ssl/ssl.key;
ssl_session_timeout 5m;
ssl_protocols  SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
#ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
ssl_prefer_server_ciphers on;

在客户端,我对ATS尝试了一些不同的选择:

代码语言:javascript
复制
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

代码语言:javascript
复制
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>test.example.com (NOT REALLY MY DOMAIN)</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

代码语言:javascript
复制
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>test.example.com (NOT REALLY MY DOMAIN)</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
        </dict>
    </dict>
</dict>

根据ATS选项的不同,我得到了错误:

代码语言:javascript
复制
An SSL error has occurred and a secure connection to the server cannot be made.

代码语言:javascript
复制
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
The certificate for this server is invalid. You might be connecting to a server that is pretending to be “MYDOMAIN” which could put your confidential information at risk.

有什么想法吗?还有其他人为自己签的证书而挣扎吗?

我在OS X 10.11.2 Beta上,Xcode 7.1.1

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-17 17:57:05

我解决了这个问题。这与应用程序传输安全性无关。我必须确保iOS信任证书,因为它不是来自受信任的权威机构。

通过重写NSURLRequest.allowsAnyHTTPSCertificateForHost来实现这一点的旧方法是行不通的。

由于我使用的是NSURLSession,所以您必须使用以下方法:

代码语言:javascript
复制
- (id) init {
    self = [super init];
    NSURLSessionConfiguration * config = [NSURLSessionConfiguration defaultSessionConfiguration];
    self.session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    return self;
}

- (void) URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler {
    completionHandler(NSURLSessionAuthChallengeUseCredential,[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]);
}
票数 3
EN

Stack Overflow用户

发布于 2017-01-26 02:55:34

只需要将.cer添加到SecTrust

代码语言:javascript
复制
func urlSession(_ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Swift.Void) {

    if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
        if let trust = challenge.protectionSpace.serverTrust,
           let pem = Bundle.main.path(forResource: "https", ofType: "cer"),
           let data = NSData(contentsOfFile: pem),
           let cert = SecCertificateCreateWithData(nil, data) {
            let certs = [cert]
            SecTrustSetAnchorCertificates(trust, certs as CFArray)

            completionHandler(URLSession.AuthChallengeDisposition.useCredential, URLCredential(trust: trust))
            return
        }
    }

    // Pinning failed
    completionHandler(URLSession.AuthChallengeDisposition.cancelAuthenticationChallenge, nil)
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34327857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档