2015-12-04 5 views
1

Новое в использовании jose4j. Я нашел примеры, как это установить секретный ключ от CERT:Подпишите JWT с сертификатом SHA, используя jose4j

JsonWebSignature jws = new JsonWebSignature(); 
PKCS8EncodedKeySpec spec = 
new PKCS8EncodedKeySpec(keyBytes); 
KeyFactory kf = KeyFactory.getInstance("RSA"); 
PrivateKey pk = kf.generatePrivate(spec); 
jws.setKey(kf.generatePrivate(spec)); 

Но я получаю сообщение об ошибке

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: invalid key format  

Я думаю, что это происходит потому, что сертификат был создан как SHA256 вместо RSA. Вот как мне сказали, что сертификат был создан:

openssl req -x509 -sha256 -nodes -days 730 -newkey rsa:2048 -keyout private.key -out certificate_pub.crt 

Кто-нибудь есть примеры того, как я мог бы подписать JWT с SHA256 серт?

+0

* сертификат * подписан с SHA256 * и * RSA, но * закрытый ключ *, который вы используете для подписания, не использует никакой хэш и является только RSA. (Если это было * зашифровано *, PBE будет включать некоторое хеширование, но это не выбирается.) Для последних версий (1.0.0 и выше) большинство операций командной строки 'openssl', включая этот, записывают privatekey в формате PKCS # 8 в PEM , Является первой строкой файла * читаемых символов * '----- НАЧАТЬ ЧАСТНЫЙ КЛЮЧ -----'? Вы (или кто-нибудь) ** использовали 1.0.0+ и ** вы ** конвертировали PEM в двоичный ** перед тем, как поместить его в 'PKCS8EncodedKeySpec'? –

+0

Файл cert читается и начинается с ----- BEGIN RSA PRIVATE KEY -----.... Я также попытался удалить это и ----- END RSA из файла и запустить, но он не Помогите. Ниже приведен код, который я использовал для чтения файла закрытого ключа: String filename = "C: \\ private.key"; \t Файл f = новый Файл (имя файла); \t FileInputStream fis = new FileInputStream (f); \t DataInputStream dis = new DataInputStream (fis); \t байт [] keyBytes = новый байт [(int) f.length()]; \t dis.readFully (keyBytes); – Chris

ответ

2

С дополнительной информацией, что секретный ключ файл PEM, но НЕ PKCS # 8, как современная версия OpenSSL должны быть созданы для req -newkey. И разница между PEM и «DER» (двоичным), который требуется стандартным Java, - это не просто удаление (и добавление) линий BEGIN и END.

Ваше простое решение, если OpenSSL доступен для преобразования как из них, без шифрования:

openssl pkcs8 -topk8 -nocrypt -outform der -in private.pem -out good.der 

Тогда читайте good.der (лучше использовать имя, если вы хотите) в виде байтов, и положить, что в PKCS8EncodedKeySpec и используйте его, как вы разместили. Кроме того, вам не нужно возиться с DataInputStream, который на самом деле не предназначен для «простых старых» байтов; java.nio.file.Files.readAllBytes может открывать, выделять и читать для вас.

Следующая сложная альтернатива - преобразовать в PKCS # 8, но все же PEM: то же самое, что и о -outform der (и использовать имя файла, которое указывает PEM, чтобы избежать путаницы). Тогда в Java чтения что файл в качестве символовReader, обычно BufferedReader, не Stream), выбросьте BEGIN и END линии, сцепить все линии между ними, и преобразовывают их из base64 в byte[]: в Java8 у вас есть java.util.Base64, перед тем вы можете использовать javax.xml.bind.DatatypeConverter.

Для чтения файла, который у вас есть в стандартной Java, сложнее. Вы можете прочитать PKCS # 1 с PEM-бронированием и преобразовать в двоичный PKCS # 1, а затем «обернуть» PKCS # 1 в PKCS # 8, создав кодировку DER, но это немного сложнее, чем то, что вы продемонстрировали знакомство с. Или вы могли бы проанализировать PKCS № 1 и использовать компоненты для создания собственной реализации RSAPrivateCrtKey и использовать это напрямую (без фабрики), то же самое.

Другой альтернативой является использование сторонней библиотеки от http://www.BouncyCastle.org, которая имеет более гибкие функции для обработки файлов PEM, чем стандартная Java. Но вам нужно изучить их API, а также стандартный, и если ваша программа будет работать в другом месте, вам необходимо обеспечить, чтобы BC был развернут с или как часть вашей программы.