0

他们所有的示例都使用 HS*** 而 RS*** 中没有,并且尝试将示例更改为套件似乎不起作用。

我的问题似乎是加载私钥以进行签名。我在字符串中使用 PEM,设置声明,使用这个

Procedure RunTest2b;
var
  LToken: TJWT;
  LSigner: TJWS;
  LKey: TJWK;
  LAlg: TJOSEAlgorithmId;
  s: String;
begin
  LToken := TJWT.Create;
  try
    LToken.Claims.Subject := 'Paolo Rossi';
    LToken.Claims.Issuer := 'Delphi JOSE Library';
    LToken.Claims.IssuedAt := Now;
    LToken.Claims.Expiration := Now + 1;
    // Signing algorithm
    LAlg := TJOSEAlgorithmId.RS256;
    LSigner := TJWS.Create(LToken);
    LKey := TJWK.Create(gPrivateKey);
    try
      // With this option you can have keys < algorithm length
      LSigner.SkipKeyValidation := True;
      LSigner.Sign(LKey, LAlg);
      s := 'Header: ' + LSigner.Header + #13#10 +
           'Payload: ' + LSigner.Payload + #13#10 +
           'Signature: ' + LSigner.Signature + #13#10 +
           'Compact Token: ' + LSigner.CompactToken;
      if s = '' then;
    finally
      LKey.Free;
      LSigner.Free;
    end;
  finally
    LToken.Free;
  end;
end;

这在签名方法中失败,说“无法加载私钥:”和一堆奇怪的字符,这使得看起来我应该有一个 ansistring 时可能有一个宽字符串,但改变它似乎没有帮助。

我还尝试使用 TBase64.Decode 和 TBase64.UrlDecode 在将密钥传递给 sign 方法之前对其进行转换,但没有成功。

谁能看到我在哪里犯了错误?

4

1 回答 1

1

我最近跳了几圈,用 JOSE 做一些 JWT 测试。我没有签署任何东西,但确实必须使用 PEM 来验证使用 RS 的 JWT。这样做时,我犯了一个错误,即在不保留换行符的情况下将 PEM 字符串连接成一行字符。我想知道你的钥匙是否也犯了同样的错误?

i.e. bad PEM format
myPem := '-----BEGIN PUBLIC KEY-----'
+ 'A23BBjhasdfbewisudvnacwerf823rdsvcp2'
+ 'bDenDfsub893rghvsaefawerd'
+ '-----END PUBLIC KEY-----';

i.e. good PEM format
myPem := '-----BEGIN PUBLIC KEY-----'
+ #13#10 + 'A23BBjhasdfbewisudvnacwerf823rdsvcp2'
+ #13#10 + 'bDenDfsub893rghvsaefawerd'
+ #13#10 + '-----END PUBLIC KEY-----';
于 2021-01-27T20:15:29.450 回答