双向认证分为两方向的认证:

  1. 客户端认证服务端;
  2. 服务端认证客户端;

以下逐个说明:

认证服务器

认证服务器分为:

  1. DefaultTrustEvaluator,使用默认的验证方式,验证证书的有效性,证书信任链那套
  2. RevocationTrustEvaluator,验证证书是否被吊销
  3. PinnedCertificatesTrustEvaluator,验证证书是否同本地的一致,可以是自签证书
  4. PublicKeysTrustEvaluator,验证证书的公钥,可以是自签证书,不过这个有个好处就是不用关心证书的有效期了
  5. CompositeTrustEvaluator,混合模式
  6. DisabledTrustEvaluator,不验证证书

我们目前使用的是验证公钥,以此为例:

// 验证服务器的公钥
// 默认获取了 cer 结尾的文件,只需要把证书放到项目里边就行了,不需要显示指定
let trustManager = ServerTrustManager(evaluators: [M_NodeServerUrl: PublicKeysTrustEvaluator()
])
let session = Session(serverTrustManager: trustManager)// 请求的时候直接使用
session.request(xxxx)...

认证客户端

认证客户端是通过 nsurl 协议来完成的,这部分其实不完全算是 Alamofire 的行为,可以通过继承 SessionDelegate 类,然后重写方法
func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) 来实现。
具体代码如下:

class WSSessionDelegate: SessionDelegate {override func urlSession(_ session: URLSession, task: URLSessionTask, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void) {switch challenge.protectionSpace.authenticationMethod {case NSURLAuthenticationMethodClientCertificate:// 获取证书guard let file = Bundle.main.path(forResource: "client", ofType: "p12"),let p12Data = try? Data.init(contentsOf: URL.init(string: file)!) else {completionHandler(.performDefaultHandling, nil)return}let p12Contents = PKCS12(pkcs12Data: p12Data, password: "xxxx")guard let identity = p12Contents.identity else {completionHandler(.performDefaultHandling, nil)return}let credential = URLCredential(identity: identity,certificates: nil,persistence: .none)challenge.sender?.use(credential, for: challenge)completionHandler(.useCredential, credential)default:completionHandler(.performDefaultHandling, nil)}}private class PKCS12 {let label: String?let keyID: NSData?let trust: SecTrust?let certChain: [SecTrust]?let identity: SecIdentity?/// Creates a PKCS12 instance from a piece of data./// - Parameters:///   - pkcs12Data: the actual data we want to parse.///   - password: The password required to unlock the PKCS12 data.public init(pkcs12Data: Data, password: String) {let importPasswordOption: NSDictionary= [kSecImportExportPassphrase as NSString: password]var items: CFArray?let secError: OSStatus= SecPKCS12Import(pkcs12Data as NSData,importPasswordOption, &items)guard secError == errSecSuccess else {if secError == errSecAuthFailed {NSLog("Incorrect password?")}fatalError("Error trying to import PKCS12 data")}guard let theItemsCFArray = items else { fatalError() }let theItemsNSArray: NSArray = theItemsCFArray as NSArrayguard let dictArray= theItemsNSArray as? [[String: AnyObject]] else {fatalError()}func f<T>(key: CFString) -> T? {for dict in dictArray {if let value = dict[key as String] as? T {return value}}return nil}self.label = f(key: kSecImportItemLabel)self.keyID = f(key: kSecImportItemKeyID)self.trust = f(key: kSecImportItemTrust)self.certChain = f(key: kSecImportItemCertChain)self.identity = f(key: kSecImportItemIdentity)}}
}let session = Session(delegate: WSSessionDelegate())
// 请求的时候直接使用
session.request(xxxx)...

两个结合起来可以是

let session = Session(delegate: WSSessionDelegate(), serverTrustManager: trustManager)

官方参考文档

Alamofire 5.0 双向认证相关推荐

  1. go学习笔记 http2.0使用【SAN 和双向认证】以及dotnetcore5.0的调用

    简单说一下我的环境 win7+go1.15.6,GO1.15   X509 不能用了 ,需要用到SAN证书, 证书 需要用到SAN证书,下面就介绍一下SAN证书生成.首先需要下载 OpenSSL ht ...

  2. android webview单向认证,android 让webview支持自签名证书https 双向认证(SSL)

