ussl – 套接字对象的TLS / SSL包装器

该模块实现了相应的CPython模块的子集,如下所述。有关更多信息,请参考原始CPython文档:ssl


本模块保证了对传安全传输层协议(TLS - Transport Layer Security)的访问 (SSL - Secure Sockets Layer)加密, 并且提供客户端和服务端层面的网络嵌套字层面的对等连接认证技术。

使用示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import netmgr
netmgr.init()
netmgr.connect('xxxx', 'yyyy') # xxxx为wifi账号,yyyy为WiFi密码

import ussl, ujson, usocket

url = 'https://pypi.org/pypi/micropython-decimal/json'
proto, _, host, urlpath = url.split("/", 3)
port = 443
ai = usocket.getaddrinfo(host, port, 0, usocket.SOCK_STREAM)
ai = ai[0]

s = usocket.socket(ai[0], ai[1], ai[2])
s.connect(ai[-1])
s = ussl.wrap_socket(s, server_hostname=host)

s.write("GET /%s HTTP/1.0\r\nHost: %s:%s\r\n\r\n" % (urlpath, host, port))
l = s.readline()
protover, status, msg = l.split(None, 2)

if status != b"200":
    if status == b"404" or status == b"301":
        raise NotFoundError("Package not found")
    raise ValueError(status)

while 1:
    l = s.readline()
    if not l:
        raise ValueError("Unexpected EOF in HTTP headers")
    if l == b"\r\n":
        break

ujson.load(s)

s.close()

方法

ussl.wrap_socket(sock, server_side=False, keyfile=None, certfile=None, cert_reqs=CERT_NONE, ca_certs=None, do_handshake=True)

接受一个 stream 类型的 sock (通常是 SOCK_STREAM 类型的usocket.socket实例),并返回ssl.SSLSocket的实例,该实例将基础流包装在SSL上下文。 返回的对象具有通常的 stream 接口方法,例如 read(),write()等。

在MicroPython中,返回的对象不会公开套接字接口和方法,例如 recv()send() 。特别是服务器端SSL套接字应使用从传回的普通套接字创建 ~usocket.socket.accept() 在非SSL侦听服务器套接字上。

  • do_handshake: 确定握手是否作为 wrap_socket 的一部分完成或者是否将其推迟作为初始读取或写入的一部分(CPython中没有do_handshake方法)。

对于阻塞式套接字,标准行为是立即进行握手。对于非阻塞套接字(即,传递给 wrap_socketsock 处于非阻塞模式时), 通常应该推迟握手,因为否则 wrap_socket 会阻塞直到完成。

异常

OSError