网络选项

NetworkOptions.ca_roots函数
ca_roots() :: Union{Nothing, String}

ca_roots() 函数告诉调用者在哪里(如果有的话)可以找到 PEM 编码的证书颁发机构根证书的文件或目录。默认情况下,在 Windows 和 macOS 等系统上,内置的 TLS 引擎知道如何使用系统的内置证书验证机制来验证主机,此函数将返回 nothing。在经典的 UNIX 系统(不包括 macOS)上,根证书通常存储在 /etc 中的文件中:将搜索当前 UNIX 系统的常用位置,如果其中一个路径存在,则返回该路径;如果这些典型的根证书路径都不存在,则返回 Julia 捆绑的根证书集的路径。

可以通过设置 JULIA_SSL_CA_ROOTS_PATHSSL_CERT_DIRSSL_CERT_FILE 环境变量来覆盖 ca_roots() 返回的默认值,在这种情况下,此函数将始终返回设置的第一个变量的值(无论路径是否存在)。如果 JULIA_SSL_CA_ROOTS_PATH 设置为空字符串,则忽略其他变量(就像未设置一样);如果其他变量设置为空字符串,则其行为就像未设置一样。

NetworkOptions.ca_roots_path函数
ca_roots_path() :: String

ca_roots_path() 函数类似于 ca_roots() 函数,但它始终返回 PEM 编码的证书颁发机构根证书的文件或目录的路径。当在 Windows 或 macOS 等系统上调用时,系统根证书未存储在文件系统中,它当前将返回 Julia 捆绑的根证书集的路径。(将来,此函数可能会从系统中提取根证书并将其保存到一个文件的路径将被返回。)

如果可以配置使用 TLS 的库以使用系统证书,这通常是可取的:即最好使用 ca_roots(),它返回 nothing 以指示应使用系统证书。ca_roots_path() 函数仅应在配置需要根证书的文件或目录路径的库时使用。

可以通过设置 JULIA_SSL_CA_ROOTS_PATHSSL_CERT_DIRSSL_CERT_FILE 环境变量来覆盖 ca_roots_path() 返回的默认值,在这种情况下,此函数将始终返回设置的第一个变量的值(无论路径是否存在)。如果 JULIA_SSL_CA_ROOTS_PATH 设置为空字符串,则忽略其他变量(就像未设置一样);如果其他变量设置为空字符串,则其行为就像未设置一样。

NetworkOptions.ssh_dir函数
ssh_dir() :: String

ssh_dir() 函数返回 ssh 程序保存/查找配置文件的目录位置。默认情况下,这是 ~/.ssh,但可以通过设置环境变量 SSH_DIR 来覆盖此设置。

NetworkOptions.ssh_key_pass函数
ssh_key_pass() :: String

如果设置了 ssh_key_pass() 函数返回环境变量 SSH_KEY_PASS 的值,否则返回 nothing。将来,它可能能够通过其他方式(例如安全系统存储)找到密码,因此需要密码来解密 SSH 私钥的包应使用此 API 而不是直接检查环境变量,以便在添加此类功能时自动获得此类功能。

NetworkOptions.ssh_key_name函数
ssh_key_name() :: String

ssh_key_name() 函数返回 SSH 在建立连接时应使用的密钥文件的基名。通常没有理由直接调用此函数,库通常应使用 ssh_key_pathssh_pub_key_path 函数来获取完整路径。如果设置了环境变量 SSH_KEY_NAME,则此函数返回该变量;否则,默认返回 id_rsa

NetworkOptions.ssh_key_path函数
ssh_key_path() :: String

ssh_key_path() 函数返回应用于 SSH 连接的 SSH 私钥文件的路径。如果设置了 SSH_KEY_PATH 环境变量,则它将返回该值。否则,它默认为返回

joinpath(ssh_dir(), ssh_key_name())

反过来,此默认值取决于 SSH_DIRSSH_KEY_NAME 环境变量。

NetworkOptions.ssh_pub_key_path函数
ssh_pub_key_path() :: String

ssh_pub_key_path() 函数返回应用于 SSH 连接的 SSH 公钥文件的路径。如果设置了 SSH_PUB_KEY_PATH 环境变量,则它将返回该值。如果没有设置,但设置了 SSH_KEY_PATH,它将返回该路径并在末尾附加 .pub 后缀。如果两者都没有设置,则默认为返回

joinpath(ssh_dir(), ssh_key_name() * ".pub")

