Здесь приведен модифицированный код org.apache.jmeter.protocol.oauth.sampler.PrivateKeyReader с использованием только времени выполнения Java. Он работает для меня, он может загружать файл закрытого ключа PKCS # 1 или PKCS # 8 и возвращает класс PrivateKey. (Пожалуйста, дайте мне знать, если я что-то испортил, копируя/вставляя).
Используйте его так:
PrivateKey pk = (новый PrivateKeyReader ( «/path/to/myfile.der» )). GetPrivateKey();
/**
*
*/
package default;
/****************************************************************************
* Copyright (c) 1998-2010 AOL Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Modified 23-4-2015 misterti
*
****************************************************************************/
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.security.GeneralSecurityException;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.spec.KeySpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.RSAPrivateCrtKeySpec;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.xml.bind.DatatypeConverter;
/**
* Class for reading RSA private key from PEM file. It uses
* the JMeter FileServer to find the file. So the file should
* be located in the same directory as the test plan if the
* path is relative.
*
* <p/>There is a cache so each file is only read once. If file
* is changed, it will not take effect until the program
* restarts.
*
* <p/>It can read PEM files with PKCS#8 or PKCS#1 encodings.
* It doesn't support encrypted PEM files.
*
*/
public class PrivateKeyReader {
// Private key file using PKCS #1 encoding
public static final String P1_BEGIN_MARKER
= "-----BEGIN RSA PRIVATE KEY"; //$NON-NLS-1$
public static final String P1_END_MARKER
= "-----END RSA PRIVATE KEY"; //$NON-NLS-1$
// Private key file using PKCS #8 encoding
public static final String P8_BEGIN_MARKER
= "-----BEGIN PRIVATE KEY"; //$NON-NLS-1$
public static final String P8_END_MARKER
= "-----END PRIVATE KEY"; //$NON-NLS-1$
private static Map<String, PrivateKey> keyCache =
Collections.synchronizedMap(new HashMap<String, PrivateKey>());
protected final String fileName;
/**
* Create a PEM private key file reader.
*
* @param fileName The name of the PEM file
*/
public PrivateKeyReader(String fileName) {
this.fileName = fileName;
}
/**
* Get a Private Key for the file.
*
* @return Private key
* @throws IOException
*/
public PrivateKey getPrivateKey() throws IOException, GeneralSecurityException
{
PrivateKey key = null;
FileInputStream fis = null;
boolean isRSAKey = false;
try {
File f = new File(fileName);
fis = new FileInputStream(f);
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
StringBuilder builder = new StringBuilder();
boolean inKey = false;
for (String line = br.readLine(); line != null; line = br.readLine()) {
if (!inKey) {
if (line.startsWith("-----BEGIN ") &&
line.endsWith(" PRIVATE KEY-----")) {
inKey = true;
isRSAKey = line.contains("RSA");
}
continue;
}
else {
if (line.startsWith("-----END ") &&
line.endsWith(" PRIVATE KEY-----")) {
inKey = false;
isRSAKey = line.contains("RSA");
break;
}
builder.append(line);
}
}
KeySpec keySpec = null;
byte[] encoded = DatatypeConverter.parseBase64Binary(builder.toString());
if (isRSAKey)
{
keySpec = getRSAKeySpec(encoded);
}
else
{
keySpec = new PKCS8EncodedKeySpec(encoded);
}
KeyFactory kf = KeyFactory.getInstance("RSA");
key = kf.generatePrivate(keySpec);
} finally {
if (fis != null)
try { fis.close(); } catch (Exception ign) {} }
return key;
}
/**
* Convert PKCS#1 encoded private key into RSAPrivateCrtKeySpec.
*
* <p/>The ASN.1 syntax for the private key with CRT is
*
* <pre>
* --
* -- Representation of RSA private key with information for the CRT algorithm.
* --
* RSAPrivateKey ::= SEQUENCE {
* version Version,
* modulus INTEGER, -- n
* publicExponent INTEGER, -- e
* privateExponent INTEGER, -- d
* prime1 INTEGER, -- p
* prime2 INTEGER, -- q
* exponent1 INTEGER, -- d mod (p-1)
* exponent2 INTEGER, -- d mod (q-1)
* coefficient INTEGER, -- (inverse of q) mod p
* otherPrimeInfos OtherPrimeInfos OPTIONAL
* }
* </pre>
*
* @param keyBytes PKCS#1 encoded key
* @return KeySpec
* @throws IOException
*/
private RSAPrivateCrtKeySpec getRSAKeySpec(byte[] keyBytes) throws IOException {
DerParser parser = new DerParser(keyBytes);
Asn1Object sequence = parser.read();
if (sequence.getType() != DerParser.SEQUENCE)
throw new IOException("Invalid DER: not a sequence"); //$NON-NLS-1$
// Parse inside the sequence
parser = sequence.getParser();
parser.read(); // Skip version
BigInteger modulus = parser.read().getInteger();
BigInteger publicExp = parser.read().getInteger();
BigInteger privateExp = parser.read().getInteger();
BigInteger prime1 = parser.read().getInteger();
BigInteger prime2 = parser.read().getInteger();
BigInteger exp1 = parser.read().getInteger();
BigInteger exp2 = parser.read().getInteger();
BigInteger crtCoef = parser.read().getInteger();
RSAPrivateCrtKeySpec keySpec = new RSAPrivateCrtKeySpec(
modulus, publicExp, privateExp, prime1, prime2,
exp1, exp2, crtCoef);
return keySpec;
}
}
/**
* A bare-minimum ASN.1 DER decoder, just having enough functions to
* decode PKCS#1 private keys. Especially, it doesn't handle explicitly
* tagged types with an outer tag.
*
* <p/>This parser can only handle one layer. To parse nested constructs,
* get a new parser for each layer using <code>Asn1Object.getParser()</code>.
*
* <p/>There are many DER decoders in JRE but using them will tie this
* program to a specific JCE/JVM.
*
* @author zhang
*
*/
class DerParser {
// Classes
public final static int UNIVERSAL = 0x00;
public final static int APPLICATION = 0x40;
public final static int CONTEXT = 0x80;
public final static int PRIVATE = 0xC0;
// Constructed Flag
public final static int CONSTRUCTED = 0x20;
// Tag and data types
public final static int ANY = 0x00;
public final static int BOOLEAN = 0x01;
public final static int INTEGER = 0x02;
public final static int BIT_STRING = 0x03;
public final static int OCTET_STRING = 0x04;
public final static int NULL = 0x05;
public final static int OBJECT_IDENTIFIER = 0x06;
public final static int REAL = 0x09;
public final static int ENUMERATED = 0x0a;
public final static int RELATIVE_OID = 0x0d;
public final static int SEQUENCE = 0x10;
public final static int SET = 0x11;
public final static int NUMERIC_STRING = 0x12;
public final static int PRINTABLE_STRING = 0x13;
public final static int T61_STRING = 0x14;
public final static int VIDEOTEX_STRING = 0x15;
public final static int IA5_STRING = 0x16;
public final static int GRAPHIC_STRING = 0x19;
public final static int ISO646_STRING = 0x1A;
public final static int GENERAL_STRING = 0x1B;
public final static int UTF8_STRING = 0x0C;
public final static int UNIVERSAL_STRING = 0x1C;
public final static int BMP_STRING = 0x1E;
public final static int UTC_TIME = 0x17;
public final static int GENERALIZED_TIME = 0x18;
protected InputStream in;
/**
* Create a new DER decoder from an input stream.
*
* @param in
* The DER encoded stream
*/
public DerParser(InputStream in) throws IOException {
this.in = in;
}
/**
* Create a new DER decoder from a byte array.
*
* @param The
* encoded bytes
* @throws IOException
*/
public DerParser(byte[] bytes) throws IOException {
this(new ByteArrayInputStream(bytes));
}
/**
* Read next object. If it constructed, the value holds
* encoded content and it should be parsed by a new
* parser from <code>Asn1Object.getParser</code>.
*
* @return A object
* @throws IOException
*/
public Asn1Object read() throws IOException {
int tag = in.read();
if (tag == -1)
throw new IOException("Invalid DER: stream too short, missing tag"); //$NON-NLS-1$
int length = getLength();
byte[] value = new byte[length];
int n = in.read(value);
if (n < length)
throw new IOException("Invalid DER: stream too short, missing value"); //$NON-NLS-1$
Asn1Object o = new Asn1Object(tag, length, value);
return o;
}
/**
* Decode the length of the field. Can only support length
* encoding up to 4 octets.
*
* <p/>In BER/DER encoding, length can be encoded in 2 forms,
* <ul>
* <li>Short form. One octet. Bit 8 has value "0" and bits 7-1
* give the length.
* <li>Long form. Two to 127 octets (only 4 is supported here).
* Bit 8 of first octet has value "1" and bits 7-1 give the
* number of additional length octets. Second and following
* octets give the length, base 256, most significant digit first.
* </ul>
* @return The length as integer
* @throws IOException
*/
private int getLength() throws IOException {
int i = in.read();
if (i == -1)
throw new IOException("Invalid DER: length missing"); //$NON-NLS-1$
// A single byte short length
if ((i & ~0x7F) == 0)
return i;
int num = i & 0x7F;
// We can't handle length longer than 4 bytes
if ( i >= 0xFF || num > 4)
throw new IOException("Invalid DER: length field too big (" //$NON-NLS-1$
+ i + ")"); //$NON-NLS-1$
byte[] bytes = new byte[num];
int n = in.read(bytes);
if (n < num)
throw new IOException("Invalid DER: length too short"); //$NON-NLS-1$
return new BigInteger(1, bytes).intValue();
}
}
/**
* An ASN.1 TLV. The object is not parsed. It can
* only handle integers and strings.
*
* @author zhang
*
*/
class Asn1Object {
protected final int type;
protected final int length;
protected final byte[] value;
protected final int tag;
/**
* Construct a ASN.1 TLV. The TLV could be either a
* constructed or primitive entity.
*
* <p/>The first byte in DER encoding is made of following fields,
* <pre>
*-------------------------------------------------
*|Bit 8|Bit 7|Bit 6|Bit 5|Bit 4|Bit 3|Bit 2|Bit 1|
*-------------------------------------------------
*| Class | CF | + Type |
*-------------------------------------------------
* </pre>
* <ul>
* <li>Class: Universal, Application, Context or Private
* <li>CF: Constructed flag. If 1, the field is constructed.
* <li>Type: This is actually called tag in ASN.1. It
* indicates data type (Integer, String) or a construct
* (sequence, choice, set).
* </ul>
*
* @param tag Tag or Identifier
* @param length Length of the field
* @param value Encoded octet string for the field.
*/
public Asn1Object(int tag, int length, byte[] value) {
this.tag = tag;
this.type = tag & 0x1F;
this.length = length;
this.value = value;
}
public int getType() {
return type;
}
public int getLength() {
return length;
}
public byte[] getValue() {
return value;
}
public boolean isConstructed() {
return (tag & DerParser.CONSTRUCTED) == DerParser.CONSTRUCTED;
}
/**
* For constructed field, return a parser for its content.
*
* @return A parser for the construct.
* @throws IOException
*/
public DerParser getParser() throws IOException {
if (!isConstructed())
throw new IOException("Invalid DER: can't parse primitive entity"); //$NON-NLS-1$
return new DerParser(value);
}
/**
* Get the value as integer
*
* @return BigInteger
* @throws IOException
*/
public BigInteger getInteger() throws IOException {
if (type != DerParser.INTEGER)
throw new IOException("Invalid DER: object is not integer"); //$NON-NLS-1$
return new BigInteger(value);
}
/**
* Get value as string. Most strings are treated
* as Latin-1.
*
* @return Java string
* @throws IOException
*/
public String getString() throws IOException {
String encoding;
switch (type) {
// Not all are Latin-1 but it the closest thing
case DerParser.NUMERIC_STRING:
case DerParser.PRINTABLE_STRING:
case DerParser.VIDEOTEX_STRING:
case DerParser.IA5_STRING:
case DerParser.GRAPHIC_STRING:
case DerParser.ISO646_STRING:
case DerParser.GENERAL_STRING:
encoding = "ISO-8859-1"; //$NON-NLS-1$
break;
case DerParser.BMP_STRING:
encoding = "UTF-16BE"; //$NON-NLS-1$
break;
case DerParser.UTF8_STRING:
encoding = "UTF-8"; //$NON-NLS-1$
break;
case DerParser.UNIVERSAL_STRING:
throw new IOException("Invalid DER: can't handle UCS-4 string"); //$NON-NLS-1$
default:
throw new IOException("Invalid DER: object is not a string"); //$NON-NLS-1$
}
return new String(value, encoding);
}
}
Номер ошибки: | Ошибка 4 | |
Название ошибки: | Java Error 4 | |
Описание ошибки: | Ошибка 4: Возникла ошибка в приложении Java. Приложение будет закрыто. Приносим извинения за неудобства. | |
Разработчик: | Oracle Corporation | |
Программное обеспечение: | Java | |
Относится к: | Windows XP, Vista, 7, 8, 10, 11 |
Анализ «Java Error 4»
Как правило, практикующие ПК и сотрудники службы поддержки знают «Java Error 4» как форму «ошибки во время выполнения». Разработчики программного обеспечения пытаются обеспечить, чтобы программное обеспечение было свободным от этих сбоев, пока оно не будет публично выпущено. К сожалению, многие ошибки могут быть пропущены, что приводит к проблемам, таким как те, с ошибкой 4.
Пользователи Java могут столкнуться с ошибкой 4, вызванной нормальным использованием приложения, которое также может читать как «Java Error 4». Таким образом, конечные пользователи предупреждают поставщиков о наличии ошибок 4 проблем, предоставляя информацию разработчику. Oracle Corporation может устранить обнаруженные проблемы, а затем загрузить измененный файл исходного кода, позволяя пользователям обновлять свою версию. Если есть уведомление об обновлении Java, это может быть решением для устранения таких проблем, как ошибка 4 и обнаруженные дополнительные проблемы.
Почему возникает ошибка времени выполнения 4?
Сбой во время запуска Java или во время выполнения, как правило, когда вы столкнетесь с «Java Error 4». Вот три наиболее заметные причины ошибки ошибки 4 во время выполнения происходят:
Ошибка 4 Crash — программа обнаружила ошибку 4 из-за указанной задачи и завершила работу программы. Если Java не может обработать данный ввод, или он не может получить требуемый вывод, это обычно происходит.
Утечка памяти «Java Error 4» — при утечке памяти Java это может привести к медленной работе устройства из-за нехватки системных ресурсов. Повреждение памяти и другие потенциальные ошибки в коде могут произойти, когда память обрабатывается неправильно.
Ошибка 4 Logic Error — логическая ошибка возникает, когда компьютер генерирует неправильный вывод, даже если пользователь предоставляет правильный ввод. Обычные причины этой проблемы связаны с ошибками в обработке данных.
Как правило, такие Oracle Corporation ошибки возникают из-за повреждённых или отсутствующих файлов Java Error 4, а иногда — в результате заражения вредоносным ПО в настоящем или прошлом, что оказало влияние на Java. Обычно, установка новой версии файла Oracle Corporation позволяет устранить проблему, из-за которой возникает ошибка. Запуск сканирования реестра после замены файла, из-за которого возникает проблема, позволит очистить все недействительные файлы Java Error 4, расширения файлов или другие ссылки на файлы, которые могли быть повреждены в результате заражения вредоносным ПО.
Ошибки Java Error 4
Усложнения Java с Java Error 4 состоят из:
- «Ошибка в приложении: Java Error 4»
- «Java Error 4 не является приложением Win32.»
- «Извините за неудобства — Java Error 4 имеет проблему. «
- «Файл Java Error 4 не найден.»
- «Java Error 4 не найден.»
- «Ошибка запуска программы: Java Error 4.»
- «Java Error 4 не выполняется. «
- «Java Error 4 остановлен. «
- «Java Error 4: путь приложения является ошибкой. «
Проблемы Java Java Error 4 возникают при установке, во время работы программного обеспечения, связанного с Java Error 4, во время завершения работы или запуска или менее вероятно во время обновления операционной системы. Выделение при возникновении ошибок Java Error 4 имеет первостепенное значение для поиска причины проблем Java и сообщения о них вOracle Corporation за помощью.
Эпицентры Java Error 4 Головные боли
Большинство проблем Java Error 4 связаны с отсутствующим или поврежденным Java Error 4, вирусной инфекцией или недействительными записями реестра Windows, связанными с Java.
Точнее, ошибки Java Error 4, созданные из:
- Поврежденные ключи реестра Windows, связанные с Java Error 4 / Java.
- Загрязненный вирусом и поврежденный Java Error 4.
- Вредоносное удаление (или ошибка) Java Error 4 другим приложением (не Java).
- Java Error 4 конфликтует с другой программой (общим файлом).
- Java (Java Error 4) поврежден во время загрузки или установки.
Продукт Solvusoft
Загрузка
WinThruster 2023 — Проверьте свой компьютер на наличие ошибок.
Совместима с Windows 2000, XP, Vista, 7, 8, 10 и 11
Установить необязательные продукты — WinThruster (Solvusoft) | Лицензия | Политика защиты личных сведений | Условия | Удаление
The «illegal start of expression» error is a compile-time error when the compiler finds an inappropriate statement in the code. The java compiler, javac, compile your source code from top to bottom, left to right and when it sees something inappropriate at the start of an expression, it throws an «illegal start of expression» error. The most common reason for this is a missing semi-colon. You might know that every statement in Java ends with a semicolon, but if you forget one, you won’t get an error that there is a missing semi-colon at the end of the statement because the compiler doesn’t know the end.
When the compiler checks the next statement it sees an illegal start because an earlier statement was not terminated. The bad part is that you can get tens of «illegal start of expression» errors by just omitting a single semi-colon or missing braces, as shown in the following example.
public class Main { public static void main(String[] args) { count(); public static int count() { return 0; } }
If you compile this program you will be greeted with several «illegal start of expression» error as shown below:
$ javac Main.java
Main.java:7: error: illegal start of expression
public static int count() {
^
Main.java:7: error: illegal start of expression
public static int count() {
^
Main.java:7: error: ‘;’ expected
public static int count() {
^
Main.java:7: error: ‘;’ expected
public static int count() {
^
Main.java:11: error: reached end of file while parsing
}
^
5 errors
And the only problem is missing curly braces in the main method, as soon as you add that missing closing curly brace in the main method the code will work fine and all these errors will go away, as shown below:
The error message is very interesting, if you look at the first one, you will find that error is in line 7 and the compiler complaining about a public keyword but the actual problem was in line 5 where a closing brace is missing.
From the compiler’s view, the public should not come there because it’s an invalid keyword inside a method in Java, remember without closing braces main() is still not closed, so the compiler thinks the public keyword is part of the main() method.
Though, when you compile the same program in Eclipse, you get a different error because its the compiler is slightly different than javac but the error message is more helpful as you can see below:
Exception in thread «main» java.lang.Error: Unresolved compilation problem:
Syntax error, insert «}» to complete MethodBody
at Main.main(Main.java:4)
In short, the «illegal start of expression» error means the compiler find something inappropriate, against the rules of Java programming but the error message is not very helpful. For «illegal start of expression» errors, try looking at the lines preceding the error for a missing ‘)’ or ‘}’ or missing semicolon.
Also remember, a single syntax error somewhere can cause multiple «illegal start of expression» errors. Once you fix the root cause, all errors will go away. This means always recompile once you fix an error, don’t try to make multiple changes without compilation.
Other Java troubleshooting guides you may like:
- How to fix «variable might not have been initialized» error in Java? (solution)
- Could not create the Java virtual machine Invalid maximum heap size: -Xmx (solution)
- How to fix class, enum, or interface expected error in Java? (solution)
- How to fix java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory (solution)
- Caused By: java.lang.NoClassDefFoundError: org/apache/log4j/Logger in Java (solution)
- Error: could not open ‘C:\Java\jre8\lib\amd64\jvm.cfg’ (solution)
- java.lang.OutOfMemoryError: Java heap space : Cause and Solution (steps)
- How to avoid ConcurrentModificationException while looping over List in Java? (solution)
I have been trying to create a basic app for a quiz as part of my research, but I am running into trouble with the buffered reader. I have searched everywhere for info on the errors and the actual bufferedreader method, but can’t find a thing. Here is my method so far, and the errors are:
unreported exception java.io.IOException; must be caught or declared
to be thrown
and the other one is
missing return statement.
public String showMathsNotes() throws IOException{
BufferedReader br = new BufferedReader(new FileReader("ReligionNotes.txt"));
String note = br.readLine();
}
The first error comes from another method which is calling this one. Here is an extract from it:
switch(choice2){
case 1: System.out.println(showMathsNotes());break;
case 2: System.out.println(showEnglishNotes());break;
case 3: System.out.println(showReligionNotes());break;
default: System.out.println("Invalid Entry");break;
*************************EDITED***************************
I am now receiving the error
unreported exception java.io.IOException; must be caught or declared to be thrown
I have arranged the code to this now:
public void showMathsNotes()throws IOException{
try{
BufferedReader br = new BufferedReader(new FileReader("MathsNotes.txt"));
String note = br.readLine();
}catch(IOException e){
e.printStackTrace();
}
}
Unable to understand why the program is not running. Please have a look.
package com.codegym.task.task06.task0610;
import java.io.BufferedReader;
import java.io.InputStreamReader;
/*
ConsoleReader class
*/
public class ConsoleReader {
public static String readString() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String name = br.readLine();
return name;
}
public static int readInt() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int a = Integer.parseInt(br.readLine());
return a;
}
public static double readDouble() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
double a = Double.parseDouble(br.readLine());
return a;
}
public static boolean readBoolean() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String a = br.readLine();
if (a==»true»){
return true;
}
else if (a==»false»){
return false;
}
return false;
}
public static void main(String[] args) {
}
}
This website uses cookies to provide you with personalized service. By using this website, you agree to our use of cookies. If you require more details, please read our Terms and Policy.