2014-11-07 3 views
1

Я реализовал библиотеку генераторов токенов JWT от Here, и я могу получить токен RS256 (полезная нагрузка). Но у меня проблема с данными заголовка: Мне нужно одно значение заголовка «x5t», которое не генерируется из данной библиотеки. мне нужны данные заголовка, как:Как подписать сертификат X.509 с RS256 в PHP? Не удалось получить Valid fingerprint ... 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.

Спасибо, что посмотрели мой вопрос. Любые предложения приветствуются.

+1

приятный. Я сталкиваюсь с тем же вопросом с 2-х дней. –

ответ

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), "+/", "-_"), '='); 
+0

Спасибо очень много ... Я использую версию PHP 5.4.30. Итак, вам нужно обновить его, чтобы попробовать ваше решение ... Позвольте мне попробовать. –

+0

Вам не нужно обновлять!Я дал вам функцию для более старых версий PHP. –

+0

Спасибо - это работает для меня! –

0

system выводит свой результат напрямую, если только вы не используете дополнительный второй параметр, который помещает результат в переменную.

Так используйте

system('openssl x509 -noout -in my.pem -fingerprint', $sha1); 
$fingerprint = str_replace("SHA1 Fingerprint=", '', $sha1); 

http://php.net/manual/en/function.system.php

+0

Спасибо за ответ: Я использую эту технику из http://stackoverflow.com/questions/6426927/php-ssl-certificate-fingerprint –

+0

Моя проблема заключается в том, как сгенерировать параметр x5t? –

+0

Я подозреваю, что второй ответ в этой связи будет работать лучше – rjdown

0

openssl_x509_fingerprint (который упоминается Флоран Морселли) возвращает SHA1 хэш в DER кодирования серт. например.

<?php 
$cert = '...'; 

echo openssl_x509_fingerprint($cert); 
echo "\r\n<br />\r\n"; 
echo sha1(base64_decode(preg_replace('#-.*-|\r|\n#', '', $cert))); 

Они выводят то же самое. По крайней мере, с этой 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 или более ранней версии вы можете использовать альтернативный метод.

Смежные вопросы