You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go使用RFC-4253格式SSH公钥验证RS256 JWT报错key is of invalid type

问题原因

你遇到的key is of invalid type报错原因有两个:

  • RS256属于非对称加密算法,github.com/golang-jwt/jwt/v4库验证RS256签名时要求传入的密钥必须是*rsa.PublicKey类型,你直接传入SSH公钥的字节切片,类型不匹配。
  • 你持有的公钥是SSH RFC-4253格式,不能直接用于JWT验证,需要先解析为Go标准库支持的RSA公钥结构。

解决方法

首先安装SSH公钥解析依赖:

go get golang.org/x/crypto/ssh

修改后的完整代码如下:

import (
	"fmt"
	"crypto/rsa"

	"github.com/golang-jwt/jwt/v4"
	"golang.org/x/crypto/ssh"
)

func main() {
	tokenString := "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE2MzQ3NzE5OTMsImV4cCI6MTY2NjMwNzk5MywiYXVkIjoiaHR0cHM6Ly9hcGkuYXV0aG9yaXpvbi5jb20vdjEvIiwiaXNzIjoiaHR0cHM6Ly9hdXRob3Jpem9uLmNvbS8iLCJzdWIiOiIzOGQ3ZjMxZTVjMzc0MGM5YjQwMmFlZTI4YzRhYjc3MCIsInBlZXJfdHlwZSI6ImNsaWVudCJ9.CNNNxkhN_xmpiiihrZS2fAJSaDCx9kpBXA9G8adh3BbGOs681381Jl63q9ZNgOXsf64ZLlVEtk6YirhaloZ05ZQIEGklXh98h7EPrvNWyAUwEzSHsoAUmmnuSG7EZn4xo7utNuk4UuFOwf63FwAJN6yU5X9gHwTXlf8JjGXAbFSj-QCmX-g1TfVRPwsGAJqM03thKVc-OiOuevJr04y1DnFx3kXiMeGgRMLpPzhYDgsUkCcyITIl1SIZXY_6ifwbPibqwpPy-r0bWi0hczNBJ_wxa3wElRm0Ib-XxldgpZNI3GD9RcTdzDW5jg5Upuf0ar8BKJDHjoWfGIoD93mRA4opT4gd5IMEU16w-d_UBPu0D96Q002kbq3Ou1_iKaS1APUKnCSfyfZK2o5W_OAYbD0FkkxpqTApRaoPws1a0yGpET6pYmQHUE2Jo-1ZH6uSnPf8kT1lwoyVJzs4ScOcjilApL4JXqV_SOGWA5WiFJG5qcigFlFWRYuVitjyXQTzsxIZnKaYsElf2KUOvXgeqHXGAsGsuYs-5fR7vQOdV02n_QOU0Kr_r13I3TP1OiaL2YSGxiNMqKmWM32KNYTAFYKrWoaz_TYSgrQSv1d96E0VgipxmAucM_-qw_sa1eVeUf8XLMGYl3x1Ssv8YY5eRPOWQ8FgAmAJq5MU1y11Dao"
	key := "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDqSnARw5EZWAMSW3njVBfi6GAHe0N4rp51Uv2k107p5ZpF3gNPU0GTAQyhRBrwydaoHpeoI9Q2D3/8ornVUF+os6hiOltp885VPYrVSt6aN4vPj3UbuVykOhXoEln9CEbUb0dIfKCsiugHu94as38SE6DtVeRuQlGqpczIHdNkaFVRIx4hzeRmUZ2CyyA+8/kJgODeePP6hfHvoL2s45AC/VoffGEfskn6byC1okrfh3Fnb+ouJJYWgTqrQoQSx45Mz+NBwpBfeucAar02zD5chi/dXkwULBEF2hX9tqySuSqq544bK+ECygROuNTMYMAHPEhki1iroyHmxrer8sW/cEQcaqixB2Vu07ZWJgh2tMekLrjvRBbobervsXaXFDzjWPLY1OGsZqvSxuRSfCiQk645dzL/mXDj484FQGQ6pY6P9Tnc2alDs6yhtGb5vQtW5uFDRyfVpCBdvZjvpRXWEPHTEbKygKIy04QEi+QvZcInm6idBD00oIefJtsLvD+ZGyNM2L29gVP4klJoHZuXcXX1mxZFLMKvSIB9nl0+KRoMhaPaqyInPu8Amlp1+fkQBwaHfaVJFCPbGzrf580t7flQEmtLBX8k+4eCs6g5sTCLXWaVotsTFKspKz0nb7B/f6WEIjDpkZ4Xcgzx9nQwPThoywZi+PfykZjoh4RvcQ== homiao@LCNC02F10MAMD6R"

	// 解析SSH格式公钥
	sshPubKey, _, _, _, err := ssh.ParseAuthorizedKey([]byte(key))
	if err != nil {
		fmt.Printf("解析SSH公钥失败: %v", err)
		return
	}
	// 转换为*rsa.PublicKey类型
	rsaPubKey, ok := sshPubKey.(ssh.CryptoPublicKey).CryptoPublicKey().(*rsa.PublicKey)
	if !ok {
		fmt.Printf("公钥不是RSA类型")
		return
	}

	// 验证JWT
	token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
		// 额外校验签名算法,避免算法切换攻击
		if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok {
			return nil, fmt.Errorf("unexpected signing method: %v", token.Header["alg"])
		}
		return rsaPubKey, nil
	})

	if err != nil {
		fmt.Printf("JWT验证失败: %v", err)
		return
	}
	if token.Valid {
		fmt.Println("JWT验证通过")
	}
}

替代库推荐

如果需要更简单的多格式密钥支持,可以选择github.com/lestrrat-go/jwx库,该库原生支持SSH格式公钥解析、JWT验证等能力,代码实现更简洁。

内容的提问来源于stack exchange,提问作者Hongbo Miao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 06:18:03