反过来,此默认值取决于 SSH_DIRSSH_KEY_NAME 环境变量。

NetworkOptions.ssh_known_hosts_files函数
ssh_known_hosts_files() :: Vector{String}

ssh_known_hosts_files() 函数返回一个 SSH 已知主机文件的路径向量,在建立 SSH 连接时用于验证远程服务器的身份。默认情况下,此函数返回

[joinpath(ssh_dir(), "known_hosts"), bundled_known_hosts]

其中 bundled_known_hosts 是此包捆绑的已知主机文件的副本的路径(包含 github.comgitlab.com 的已知主机密钥)。但是,如果设置了环境变量 SSH_KNOWN_HOSTS_FILES,则其值将以 : 字符(或 Windows 上的 ;)拆分为路径,并返回此路径向量。如果此向量的任何组件为空,则将其扩展为默认的已知主机路径。

使用 ssh_known_hosts_files() 的包理想情况下应该通过比较主机名和密钥类型来查找匹配的条目,将任何文件中匹配的第一个条目视为主机的最终身份。如果调用者无法比较密钥类型(例如,因为它已被哈希),则它必须通过在每个文件中查找主机的所有匹配条目来近似上述算法:如果一个文件对主机有任何条目,则其中一个必须匹配;只有当前面文件中没有关于该主机的条目时,调用者才能继续搜索更多已知主机文件。

NetworkOptions.ssh_known_hosts_file函数
ssh_known_hosts_file() :: String

ssh_known_hosts_file() 函数返回 SSH 已知主机文件的单个路径,在建立 SSH 连接时用于验证远程服务器的身份。它返回 ssh_known_hosts_files 返回的第一个实际存在的路径。可以查看多个已知主机文件的调用者应使用 ssh_known_hosts_files,并按照该函数文档中所述在所有返回的文件中查找主机匹配项。

NetworkOptions.verify_host函数
verify_host(url::AbstractString, [transport::AbstractString]) :: Bool

verify_host 函数告诉调用者在通过 TLS 或 SSH 等安全传输进行通信时是否应验证主机的身份。url 参数可以是

  1. proto:// 开头的正确 URL
  2. ssh 样式的裸主机名或以 user@ 为前缀的主机名
  3. scp 样式的主机,如上所述,后跟 : 和路径位置

在每种情况下,都会解析出主机名部分,并仅根据主机名(而不是输入 URL 的任何其他内容)做出是否验证的决定。特别是,URL 的协议无关紧要(下面将详细介绍)。

transport 参数指示查询所针对的传输类型。当前已知的取值包括 SSL/ssl(别名为 TLS/tls)和 SSH/ssh。如果省略传输类型,则只有当主机名无论传输类型如何都不应被验证时,查询才会返回 true

主机名将根据相关环境变量中的主机模式进行匹配,具体取决于是否提供了 transport 以及其值。

  • JULIA_NO_VERIFY_HOSTS — 不应为任何传输验证的主机
  • JULIA_SSL_NO_VERIFY_HOSTS — 不应为 SSL/TLS 验证的主机
  • JULIA_SSH_NO_VERIFY_HOSTS — 不应为 SSH 验证的主机
  • JULIA_ALWAYS_VERIFY_HOSTS — 始终应验证的主机

每个变量的值都是一个用逗号分隔的主机名模式列表,其语法如下:每个模式都以 . 分割成多个部分,每个部分必须是以下之一

  1. 由一个或多个 ASCII 字母、数字、连字符或下划线组成的文字域名组件(从技术上讲,它不是合法主机名的组成部分,但有时会被使用)。文字域名组件仅匹配自身。
  2. **,匹配零个或多个域名组件。
  3. *,匹配任何一个域名组件。

当将主机名与这些变量之一中的模式列表进行匹配时,主机名将以 . 分割成组件,并将该单词序列与模式进行匹配:文字模式完全匹配具有该值的单个主机名组件;* 模式完全匹配具有任何值的单个主机名组件;** 模式匹配任意数量的主机名组件。例如

  • ** 匹配任何主机名
  • **.org 匹配 .org 顶级域名中的任何主机名
  • example.com 仅匹配精确的主机名 example.com
  • *.example.com 匹配 api.example.com,但不匹配 example.comv1.api.example.com
  • **.example.com 匹配 example.com 下的任何域名,包括 example.com 本身、api.example.comv1.api.example.com