这是一个在线工具,可将 JWK 转换为 PEM,反之亦然。
我希望在 C++ 代码中也一样。
对于 JWK:
{
"kty":"RSA",
"e":"AQAB",
"kid":"18b4f6a6-f9ec-456b-a3e8-04af5e97790e",
"n":"tVKUtcx_n9rt5afY_2WFNvU6PlFMggCatsZ3l4RjKxH0jgdLq6CScb0P3ZGXYbPzXvmmLiWZizpb-h0qup5jznOvOr-Dhw9908584BSgC83YacjWNqEK3urxhyE2jWjwRm2N95WGgb5mzE5XmZIvkvyXnn7X8dvgFPF5QwIngGsDG8LyHuJWlaDhr_EPLMW4wHvH0zZCuRMARIJmmqiMy3VD4ftq4nS5s8vJL0pVSrkuNojtokp84AtkADCDU_BUhrc2sIgfnvZ03koCQRoZmWiHu86SuJZYkDFstVTVSR0hiXudFlfQ2rOhPlpObmku68lXw-7V-P7jwrQRFfQVXw"
}
在线工具为 PEM 提供:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtVKUtcx/n9rt5afY/2WF
NvU6PlFMggCatsZ3l4RjKxH0jgdLq6CScb0P3ZGXYbPzXvmmLiWZizpb+h0qup5j
znOvOr+Dhw9908584BSgC83YacjWNqEK3urxhyE2jWjwRm2N95WGgb5mzE5XmZIv
kvyXnn7X8dvgFPF5QwIngGsDG8LyHuJWlaDhr/EPLMW4wHvH0zZCuRMARIJmmqiM
y3VD4ftq4nS5s8vJL0pVSrkuNojtokp84AtkADCDU/BUhrc2sIgfnvZ03koCQRoZ
mWiHu86SuJZYkDFstVTVSR0hiXudFlfQ2rOhPlpObmku68lXw+7V+P7jwrQRFfQV
XwIDAQAB
-----END PUBLIC KEY-----
反之亦然。因此,kty
andkid
字段也以某种方式包含在 PEM 中。
我试过这样的 OpenSSL:
std::string_view nnInBase64Url = "tVKUtcx_n9rt5afY_2WFNvU6PlFMggCatsZ3l4RjKxH0jgdLq6CScb0P3ZGXYbPzXvmmLiWZizpb-h0qup5jznOvOr-Dhw9908584BSgC83YacjWNqEK3urxhyE2jWjwRm2N95WGgb5mzE5XmZIvkvyXnn7X8dvgFPF5QwIngGsDG8LyHuJWlaDhr_EPLMW4wHvH0zZCuRMARIJmmqiMy3VD4ftq4nS5s8vJL0pVSrkuNojtokp84AtkADCDU_BUhrc2sIgfnvZ03koCQRoZmWiHu86SuJZYkDFstVTVSR0hiXudFlfQ2rOhPlpObmku68lXw-7V-P7jwrQRFfQVXw";
std::string_view eeInBase64Url = "AQAB";
auto nnBin = cppcodec::base64_url_unpadded::decode(nnInBase64Url);
auto eeBin = cppcodec::base64_url_unpadded::decode(eeInBase64Url);
BIGNUM* modul = BN_bin2bn(nnBin.data(),nnBin.size(),NULL);
BIGNUM* expon = BN_bin2bn(eeBin.data(),eeBin.size(),NULL);
RSA* rr = RSA_new();
RSA_set0_key(rr, modul, expon, NULL);
BIO* ff = BIO_new_file("public.pem","w+");
PEM_write_bio_RSAPublicKey(ff, rr);
但它给了我一个不同的 PEM,这应该很明显,至少我没有指定kid
.
最后,问题是:如何使用 OpenSSL 或其他 C++ lib 实现正确的转换,因此它还将考虑kid
和kty
字段并使用与在线工具提供的相同 PEM 的结果?