TLS 握手过程中客户端是如何验证服务器身份

之前我错误认为,证书中的公钥信息用于验证服务器身份。殊不知公钥仅仅是用来加密,无法提供任何身份信息。经过一些调研,我将了解的信息记录如下:

在 TLS 握手过程中,服务器向客户端发送自己的证书。证书中包含服务器的签名和签名算法。这个签名提供了身份信息。同时,证书中包含的签名是使用签发该证书的 CA 的私钥加密的。签名算法可以是 MD5 或者 SHA256。

客户端收到证书后,遵循以下步骤验证签名:

  1. 使用该签名算法对证书的内容(不包含签名)进行哈希运算,获得一个签名值。
  2. 使用 CA 的公钥对该加密的签名进行解密,获得签名。
  3. 比对这两个签名。如果一致,则服务器身份验证通过。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 micropython 使用 tls 单向认证(客户端验证服务器)需要使用 ussl 库。可以在代码使用如下方式导入该库: ``` import ussl ``` 之后,可以使用 ussl.wrap_socket() 函数将网络连接包装成 tls 连接。例如: ``` import socket import ussl s = socket.socket() s.connect(('example.com', 443)) s = ussl.wrap_socket(s, cert_reqs=ussl.CERT_REQUIRED, ca_certs='path/to/ca.pem') ``` 其 cert_reqs 参数用于设置证书验证级别,可以设置为 ussl.CERT_NONE、ussl.CERT_OPTIONAL 或 ussl.CERT_REQUIRED。ca_certs 参数用于指定 CA 证书的路径。 ### 回答2: 在MicroPython使用TLS(Transport Layer Security)单向认证(客户端验证服务器)需要导入ussl(MicroPython SSL)库。 1. 导入ussl库:使用`import ussl`语句导入ussl库,它是MicroPython的标准库,用于提供SSL/TLS安全通信功能。 2. 创建SSL连接:使用`ssl.wrap_socket(socket, server_side=False, certfile=None, keyfile=None, ca_certs=None, cert_reqs=ussl.CERT_REQUIRED)`函数创建一个SSL连接。其,`socket`是已经建立的网络套接字,`server_side`参数指定是否是服务器身份验证,`certfile`参数是服务器证书文件的路径,`keyfile`参数是服务器私钥文件的路径,`ca_certs`参数是服务器根证书的路径,`cert_reqs`参数指定客户端证书验证要求。 3. 连接到服务器:使用`socket.connect((host, port))`函数连接到服务器上的指定主机和端口。 4. 发起TLS握手:使用`socket.do_handshake()`函数发起TLS握手,建立安全连接。 5. 验证服务器证书:通过设置`cert_reqs=ussl.CERT_REQUIRED`和提供`ca_certs`参数,使得在握手过程客户端会要求验证服务器证书。如果验证失败,将会引发`ssl.SSLError`异常。 下面是一个示例代码: ```python import usocket import ussl # 创建套接字 socket = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) # 创建SSL连接 ssl_socket = ussl.wrap_socket(socket, server_side=False, cert_reqs=ussl.CERT_REQUIRED, ca_certs="ca_cert.pem") # 连接到服务器 ssl_socket.connect(("example.com", 443)) # 发起TLS握手 ssl_socket.do_handshake() # 验证服务器证书 cert = ssl_socket.getpeercert() # 进行证书验证的操作 # 在这里进行数据的发送和接收 ``` 请注意,在使用MicroPython时,需要将服务器的根证书(ca_cert.pem)和客户端的证书(如果有的话)存储在可访问的文件系统。 ### 回答3: 在MicroPython使用tls单向认证,需要导入`usocket`和`ssl`库。 首先,我们需要创建一个`usocket`对象,用于与服务器建立连接。假设服务器的IP地址为`192.168.0.100`,端口号为`8888`,代码如下: ```python import usocket sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) sock.connect(('192.168.0.100', 8888)) ``` 然后,我们可以使用`ssl.wrap_socket`函数创建一个TLS连接。此函数需要传入`usocket`对象、服务器的域名(用于验证证书的Common Name字段),以及其他可选参数。代码如下: ```python import ssl tls_sock = ssl.wrap_socket(sock, server_hostname='example.com') ``` 在上述代码,`wrap_socket`函数会自动进行TLS握手过程,并验证服务器的证书。如果服务器的证书验证失败,将会引发`ssl.CertificateError`异常。 接下来,我们可以像使用普通的`usocket`对象一样使用`tls_sock`对象进行通信。例如,发送和接收数据: ```python tls_sock.write(b'Hello, server!') response = tls_sock.read(1024) ``` 最后,使用完毕后,记得关闭TLS连接和`usocket`对象: ```python tls_sock.close() sock.close() ``` 综上所述,要在MicroPython实现TLS单向认证,我们需要导入`usocket`和`ssl`库,并按照上述步骤创建和使用TLS连接。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值