客户端和服务器持有匹配的证书。
当服务器发送通信时,它会解码证书中的序列号并将其传递给客户端。然后,客户端可以从其证书副本中获取序列,并将其与服务器提供的序列进行比较。这些应该匹配。
证书中序列的字符串表示形式如下: -
58 17 9B 11 9E 0E F3 86 4A 41 DF A2 EE 60 92 08 58 17 9B 11 9E 0E F3 86 4A 41 DF A2 EE 60 92 08
Windows服务器使用以下方法提取字节:X509Certificate.GetSerialNumber。提取的字节被视为: -
8 146 96 238 162 223 65 74 134 243 14 158 17 155 23 88 8 146 96 238 162 223 65 74 134 243 14 158 17 155 23 88
在OS X(客户端)上,使用Core Foundation函数SecCertificateCopySerialNumber,提取的字节返回: -
88 23 -101 -09 14 -13 -122 74 65 -33 -94 -18 96 -110 8 88 23 -101 17 -98 14 -13 -122 74 65 -33 -94 -18 96 -110 8
显然,这些不匹配。此外,使用Qt,可以使用QSslCertificate并通过调用serialNumber()获取序列号。但是,这将返回以下字节: -
53 56 58 49 55 58 57 98 58 49 49 58 57 101 58 48 101 58 102 51 58 56 54 58 52 97 58 52 49 58 100 102 58 97 50 58 101 101 58 54 48 58 57 50 58 48 56 58 53 56 58 49 55 58 57 98 58 49 49 58 57 101 58 48 101 58 102 51 58 56 54 58 52 97 58 52 49 58 100 102 58 97 50 58 101 101 58 54 48 58 57 50 58 48 56
这里发生了什么,为什么没有字节数组匹配,如何在OSX上提取与Windows服务器中的串行相匹配的序列号?
答案 0 :(得分:4)
字符串,无符号字符,十六进制表示
58 17 9B 11 9E 0E F3 86 4A 41 DF A2 EE 60 92 08 58 17 9B 11 9E 0E F3 86 4A 41 DF A2 EE 60 92 08
Windows,无符号字符,带反向顺序的十进制表示
8 146 96 238 162 223 65 74 134 243 14 158 17 155 23 88 8 146 96 238 162 223 65 74 134 243 14 158 17 155 23 88
OS X,签名字符,十进制表示
88 23 -101 -09 14 -13 -122 74 65 -33 -94 -18 96 -110 8 88 23 -101 17 -98 14 -13 -122 74 65 -33 -94 -18 96 -110 8
所有三种表示形式彼此相等