我要使用的Web服务需要客户端证书。我怎样才能把我的证书寄给它呢?
为了进一步说明,我不知道如何创建SecIdentityRef
。
在我的NSURLConnection
didReceiveAuthenticationChallenge
中,在ServerTrust
之后有这个条件:
else if challenge?.protectionSpace.authenticationMethod == NSURLAuthenticationMethodClientCertificate
{
var secIdent : SecIdentityRef = ?????????
var certCred = NSURLCredential(identity: secIdent, certificates: [getClientCertificate()], persistence: NSURLCredentialPersistence.Permanent)
challenge?.sender.useCredential(certCred, forAuthenticationChallenge: challenge!)
}
getClientCertificate
方法:
func getClientCertificate() -> SecCertificateRef
{
let mainBundle : NSBundle = NSBundle.mainBundle()
var mainBund = mainBundle.pathForResource("iosClientCert", ofType: "cer") //exported the cert in der format.
var key : NSData = NSData(contentsOfFile: mainBund!)!
var turnToCert : SecCertificateRef = SecCertificateCreateWithData(kCFAllocatorDefault, key).takeRetainedValue()
return turnToCert;
}
5条答案
按热度按时间tv6aics11#
从技术上讲,当我认识的某个人需要SWIFT中的实现时,他使用下面的Objective-C实现来获取连接的NSURLC redential对象:based on the private key and X509 Certificate pair contained in a PKCS12 keystore。
抱歉,我无法访问SWIFT解决方案的来源。我只知道NSURLCredential被返回给SWIFT,并直接在那里的http url连接中使用。不过,它与这一款相似。
我不是iOS开发人员,所以我不能帮你解决“连接到SWIFT”这一部分。
编辑:哈哈,非常有趣,在赏金到了的时候,你自己都不费心,就两次贬低了我。怨言
无论如何,要使用以上内容,您只需从SWIFT访问即可。
就是用这个。
编辑:这里是上面的一个快速版本,尽管它足够混乱,以至于我们宁愿不使用它。
xqkwcwgp2#
在本指南中可以找到SWIFT 3的工作实施:
https://gist.github.com/celian-m/8da09ad293507940a0081507f057def5
8ljdwjyq3#
为了响应身份验证挑战,您需要从客户端证书中提取身份。
在
NSURLSessionDelegate
中,对身份验证质询的响应如下:0vvn1miw4#
我使用的是最新的Xcode和Swift版本,此代码适用于我,使用基于bins的客户端证书.pfx,我的答案是:
yks3o0rb5#
正在使用最新版本Xcode+13的用户将发现这一点很有帮助。
最后使用.p12文件并使用PKCS12方法从.p12文件中获取身份、certChain、信任、密钥ID(PrivateKey和Public Key)等所有细节,并将这些密钥签名到对象中进行签名!
下面的代码将帮助您实现客户端和服务器之间的mTLS身份验证,而无需处理.pfx文件。您只需要基本64位的STING证书数据。