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