密钥对身份验证:故障排除¶
本主题帮助您排查使用 密钥对身份验证 连接到 Snowflake 时发生的错误。它侧重于包含 JWT token is invalid 的错误。
找到错误¶
在进行故障排除之前,您需要确定问题是否导致了 JWT token is invalid 错误。
如果您的 Snowflake 客户端是没有交互式界面的驱动程序或连接器,请使用日志检查连接错误:
启用 Snowflake 连接器或驱动程序的日志记录。有关详细信息,请参阅 为 Snowflake 驱动程序和连接器生成日志文件 (https://community.snowflake.com/s/article/How-to-generate-log-file-on-Snowflake-connectors) (Snowflake 知识库文章)。
检查包含字符串
JWT token is invalid的错误。例如,使用 Snowflake JDBC 驱动程序的客户端在尝试使用密钥对身份验证时可能会出现以下错误:
yyyy-mm-dd hh:mm:ss.nnn n.s.c.jdbc.SnowflakeSQLException FINE <init>:40 - Snowflake exception: JWT token is invalid. [0ce9eb56-821d-4ca9-a774-04ae89a0cf5a], sqlState:08001, vendorCode:390,144, queryId:
检索更多详细信息¶
每个 JWT token is invalid 错误都包含 UUID,该 UUID 在错误发生后立即出现在括号中(例如,JWT token is invalid. [0ce9eb56-821d-4ca9-a774-04ae89a0cf5a])。您应该向 Snowflake 管理员提供错误的 UUID,以便他们可以获得有关错误的更多信息。
管理员使用 SYSTEM$GET_LOGIN_FAILURE_DETAILS 函数来获取有关错误的更多详细信息。例如,获取有关 JWT token is invalid. [0ce9eb56-821d-4ca9-a774-04ae89a0cf5a] 错误的更多信息,具有 ACCOUNTADMIN 角色的用户可以执行:
SELECT JSON_EXTRACT_PATH_TEXT(SYSTEM$GET_LOGIN_FAILURE_DETAILS('0ce9eb56-821d-4ca9-a774-04ae89a0cf5a'), 'errorCode');
JSON_EXTRACT_PATH_TEXT 函数用于解析 SYSTEM$GET_LOGIN_FAILURE_DETAILS 函数的 JSON 输出,以检索错误代码和错误消息。
错误列表¶
SYSTEM$GET_LOGIN_FAILURE_DETAILS 函数的输出是以下错误代码/错误组合之一。
错误代码  | 
错误  | 
描述  | 
|---|---|---|
394307  | 
JWT_TOKEN_ACCOUNT_MISMATCH  | 
从令牌获取的 Snowflake 账户与请求中的 URL 账户不同。  | 
390144  | 
JWT_TOKEN_INVALID  | 
JWT 令牌存在一个普遍问题。有关可能的解决方案,请参阅 常见错误和解决方案。  | 
394300  | 
JWT_TOKEN_INVALID_USER_IN_ISSUER  | 
Snowflake 账户中不存在发放者指定的用户名。有关可能的解决方案,请参阅 常见错误和解决方案。  | 
394301  | 
JWT_TOKEN_MISSING_ISSUE_OR_EXPIRATION_TIME  | 
JWT 令牌不包含发放时间或到期时间。  | 
394302  | 
JWT_TOKEN_INVALID_ISSUE_TIME  | 
Snowflake 在发放时间超过 60 秒后收到了 JWT 令牌。有关可能的解决方案,请参阅 常见错误和解决方案。  | 
394303  | 
JWT_TOKEN_INVALID_EXPIRATION_TIME  | 
JWT 令牌已过期。  | 
394304  | 
JWT_TOKEN_INVALID_PUBLIC_KEY_FINGERPRINT_MISMATCH  | 
发放者指定的公钥指纹与 Snowflake 中为用户存储的公钥指纹不匹配。有关可能的解决方案,请参阅 常见错误和解决方案。  | 
394305  | 
JWT_TOKEN_INVALID_ALGORITHM  | 
JWT 令牌未使用 RS256 算法进行签名。  | 
394306  | 
JWT_TOKEN_INVALID_SIGNATURE  | 
Snowflake 无法验证 JWT 令牌提供的签名。JWT 可能使用未与提供的公钥配对的私钥进行签名。JWT 签名也可能已损坏或已修改。  | 
常见错误和解决方案¶
与密钥对身份验证相关的最常见错误是:
使用以下描述和解决方案对这些错误进行故障排除。
JWT_TOKEN_INVALID¶
- 描述:
 JWT 令牌存在普遍问题。
- 解决方案 #1:
 令牌本身可能格式不正确。仔细检查访问 Snowflake 的应用程序是否正在生成有效的 JWT 令牌。
- 解决方案 #2:
 仔细检查客户端(驱动程序、连接器或请求 URL)是否使用正确的 账户标识符 连接到 Snowflake 账户。您还应该检查该值是否与
iss声明中的账户标识符匹配。- 解决方案 #3:
 仔细检查
sub声明中的账户标识符和用户名是否与iss声明中的相应值相匹配。- 解决方案 #4:
 仔细检查
iss声明是否指定SHA256为签名算法。
JWT_TOKEN_INVALID_PUBLIC_KEY_FINGERPRINT_MISMATCH¶
- 描述:
 发放者指定的公钥指纹与 Snowflake 中为用户存储的公钥指纹不匹配。
- 解决方案:
 获取 JWT 令牌的公钥指纹,然后将其与 Snowflake 中与用户相关的指纹进行比较。
获取 JWT 令牌指纹的一种方法是 为您的驱动程序启用 DEBUG 日志记录 (https://community.snowflake.com/s/article/How-to-generate-log-file-on-Snowflake-connectors) 并尝试登录。查找模式
SHA256:<hash>,其中<hash>是公钥指纹。要在 Snowflake 中获取与用户关联的公钥指纹,请执行 DESCRIBE USER 命令。公钥指纹位于 RSA_PUBLIC_KEY_FP 或 RSA_PUBLIC_KEY_2_FP 属性中。如果用户缺少公钥指纹,请执行 ALTER USER 命令来设置这些属性。
JWT_TOKEN_INVALID_USER_IN_ISSUER¶
- 描述:
 Snowflake 账户中不存在发放者指定的用户名。
- 解决方案:
 Snowflake 客户端中配置的用户名必须与 Snowflake 用户的
LOGIN_NAME匹配,而不是NAME。有时这些值是不同的。执行 DESCRIBE USER 命令并验证
LOGIN_NAME属性的值是否与 Snowflake 客户端用于连接的用户名相匹配。
JWT_TOKEN_INVALID_ISSUE_TIME¶
- 描述:
 Snowflake 在发放时间超过 60 秒后收到了 JWT 令牌。
- 解决方案 #1:
 检查运行驱动程序的主机,确保其与 NTP 同步并且没有时钟偏差。如果服务器时钟出现偏差,Snowflake 可能会确定当前时间比令牌发放时间晚了 60 秒以上,但实际上并非如此。 例如,如果客户端机器落后了 30 秒,令牌花了 45 秒才到达 Snowflake,那么 Snowflake 会确定自 JWT 令牌发行以来已经过了 75 秒,而不是 45 秒。
您可以通过将客户端机器的时钟与 NTP 服务器进行比较来检查客户端机器的时钟是否准确。例如,您可以使用 NIST互联网时间服务器 (https://tf.nist.gov/tf-cgi/servers.cgi) 同步客户端机器。有关检查主机时钟并将其同步到 NTP 服务器方面的帮助,请参阅操作系统的管理员指南或联系系统管理员。
- 解决方案 #2:
 使用 OS 特定监控工具来确定错误是否发生在 CPU/磁盘使用率极高的时期。
- 解决方案 #3:
 检查是否存在过长的网络延迟,导致 Snowflake 在 JWT 令牌发放后超过 60 秒才处理该令牌。
使用 Connectivity Diagnostic Tool 测量网络延迟时,将目标设置为
account_identifier.snowflakecomputing.cn。例如,如果 Snowflake 客户端使用myorg-account1作为账户标识符,则将目标设置为myorg-account1.snowflakecomputing.cn。