2017-10-19 2 views
4

웹 소켓을 통한 클라이언트 인증서 지원이 필요한 프로젝트 작업 중입니다. 저는 현재 Starscream을 사용하고 있습니다 만, 유감스럽게도 설명서를 읽지는 않았지만이 문제에 대한 지원과 관련된 정보는없는 것으로 보입니다. 몇 가지 다른 빠른 웹 소켓 라이브러리를 둘러 보았지만 아무도이 기능에 대해 언급하지 않았습니다.클라이언트 인증서를 허용하지 않는 스위프트 웹 소켓

이러한 기능을 지원하는 라이브러리를 아는 사람이 있습니까?

모든 정보를 제공해 주시면 감사하겠습니다.

편집 : 그래서 현재이 시도하는 스타 스크림을 사용하고

. 인증서 설치가 완료되었습니다. 여기에 내가 그때 그렇게

let key = SecTrustCopyPublicKey(identityTest!.trust)!; 
    let ssl = SSLCert(key: key) 

    socket.security = SSLSecurity(certs: [ssl], usePublicKeys: false) 
    socket.enabledSSLCipherSuites = [TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384] 
    socket.delegate = self 
    socket.connect() 

같은 소켓을 연결까지

public struct IdentityAndTrust { 
    public var identityRef:SecIdentity 
    public var trust:SecTrust 
    public var certData : Data 
} 




var socket = WebSocket(url: URL(string: "\(ConstantKeys.ipAddress)")!, protocols: []) 
    var identityTest : IdentityAndTrust? 

func createTrust() 
{ 
    do 
    { 
     let urlPath  = Bundle.main.path(forResource: "client", ofType: "p12") 
     let url   = NSURL.fileURL(withPath: urlPath!) 
     let certificateData = try Data(contentsOf: url) 

     identityTest = extractTrustAndIdentity(certData: certificateData, certPassword: ConstantKeys.password) 
    } 
    catch 
    { 
     print(error) 
    } 
} 

func extractTrustAndIdentity(certData:Data, certPassword:String) -> IdentityAndTrust 
{ 
    var identityAndTrust:IdentityAndTrust! 
    var securityError:OSStatus = errSecSuccess 

    var items: CFArray? 
    let certOptions: Dictionary = [ kSecImportExportPassphrase as String : certPassword ]; 
    // import certificate to read its entries 
    securityError = SecPKCS12Import(certData as CFData, certOptions as CFDictionary, &items); 
    if securityError == errSecSuccess { 

     let certItems:CFArray = items as CFArray!; 
     let certItemsArray:Array = certItems as Array 
     let dict:AnyObject? = certItemsArray.first; 

     if let certEntry:Dictionary = dict as? Dictionary<String, AnyObject> { 

      // grab the identity 
      let identityPointer:AnyObject? = certEntry["identity"]; 
      let secIdentityRef:SecIdentity = identityPointer as! SecIdentity!; 

      // grab the trust 
      let trustPointer:AnyObject? = certEntry["trust"]; 
      let trustRef:SecTrust = trustPointer as! SecTrust; 

      // grab the certificate chain 
      var certRef: SecCertificate? 
      SecIdentityCopyCertificate(secIdentityRef, &certRef); 
      let certArray:NSMutableArray = NSMutableArray(); 
      certArray.add(certRef as SecCertificate!); 

      identityAndTrust = IdentityAndTrust(identityRef: secIdentityRef, trust: trustRef, certData : certData); 
     } 
    } 
    return identityAndTrust 
} 

을 시도하고 코드는하지만

CFNetwork에서 SSLHandshake 실패 다음과 같은 오류 메시지 (-9807)

있어

TCP 연결 0x604000173980 SSL 핸드 셰이크 실패 (-9807) websocket이 연결이 끊김 : 작업 공동 완료 할 수 없습니다. (OSStatus 오류 -9807.)

내가 HTTPS 요청을 만들기 위해 그것을 사용으로 인증서가 유효 알고 그것을 잘 작동합니다. 왜 작동하지 않는지 아는 사람이 있습니까? 아니면이 문제와 도움이 될 다른 소켓 라이브러리를 아는 사람이 있습니까?

답변

0

서드 파티 라이브러리를 사용하지 않고 NSURLSession (URLSession)을 사용하여 SSL 피닝을 수행 할 수 있지만 SocketRocket을 여전히 사용하려면 AFNetworking에서 지원합니다.

아래의 링크를 도움이 될 것입니다

http://www.yeradis.com/swift-authentication-challenge

http://www.indelible.org/ink/trusted-ssl-certificates/

https://jetforme.org/2013/05/validating-a-self-signed-ssl-certificate-in-ios-and-os-x-against-a-changing-host-name/enter link description here

모든 방법은 당신이 (제 3 자 또는 URLSession)를 선택, 당신이 보안을 읽을 할 것을 제안 문제 :

내 문제는 SSL은 고정 및 웹 요청을하지

https://www.synopsys.com/blogs/software-security/ineffective-certificate-pinning-implementations/enter link description here

+0

, 나는 alamofire를 사용하고, 나는 아무 문제 SSL 문제를 처리 할 수 ​​없습니다. 내 문제는 순전히 웹 소켓입니다. 내가 본 소켓 라이브러리는 이러한 인증 문제를 처리 할 방법을 제공하지 않습니다. 소켓 로켓은 가능성처럼 보이지만 오래된 라이브러리이며 Objective-c로 작성되었습니다. 나는 신속한 해결책을 원했다. – AdamM