摘录自:https://blog.csdn.net/qq_45759354/article/details/128672828
SSL协议用到了对称加密和非对称加密,在建立连接时,SSL首先对对称加密密钥使用非对称加密。连接建立好后,SSL对传输内容使用对称加密。单向认证是客户端不携带证书,服务端存在证书,在认证过程中,仅验证服务端的身份,当客户端访问服务器时,浏览器会去检查服务器的SSL证书,来验证网站服务器的合法性。一般web端应用都是采用单向认证的。
单向认证过程
客户端向服务端发送SSL协议的版本号、加密算法种类、随机数等信息,建立连接;
服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,以及服务端证书(证书中有公钥);
客户端用返回的信息,进行对服务端的校验,验证通过则继续通信,否则告警,验证内容:
证书是否过期
服务器证书签发的CA机构是否可靠
公钥是否能解开证书中的数字签名
服务器证书上的域名是否和服务器实际域名相匹配
客户端向服务器发送自己所能支持的对称加密方案,供服务器进行选择;
服务器选择加密程度高的加密方式;
服务器将选择好的加密方式以明文方式返回给客户端;
客户端收到加密方案后,使用该加密方案生成随机码,用作通信过程中对称加密的密钥,使用服务端返回的公钥进行加密,将加密后的随机码发送给服务器;
服务端收到客户端返回的加密信息后,使用自己的私钥解密,获取对称加密密钥,接下来的会话中,服务器和客户端将会使用该密码进行对称加密,保证通信的信息安全。
图片摘录自(略微修改):https://www.cnblogs.com/bluestorm/p/10571989.html
摘录自:https://blog.csdn.net/qq_45759354/article/details/128672828
双向认证是指在SSL握手的过程中,同时验证客户端和服务器的身份,所以双向认证SSL证书至少包括两个或两个以上的证书,一个是服务器证书,另一个或多个是客户端证书。
双向认证过程
客户端向服务器发送SSL协议的版本号、加密算法种类、随机数等信息,建立连接;
服务端给客户端返回SSL协议版本号、加密算法种类、随机数等信息,以及服务端证书(证书中有公钥);
客户端使用服务端返回的信息验证服务器的合法性,验证内容跟单向认证一样;
客户端校验通过后,将自己的证书及公钥发送到服务器;
服务器验证客户端的证书,校验通过后,可获取到客户端的公钥;
客户端发送自己的可支持的对称加密方案给服务器供其选择;
服务器端在客户端发送的加密方案中先择加密程度高的方案,将加密方式通过客户端发送证书中的公钥加密后,返回给客户端;
客户端收到服务端返回的加密方案密文后,用私钥解密,获取加密方案的明文,产生随机码,作为对称加密密钥,使用服务端公钥加密后,发送给服务端;
服务端使用私钥解密得到对称加密的密钥,接下来的会话中,服务器和客户端将使用该密钥进行对称加密,保证通信安全。
图片摘录自(略微修改):https://www.cnblogs.com/bluestorm/p/10571989.html
本章节部分内容摘录自(主要分析此连接的报文信息):https://blog.csdn.net/songxiao1988918/article/details/98749629
REGISTER sip:11011200002000000100@1101120000 SIP/2.0
Via: SIP/2.0/UDP 192.168.3.12:5060;rport;branch=z9hG4bK443099353
From: sip:11011200001325000001@1101120000;tag=249558797
To: sip:11011200001325000001@1101120000
Call-ID: 1524440977
CSeq: 1 REGISTER
Contact: sip:[email protected]:5060
Authorization: Capability algorithm=“A:SM2;H:SM3;S:SM1/OFB/PKCS5;SI:SM3-SM2”, keyversion=“2019-08-06T05:31:39”, cnonce=“devicecert:LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJiVENDQVJNQ0FRRXdDZ1lJS29FY3oxVUJnM1V3UWpFTE1Ba0dBMVVFQmhNQ1EwNHhFREFPQmdOVkJBZ00KQjJkaU16VXhNVFF4SVRBZkJnTlZCQW9NR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNUlFeDBaREFlRncweApPVEEzTWpVd09USTVORGRhRncweU9UQTNNakl3T1RJNU5EZGFNRU14Q3pBSkJnTlZCQVlUQWtOT01UUXdNZ1lEClZRUUREQ3N6TWpBd01EQXdNREF3TVRNeU5UQXdNREF3TVY4eE56RTNNREV5TURFMU1EZ3dNVEk1TURZMU1URTMKTUZrd0V3WUhLb1pJemowQ0FRWUlLb0VjejFVQmdpMERRZ0FFWkhmbFZYaGxvOFZDTkRHZFcvZjVROE50SUVjcAoyRGZVbjI2Rm5WKy9Ob3F0b1dzb1JjRityUzZ2bTVubStqc0pKdWc0amN4WlBiaTNkOE9qWDgwMnpUQUtCZ2dxCmdSelBWUUdEZFFOSUFEQkZBaUVBeFMzQk9oVkRGQjBBVDBjTFJCYUJtQ3o2WXBFZjB4eUxBclVHdDBqeUwzQUMKSUR2RkE5NWFXc1JEazRaTm5iZ2l4eHRmbW53eXB1UUZLY0lwMGMwZUZKcHIKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=”
Max-Forwards: 70
User-Agent: IP Camera
Expires: 3600
Content-Length: 0
通过Authorization域,告知上级平台,FDWSF的能力(Capability)
吐槽一波:这个FDWSF(安全前端设备:Front-end Device With Safety Function)只支持SM1算法,这个算法可能没有软件实现方案,估计得上加密芯片,如果是软件方案,这个设备将无法支持,如果做软件方案,设备不支持SM4将是个风险点。
再吐槽一波:这个标准本身就自我矛盾,例如的值都不符合16为数字字符的要求,这不是难为开发人员么?不过见怪不怪了,习惯就好。分析这个报文,至少前面的报文补0了,看着舒服一些,那就按照找的报文方式处理数据好了。
SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 192.168.3.12:5060;rport=5060;branch=z9hG4bK443099353
From: sip:11011200001325000001@1101120000;tag=249558797
To: sip:11011200001325000001@1101120000;tag=127583574
Call-ID: 1524440977
CSeq: 1 REGISTER
WWW-Authenticate: Unidirection algorithm=“A:SM2;H:SM3;S:SM1/OFB/PKCS5;SI:SM3-SM2”, random1=“PRAIIbutDbd5x/NKsbwwYw==”
Content-Type: Application/MANSCDP+xml
User-Agent: videosvr 1.0
Content-Length: 0
通过WWW-Authenticate域,告知下级平台服务器使用Unidirection(单向身份验证)
吐槽:也没有给上级平台可选的余地,就这一组算法。
吐槽:标准中只说是随机数,但是报文中明显是base64编码,videosvr 1.0个性发挥的成分。
REGISTER sip:11011200002000000100@1101120000 SIP/2.0
Via: SIP/2.0/UDP 192.168.3.12:5060;rport;branch=z9hG4bK582371201
From: sip:11011200001325000001@1101120000;tag=249558797
To: sip:11011200001325000001@1101120000
Call-ID: 1524440977
CSeq: 2 REGISTER
Contact: sip:[email protected]:5060
Authorization: Unidirection random1=“PRAIIbutDbd5x/NKsbwwYw==”, random2=“F4InuQewuMMqYPy1ItBdhQ==”, serverid=“11011200002000000100”, sign1=“MEYCIQD/9gP8olHM0TeLj0MxBRw3C8tQKFMMRgUupnyD4xXTTwIhAJvXxvTEDXj8Yk5qjHwujzUjpYpxxCGq7Zz0tKzhhJUU”, algorithm=“A:SM2;H:SM3;S:SM1/OFB/PKCS5;SI:SM3-SM2”
Max-Forwards: 70
User-Agent: IP Camera
Expires: 3600
Content-Length: 0
通过Authorization域,告知上级平台使用Unidirection(单向身份验证)
随机数1
random1=“PRAIIbutDbd5x/NKsbwwYw==”
服务器生成的random1,在注册时携带上。
随机数2
random2=“F4InuQewuMMqYPy1ItBdhQ==”
吐槽:标准中只说是随机数,但是报文中明显是base64编码,IP Camera也有私活。莫非有地方定义随机数的生成方式?
服务器ID
serverid=“11011200002000000100”
签名1
sign1=“MEYCIQD/9gP8olHM0TeLj0MxBRw3C8tQKFMMRgUupnyD4xXTTwIhAJvXxvTEDXj8Yk5qjHwujzUjpYpxxCGq7Zz0tKzhhJUU”
FDWSF的私钥 SI(random2 + random1 + serverid)
用于服务器对设备身份进行验签
与服务器选择的算法一致
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.3.12:5060;rport=5060;branch=z9hG4bK582371201
From: sip:11011200001325000001@1101120000;tag=249558797
To: sip:11011200001325000001@1101120000;tag=822951361
Call-ID: 1524440977
CSeq: 2 REGISTER
Contact: sip:[email protected]:5060
User-Agent: videosvr 1.0
Expires: 3600
Date: 2019-08-06T13:31:57.004
SecurityInfo: Unidirection cryptkey=“MHkCIBHIiuBM7BulVNA9W1lwMzqDWFgmwqmF3lUg2ek0OJ77AiEAhLUtNE+yGqjqOKSUDIMyaSuNTaI5NUkhLq/cDxHKXJwEIHFMxhef2Mm87QjLenmuVKs1rGm7Ls3aMG+1zPp47365BBAnTJVAmqz9pBE2xKOXhpQF”, algorithm=“A:SM2;H:SM3”
Content-Length: 0
通过SecurityInfo域,告知**Unidirection(单向身份验证)**结果
密钥
cryptkey=“MHkCIBHIiuBM7BulVNA9W1lwMzqDWFgmwqmF3lUg2ek0OJ77AiEAhLUtNE+yGqjqOKSUDIMyaSuNTaI5NUkhLq/cDxHKXJwEIHFMxhef2Mm87QjLenmuVKs1rGm7Ls3aMG+1zPp47365BBAnTJVAmqz9pBE2xKOXhpQF”
暂时没有看到这个是干嘛用的,可硬是一些星灵上需要它进行加密。
算法
algorithm=“A:SM2;H:SM3”
非对称算法:SM2
杂凑算法(Hash)支持:SM3
吐槽,这里为什么不指定对称加密算法?标准例子里没有就没有,不管了。
REGISTER sip:34020000002000000003@34020000 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.64:5060;rport;branch=z9hG4bK520712539
From: sip:34020000001320000001@34020000;tag=1465468922
To: sip:34020000001320000001@34020000
Call-ID: 563593916
CSeq: 1 REGISTER
Contact: sip:[email protected]:5060
Authorization: Capability algorithm=“A:SM2;H:SM3;S:SM1/OFB/PKCS5;SI:SM3-SM2”, keyversion=“2018-12-20T19:27:41”
Max-Forwards: 70
User-Agent: IP Camera
Expires: 3600
Content-Length: 0
吐槽一波:这个FDWSF也是只支持SM1算法,有点危险。
上面吐槽过了,这里不吐槽了,但是这次没有cnonce了,这次才是对的嘛!
SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 192.168.1.64:5060;rport=5060;branch=z9hG4bK520712539
From: sip:34020000001320000001@34020000;tag=1465468922
To: sip:34020000001320000001@34020000;tag=1966674912
Call-ID: 563593916
CSeq: 1 REGISTER
User-Agent: videosvr 1.0
Expires: 3600
Date: 2018-12-20T19:27:42.000
WWW-Authenticate: Bidirection algorithm=“A:SM2;H:SM3;S:SM4/OFB/PKCS5,SM1/OFB/PKCS5;SI:SM3-SM2”, random1=“OxImNZnZwyNMtx0FjnWKrg==”
Content-Length: 0
通过WWW-Authenticate域,告知下级平台服务器使用Bidirection (双向向身份验证)
吐槽:也是没得选。
吐槽:感觉随机数肯定有标准,就是我没有看到,莫非是这个要求:随机数生成算法需要通过GM/T 0005-2012检测,稍后查一下
REGISTER sip:34020000002000000003@34020000 SIP/2.0
Via: SIP/2.0/UDP 192.168.1.64:5060;rport;branch=z9hG4bK1060289490
From: sip:34020000001320000001@34020000;tag=1465468922
To: sip:34020000001320000001@34020000
Call-ID: 563593916
CSeq: 2 REGISTER
Contact: sip:[email protected]:5060
Authorization: Bidirection random1=“OxImNZnZwyNMtx0FjnWKrg==”, random2=“KBDLEUo83FgcnHXcSNN04w==”, serverid=“34020000002000000003”, sign1=“MEYCIQDRWE9xmwU4+2pS7RF4H+VXhFvo6VkM/hiCvTZpxVKZ7AIhAJbLfc9r7OpgzMc0bdqE6XuOs70vF96BcCbvoOqKGRjh”, algorithm=“A:SM2;H:SM3;S:SM4/OFB/PKCS5,SM1/OFB/PKCS5;SI:SM3-SM2”
Max-Forwards: 70
User-Agent: IP Camera
Expires: 3600
Content-Length: 0
通过Authorization域,告知上级平台使用Bidirection (双向向身份验证)
随机数1
random1=“OxImNZnZwyNMtx0FjnWKrg==”
服务器生成的random1,在注册时携带上。
随机数2
random2=“KBDLEUo83FgcnHXcSNN04w==”
客户端随机数
服务器ID
serverid=“34020000002000000003”
签名1
sign1=“MEYCIQDRWE9xmwU4+2pS7RF4H+VXhFvo6VkM/hiCvTZpxVKZ7AIhAJbLfc9r7OpgzMc0bdqE6XuOs70vF96BcCbvoOqKGRjh”
FDWSF的私钥 SI(random2 + random1 + serverid)
用于服务器对设备身份进行验签
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.1.64:5060;rport=5060;branch=z9hG4bK1060289490
From: sip:34020000001320000001@34020000;tag=1465468922
To: sip:34020000001320000001@34020000;tag=1980721111
Call-ID: 563593916
CSeq: 2 REGISTER
User-Agent: videosvr 1.0
Expires: 3600
Date: 2018-12-20T19:27:42.000
SecurityInfo: Bidirection algorithm=“A:SM2;H:SM3;S:SM4/OFB/PKCS5,SM1/OFB/PKCS5;SI:SM3-SM2”,random1=“OxImNZnZwyNMtx0FjnWKrg==”,random2=“KBDLEUo83FgcnHXcSNN04w==”,deviceid=“34020000001320000001”,serverid=“34020000002000000003”,cryptkey=“MHgCICPmu12OKCfCNsiTK/6wSsHpDEF43fedv9AxRjj+XzQ0AiAZnh6496mWVcpV+BWOK4tZ3G3q/TZ4Dwt6vBv3G4xlXQQgMfbkaXwYUL8RObHfkpQEC++/CA/Enssg7rlZgDnKCXQEEEWqHpbVai9NJaT0orxaQ4Y=”,sign2=“MEUCIQDzvGhJCuxmH/3NNtLNnrXIUOxYkYB7j8/3Th1LvjZHggIgD/nd9RbpEd6neZTuXDsIbNzydyS8WarbN1p6nHD5pHk=”
Content-Length: 0
通过SecurityInfo域,告知**Bidirection (双向向身份验证)**结果
非对称算法:SM2
杂凑算法(Hash)支持:SM3
对称算法:SM4/OFB/PKCS5,SM1/OFB/PKCS5
签名算法:SM3-SM2
随机数1
random1=“OxImNZnZwyNMtx0FjnWKrg==”
服务器生成的random1
随机数2
random2=“KBDLEUo83FgcnHXcSNN04w==”
客户端生成的random2
设备ID
deviceid=“34020000001320000001”
服务器ID
serverid=“34020000002000000003”
密钥
cryptkey=“MHgCICPmu12OKCfCNsiTK/6wSsHpDEF43fedv9AxRjj+XzQ0AiAZnh6496mWVcpV+BWOK4tZ3G3q/TZ4Dwt6vBv3G4xlXQQgMfbkaXwYUL8RObHfkpQEC++/CA/Enssg7rlZgDnKCXQEEEWqHpbVai9NJaT0orxaQ4Y=”
双向身份验证验签时需要此字段
签名2
sign2=“MEUCIQDzvGhJCuxmH/3NNtLNnrXIUOxYkYB7j8/3Th1LvjZHggIgD/nd9RbpEd6neZTuXDsIbNzydyS8WarbN1p6nHD5pHk=”
Server的私钥 SI(random2 + random1 + deviceid + cryptkey)
用户设备端对服务端做身份验证
平台间的双向身份验证没有找到实际例子,只能拿标准中的师范分析了。
吐槽,消息师范D2根本就是设备的双向身份验证,被标准忽悠了额,那怎么办?看文字说明,自己琢磨吧。
和设备端双向认证内容一致,此章节省略
和设备端双向认证内容一致,此章节省略
和设备端双向认证内容一致,此章节省略
通过SecurityInfo域,告知**Bidirection (双向向身份验证)**结果
非对称算法:SM2
杂凑算法(Hash)支持:SM3
对称算法:SM4/OFB/PKCS5,SM1/OFB/PKCS5
签名算法:SM3-SM2
随机数1
random1=“OxImNZnZwyNMtx0FjnWKrg==”
服务器生成的random1
随机数2
random2=“KBDLEUo83FgcnHXcSNN04w==”
客户端生成的random2
设备ID
deviceid=“34020000001320000001”
服务器ID
serverid=“34020000002000000003”
密钥
cryptkey=“MHgCICPmu12OKCfCNsiTK/6wSsHpDEF43fedv9AxRjj+XzQ0AiAZnh6496mWVcpV+BWOK4tZ3G3q/TZ4Dwt6vBv3G4xlXQQgMfbkaXwYUL8RObHfkpQEC++/CA/Enssg7rlZgDnKCXQEEEWqHpbVai9NJaT0orxaQ4Y=”
双向身份验证验签时需要此字段
签名2
sign2=“MEUCIQDzvGhJCuxmH/3NNtLNnrXIUOxYkYB7j8/3Th1LvjZHggIgD/nd9RbpEd6neZTuXDsIbNzydyS8WarbN1p6nHD5pHk=”
Server的私钥 SI(random2 + random1 + deviceid + cryptkey)
用户设备端对服务端做身份验证