安全和网络组件¶
此图显示了在对 nsHttpChannel 执行 asyncOpen 操作时,到 NSS 层进行典型资源加载的高级调用流程。
Necko¶
包含 安全相关信息 的 LoadInfo 会传递到父进程上的通道 (nsHttpChannel)。
通道创建事务,并向套接字线程上的 nsHttpConnectionMgr 发出信号以处理事务。
然后在套接字线程上获取事务,并“分派”到一个新的或现有的 ConnectionEntry,该条目根据其 ConnectionInfo 进行哈希。
底层连接 (对于 Http/1.1 和 Http/2 使用 nsHttpConnection,对于 Http/3 使用 HttpConnectionUDP) 将调用 NSS 以获取安全功能。
NSS¶
Necko 通过两个不同的接口与 NSS 交互。主要地,大多数访问通过 PSM 流动,PSM 处理 TLS 套接字的配置、客户端证书选择和服务器证书验证。但是,Neqo(Mozilla 的 QUIC 库)也直接依赖于 NSS 中的 TLS 实现,并将其用作直接接口。
NSS 的内部结构相当复杂,但对于 Necko 而言,有五个主要的相关区域。从最低级别开始
blapi.h - 公开 NSS 支持的每个加密原语的包装器,并将它们分派到特定于平台的实现。
pkcs11c.c - 将这些底层加密原语包装起来,以提供 PKCS11 接口作为一个模块。
pk11pub.h - 包装提供 PKCS11 接口的任何模块,并公开高级加密操作。它在 Firefox 中被广泛使用。
ssl.h 和 sslexp.h 公开我们的 TLS 接口,以便在 Necko 的 TLS 和 Neqo 的 QUIC 连接中使用。
classDiagram class LoadInfo{ +Principal(s) (loading, triggering, toInherit) +Context } nsHttpChannel --> nsHttpTransaction nsHttpTransaction --> nsHttpConnectionMgr nsHttpConnectionMgr --> ConnectionEntry : Via ConnectionInfo hash ConnectionEntry --> HttpConnectionBase HttpConnectionBase <-- nsHttpConnection : Is A HttpConnectionBase <-- HttpConnectionUDP : Is A nsHttpConnection --> nsSocketTransport2 nsSocketTransport2 --> PSM PSM --> NSPR PSM --> `Off Main Thread CertVerifier` Neqo --> `Off Main Thread CertVerifier` %% for Http/3 HttpConnectionUDP --> Http3Session : Http/3 HttpConnectionUDP --> nsUDPSocket : Http/3 nsUDPSocket --> NSPR : Http/3 Http3Session --> Neqo : Http/3 %% security TCP stack PSM --> TLS `Off Main Thread CertVerifier` --> Pcks11 TLS --> Pcks11 Pcks11 --> Blapi Blapi --> `Crypto Primitives` `Crypto Primitives` --> `Platform-Specific Crypto Implementations` %% transport security info PSM -- Transport Security Info Transport Security Info --> nsHttpChannel %% security UDP stack Neqo --> TLS `Off Main Thread CertVerifier`--> CertDB CertDB --> Builtins %% classes nsHttpChannel o-- LoadInfo nsHttpChannel o-- StreamListener nsHttpConnectionMgr o-- ConnectionEntry : Many