
使用 lombucci/jwt 时若误将 HMAC 密钥与 RSA 签名器混用,会触发 error:0909006C:PEM routines:get_name:no start line 错误;根本原因是 RSA 签名器强制要求 PEM 格式密钥(含 -----BEGIN RSA PRIVATE KEY----- 等起始行),而对称密钥(如 Metabase 所需的十六进制字符串)必须搭配 HMAC 签名器。
使用 lombucci/jwt 时若误将 hmac 密钥与 rsa 签名器混用,会触发 `error:0909006c:pem routines:get_name:no start line` 错误;根本原因是 rsa 签名器强制要求 pem 格式密钥(含 `-----begin rsa private key-----` 等起始行),而对称密钥(如 metabase 所需的十六进制字符串)必须搭配 hmac 签名器。
该错误典型出现在 Metabase 嵌入式令牌生成场景中:开发者常误以为 Sha256 签名器是通用的,但实际上 Lcobucci\JWT\Signer\Rsa\Sha256 和 Lcobucci\JWT\Signer\Hmac\Sha256 是完全不同的签名器类,分别对应非对称(RSA)和对称(HMAC)密钥体系。
Metabase 官方文档明确要求使用 HMAC-SHA256 算法进行令牌签名,其 secret-key 是一个纯文本密钥(如十六进制字符串或任意 ASCII 字符串),不涉及 PEM 文件或私钥格式。因此,必须选用 Hmac\Sha256 签名器,并配合 InMemory::plainText() 加载密钥。
✅ 正确用法如下(已修正原始代码):
<?php namespace Domain\MetaBase;
use Lcobucci\JWT\Configuration;
use Lcobucci\JWT\Signer\Key\InMemory;
use Lcobucci\JWT\Signer\Hmac\Sha256; // ← 关键修正:改用 Hmac 而非 Rsa
class Metabase
{
public function generateToken(): string
{
$metabaseSiteUrl = "https://potato.metabaseapp.com";
$metabaseSecretKey = "1690e6bf587bc61b5cdd3897c143291caa48779cc7abef104abf952fec6e8d4a";
$now = new \DateTimeImmutable();
// 使用 Hmac\Sha256 + plainText 密钥
$config = Configuration::forSymmetricSigner(
new Sha256(),
InMemory::plainText($metabaseSecretKey)
);
$token = $config->builder()
->issuedBy($metabaseSiteUrl)
->withHeader('iss', $metabaseSiteUrl)
->permittedFor($metabaseSiteUrl)
->issuedAt($now)
->canOnlyBeUsedAfter($now->modify('+1 minute'))
->expiresAt($now->modify('+1 hour'))
->withClaim('resource', ['question' => 15])
->withClaim('params', ['cod_usuario' => 1001])
->getToken($config->signer(), $config->signingKey());
return $metabaseSiteUrl . "/embed/question/" . $token->toString() . "#bordered=true&titled=true";
}
}
⚠️ 注意事项:
-
切勿将
Rsa\Sha256与InMemory::plainText()混用:RSA 签名器期望 PEM 格式密钥(如InMemory::file('/path/to/private.key')或InMemory::base64Encoded(...)),否则 OpenSSL 解析失败并抛出no start line。 - 密钥安全性:Metabase 的 secret key 属于敏感凭据,应从环境变量或安全配置中心加载,禁止硬编码在源码中。
-
版本兼容性:lombucci/jwt v4.x 中
Configuration::forSymmetricSigner()明确约束为 HMAC 场景;若需 RSA,则须调用Configuration::forAsymmetricSigner()并提供 PEM 密钥对。
总结:该错误本质是签名算法与密钥类型不匹配所致。牢记——对称密钥 → HMAC 签名器;非对称密钥 → RSA/ECDSA 签名器。一次正确的命名空间导入(Hmac\Sha256)即可彻底解决此解析异常。










