我已经从Here实现了JWT令牌生成器库,并且我能够获得RS256令牌(Payload)。 但是我遇到了Header数据的问题: 我需要一个标题值" x5t",这不是从给定的库生成的。 我需要标头数据,如:
{
"typ": "JWT",
"alg": "RS256",
"x5t": "COm8ON2SD2MTc5jwcxZ0vE3-XJo"
}
我成功获得前两个参数,但无法获得有效的第三个参数。
我的示例代码是:
$fingerprint = str_replace("SHA1 Fingerprint=", '', system('openssl x509 -noout -in my.pem -fingerprint'));
$fingerprint = sha1($fingerprint);
$fingerprint = base64_encode($fingerprint);
$fingerprint = rtrim(strtr($fingerprint, "+/", "-_"), '=');
生成有效" x5t"参数.NET中已经有代码,需要用PHP转换。
感谢您收看我的问题。 任何建议都欢迎。
答案 0 :(得分:1)
如果你有PHP 5.6,你可以使用以下函数openssl_x509_fingerprint
:
$cert = openssl_x509_read($certificate);
$sha1_hash = openssl_x509_fingerprint($cert); // sha1 hash (x5t parameter)
$sha256_hash = openssl_x509_fingerprint($cert, 'sha256'); // sha256 hash (x5t#256 parameter)
如果您没有PHP 5.6,则可以使用证书文件的内容自己生成此指纹(以BEGIN CERTIFICATE
开头,以END CERTIFICATE
结尾):
function sha1_thumbprint($file_content)
{
$file_content = preg_replace('#-.*-|\r|\n#', '', $file_content);
$bin = base64_decode($file_content);
return hash('sha1', $bin);
}
不要忘记在Base64 Url中编码安全结果。
$encoded_fingerprint = rtrim(strtr(base64_encode($fingerprint), "+/", "-_"), '=');
答案 1 :(得分:0)
system
直接输出结果,除非你使用可选的第二个参数,它将结果放入变量中。
所以使用
system('openssl x509 -noout -in my.pem -fingerprint', $sha1);
$fingerprint = str_replace("SHA1 Fingerprint=", '', $sha1);
答案 2 :(得分:0)
openssl_x509_fingerprint
(Florent Morselli提到)返回cert的DER编码的sha1哈希值。例如
<?php
$cert = '...';
echo openssl_x509_fingerprint($cert);
echo "\r\n<br />\r\n";
echo sha1(base64_decode(preg_replace('#-.*-|\r|\n#', '', $cert)));
他们输出相同的东西。至少有这个证书:
-----BEGIN CERTIFICATE-----
MIIDITCCAoqgAwIBAgIQT52W2WawmStUwpV8tBV9TTANBgkqhkiG9w0BAQUFADBM
MQswCQYDVQQGEwJaQTElMCMGA1UEChMcVGhhd3RlIENvbnN1bHRpbmcgKFB0eSkg
THRkLjEWMBQGA1UEAxMNVGhhd3RlIFNHQyBDQTAeFw0xMTEwMjYwMDAwMDBaFw0x
MzA5MzAyMzU5NTlaMGgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlh
MRYwFAYDVQQHFA1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKFApHb29nbGUgSW5jMRcw
FQYDVQQDFA53d3cuZ29vZ2xlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkC
gYEA3rcmQ6aZhc04pxUJuc8PycNVjIjujI0oJyRLKl6g2Bb6YRhLz21ggNM1QDJy
wI8S2OVOj7my9tkVXlqGMaO6hqpryNlxjMzNJxMenUJdOPanrO/6YvMYgdQkRn8B
d3zGKokUmbuYOR2oGfs5AER9G5RqeC1prcB6LPrQ2iASmNMCAwEAAaOB5zCB5DAM
BgNVHRMBAf8EAjAAMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwudGhhd3Rl
LmNvbS9UaGF3dGVTR0NDQS5jcmwwKAYDVR0lBCEwHwYIKwYBBQUHAwEGCCsGAQUF
BwMCBglghkgBhvhCBAEwcgYIKwYBBQUHAQEEZjBkMCIGCCsGAQUFBzABhhZodHRw
Oi8vb2NzcC50aGF3dGUuY29tMD4GCCsGAQUFBzAChjJodHRwOi8vd3d3LnRoYXd0
ZS5jb20vcmVwb3NpdG9yeS9UaGF3dGVfU0dDX0NBLmNydDANBgkqhkiG9w0BAQUF
AAOBgQAhrNWuyjSJWsKrUtKyNGadeqvu5nzVfsJcKLt0AMkQH0IT/GmKHiSgAgDp
ulvKGQSy068Bsn5fFNum21K5mvMSf3yinDtvmX3qUA12IxL/92ZzKbeVCq3Yi7Le
IOkKcGQRCMha8X2e7GmlpdWC1ycenlbN0nbVeSv3JUMcafC4+Q==
-----END CERTIFICATE-----
openssl_x509_fingerprint
仅适用于PHP 5.6,因此,如果您使用的是PHP 5.5或更早版本,则可以使用替代方法。