Java 使用JWTSigner.sign()生成的令牌在jwt.io调试器中表示签名无效

Java 使用JWTSigner.sign()生成的令牌在jwt.io调试器中表示签名无效,java,jwt,Java,Jwt,我们已经使用编写了小型API。当我创建一个令牌并用Java代码验证该令牌时,它可以正常工作 创建了RSA私钥和公钥。参考其中一个测试用例 使用Algorithm.RS256和私钥创建令牌。 验证了相同的令牌并获得了预期的输出。 然后向客户机提供公钥,我们开始使用生成的令牌调用他们的REST服务。客户端使用验证令牌。他们回来说令牌和公钥在jwt.io调试器中提供了无效签名。他们要求首先让它在jwt.io调试器中工作。我不明白当它在Java代码中使用相同的公共代码时,为什么在jwt.io中会这样说。

我们已经使用编写了小型API。当我创建一个令牌并用Java代码验证该令牌时,它可以正常工作

创建了RSA私钥和公钥。参考其中一个测试用例 使用Algorithm.RS256和私钥创建令牌。 验证了相同的令牌并获得了预期的输出。 然后向客户机提供公钥,我们开始使用生成的令牌调用他们的REST服务。客户端使用验证令牌。他们回来说令牌和公钥在jwt.io调试器中提供了无效签名。他们要求首先让它在jwt.io调试器中工作。我不明白当它在Java代码中使用相同的公共代码时,为什么在jwt.io中会这样说。我错过什么了吗

生成密钥 创建令牌 已创建令牌输出

iccid:4454788545885968585##
nonce:5e452610c9f9decd:-404fb717:157fd6fc54e:-7ffe##
timestamp:2016-10-25T16:16:36.036Z
2.2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 UULAWVQN3ECK5BKIOO2cy4ihb8OOISkzF1Cf-Udx1GB-BVY4C4JTIVGPMFW4HS9ZPWZKZ26QLVA7Y9KMEVW24TVW24TVYNY8AVNYC55MS\u Ab7YWQ-MerrintCDIQG7YVSN2AP\SSNMAB687GKNQH78IBOWUDPLBGRU4N5EHZYG2LG-u-oL594fRA2anr-JunSxtpkI8-tKzR9NG5dt4F79Q

验证令牌输出

iccid:4454788545885968585##
nonce:5e452610c9f9decd:-404fb717:157fd6fc54e:-7ffe##
timestamp:2016-10-25T16:16:36.036Z
公钥

-----BEGIN RSA PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx58WGD/wRFnwe64sl/9V
KuNOQChYUy8GfhQU66M2XSnx/UpjPCqhGYRmpUXT+rQAamUDsarGt8Kbw1DtlvLT
p2UTvSWiCJNQzi53CRa6iDbk213Ps7zuAFhuXB7s0ZqdOZbeJnXFFM/wMJbM6kdB
yAdCwj8/kCKCjSt3Q0CLdxaToTucRJuO7/V4wbJIDMfLt3LPlry/PsHQAx0RKXco
TO1JsSGWg99dHBEqpxLMBtZyhyd8++PrMrtQ4pPVAmXoJODKY2NZkiLl3h4Ai48z
FhBNHsWQDTJKA8skb2JQER9i1a1/ip/cgkR6FG6G65DbhrMElcL0mgdst49PF26p
pwIDAQAB
-----END RSA PUBLIC KEY-----
似乎需要一个公钥文件PKCS8:

-----BEGIN PUBLIC KEY-----
BASE64 DATA
-----END PUBLIC KEY-----
您传递的不是RSA公钥文件PKCS1:

-----BEGIN RSA PUBLIC KEY-----
BASE64 DATA
-----END RSA PUBLIC KEY-----

有趣的是,如果您手动编辑文件,用公钥标记替换RSA公钥标记,那么您将得到一个经过验证的签名。这很奇怪,因为BASE64数据的格式会有所不同,但是,我没有深入研究细节,以找出是否有任何罪魁祸首,所以不要问我为什么,但这会起作用。

通过包含一些代码片段,您可能会得到更好的答案。您是如何生成令牌的?同样在本例中,如果您可以提供一个验证失败的示例令牌,那么它将非常有用。没问题,欢迎使用。如果您对答案感到满意,作者会将其视为一种感谢,您可以省去几次按键……:
-----BEGIN RSA PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx58WGD/wRFnwe64sl/9V
KuNOQChYUy8GfhQU66M2XSnx/UpjPCqhGYRmpUXT+rQAamUDsarGt8Kbw1DtlvLT
p2UTvSWiCJNQzi53CRa6iDbk213Ps7zuAFhuXB7s0ZqdOZbeJnXFFM/wMJbM6kdB
yAdCwj8/kCKCjSt3Q0CLdxaToTucRJuO7/V4wbJIDMfLt3LPlry/PsHQAx0RKXco
TO1JsSGWg99dHBEqpxLMBtZyhyd8++PrMrtQ4pPVAmXoJODKY2NZkiLl3h4Ai48z
FhBNHsWQDTJKA8skb2JQER9i1a1/ip/cgkR6FG6G65DbhrMElcL0mgdst49PF26p
pwIDAQAB
-----END RSA PUBLIC KEY-----
-----BEGIN PUBLIC KEY-----
BASE64 DATA
-----END PUBLIC KEY-----
-----BEGIN RSA PUBLIC KEY-----
BASE64 DATA
-----END RSA PUBLIC KEY-----