    最近完成一个项目,安全级别比较高.所以涉及到https双向认证,在网上找了很多资料都没有完美的解决方案.最后参考了org.sandrob.sslexample的实现方式,结合实际情况才完成该技术难题, ...

  3. Apache httpd设置HTTPS双向认证

    一.环境 httpd: 2.4.4  openssl:1.0.1  os:ubuntu 12.04 LTS 二.场景 我准备在httpd上配置一个HTTPS双向认证,既向客户端表明自己的身份,也只允许 ...

  4. 使用wireshark观察SSL/TLS握手过程--双向认证/单向认证

    SSL/TLS握手过程可以分成两种类型: 1)SSL/TLS 双向认证,就是双方都会互相认证,也就是两者之间将会交换证书. 2)SSL/TLS 单向认证,客户端会认证服务器端身份,而服务器端不会去对客 ...

  5. 详解Nginx SSL快速双向认证配置(脚本)

    这篇文章主要介绍了详解Nginx SSL快速双向认证配置(脚本),现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 目前遇到一个项目有安全性要求,要求只有个别用户有权限访问.本着能用配置解决就 ...

  6. SSL/TSL双向认证过程与Wireshark抓包分析

    原博文 1. SSL/TSL基本知识 (1)SSL/TLS协议运行机制:https://blog.csdn.net/fw0124/article/details/40873253 (2)图解SSL/T ...

  7. nginx配置ssl加密(单双向认证、部分https)

    nginx下配置ssl本来是很简单的,无论是去认证中心买SSL安全证书还是自签署证书,但最近公司OA的一个需求,得以有个机会实际折腾一番.一开始采用的是全站加密,所有访问http:80的请求强制转换( ...

  8. java 调用tomcat api,Tomcat采用双向认证https协议通过JavaAPI调用(一)配置SSL

    双向认证(个人理解): 客户端认证: 客户端通过浏览器访问某一网站时,如果该网站为HTTPS网站,浏览器会自动检测系统中是否存在该网站的信任证书,如果没有信任证书,浏览器一般会拒绝访问,IE会有一个继 ...

  9. httpd设置HTTPS双向认证

    去年用tomcat.jboss配置过HTTPS双向认证,那时候主要用的是JDK自带的keytool工具.这次是用httpd + openssl,区别比较大 在网上搜索了很多文章,发现全面介绍的不多,或 ...

最新文章

  1. 配置CACTI监控MySQL数据库状态(1)准备工作
  2. DESTOON 404
  3. android底部导航栏下沉,【详细】手把手教你快速实现Android底部导航栏
  4. 在centos8 stream启用 Extra Packages
  5. puppet 安装mysql_Puppet安装dashboard
  6. android管理员和普通用户登录,asp登录页如何区别管理员和普通用户,登录后跳转到不同页面?...
  7. 虚拟机开机出现dracut_用U盘装CentOS 7出现dracut:/#问题的解决办法
  8. C - 师--链表的结点插入
  9. mongodb 的进库操作
  10. 机器学习中的分类模型和回归模型
  11. js中不能做变量名的字符
  12. WINDOWS 7、windows server 2008、VISTA激活排斥
  13. 秒杀活动,怎么设计全套技术方案
  14. App UI设计:“看得见”有多重要
  15. 元音I、i 、ε、æ、a小总结
  16. IEC101召唤过程
  17. linux 多个csv合并成一个csv
  18. 工信部就垃圾短信问题约谈7家虚拟运营商
  19. python显示变量值_Python 中如何打印变量值
  20. eclipse中没有SVN,安装SVN

热门文章

  1. Java8与JDK1.8与JDK8与J2SE8与J2SE1.8的区别是什么?——Java的各个版本和各个版本的历史版本号的关系与解读
  2. 使用three.js搭建室内场景
  3. Matlab实现有向图的关联矩阵和邻接矩阵的转换
  4. Revit建模中MEP吸顶构件如何统一控制标高
  5. Java 利用http协议与Domino实现sso单点登录
  6. leetcode_650. 2 Keys Keyboard_dp
  7. BigInteger类用于表示比long更大的整数类型
  8. 重读《C primer plus》(四)
  9. VB.NET 读写HTML 文件,VB.Net读取和写入文本文件
  10. Go 1.17 RC2发布 | Gopher Daily (2021.08.03) ʕ◔ϖ◔ʔ