gpt4 book ai didi

Swift websockets 不接受客户端证书

转载 作者:搜寻专家 更新时间:2023-10-31 21:46:35 24 4
gpt4 key购买 nike

我正在从事一个需要 websockets 客户端证书支持的项目。我目前正在使用 Starscream,但不幸的是,通过阅读文档,它似乎没有任何关于对此的支持的信息。我查看了其他几个 swift web socket 库,但没有一个提到对此的支持

有人知道支持此类功能的库吗?

如有任何信息,我们将不胜感激!!

编辑:

所以我目前正在使用 Starscream 来尝试这个。我有证书设置。这是我目前正在尝试的代码

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
}

然后我像这样连接套接字

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()

但是我收到如下错误信息

CFNetwork SSLHandshake failed (-9807)

TCP Conn 0x604000173980 SSLHandshake failed (-9807) websocket is disconnected: The operation couldn’t be completed. (OSStatus error -9807.)

我知道证书是有效的,因为我用它来发出 https 请求并且它工作正常。那么有谁知道为什么它不起作用?或者有人知道另一个可以帮助解决这个问题的套接字库吗?

最佳答案

您可以通过简单地使用 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

任何你选择的方法(第三方或 URLSession),我建议你阅读这个安全问题:

https://github.com/facebook/SocketRocket/pull/534

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

关于Swift websockets 不接受客户端证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46827154/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com