Сгенерируйте пару ключей ГОСТ 34.10-2001 и сохраните ее в каком-нибудь хранилище ключей.

В настоящее время мне нужно сгенерировать пару ключей для алгоритма подписи ГОСТ 34.10-2001. Было приятно обнаружить, что провайдер надувных замков поддерживает этот алгоритм, но я не могу сгенерировать пару ключей и сохранить ее в любом хранилище ключей любого типа. В настоящее время я пробовал эту команду (эта команда отлично работает, если keyalg равно DSA, а sigalg равно SHA1withDSA):

keytool -genkey -alias test1 -keyalg ECGOST3410 -keysize 512  -sigalg GOST3411withECGOST3410 \
-keypass test_1 -validity 1000 -storetype JKS -keystore test1.jks -storepass test_1 -v \
-provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "bcprov-jdk16-1.46.jar"

Но у меня ошибка:

keytool error: java.lang.IllegalArgumentException: unknown key size.
java.lang.IllegalArgumentException: unknown key size.
        at sun.security.x509.CertAndKeyGen.generate(CertAndKeyGen.java:134)
        at sun.security.tools.KeyTool.doGenKeyPair(KeyTool.java:1156)
        at sun.security.tools.KeyTool.doCommands(KeyTool.java:786)
        at sun.security.tools.KeyTool.run(KeyTool.java:172)
        at sun.security.tools.KeyTool.main(KeyTool.java:166)

Точно такую ​​же ошибку я вижу, когда пытаюсь изменить размер ключа или удалить параметр keysize из команды. Но есть какой-то особый случай. Когда я устанавливаю keysize в 256, у меня появляется другая ошибка:

keytool error: java.lang.IllegalArgumentException: key size not configurable.
java.lang.IllegalArgumentException: key size not configurable.
        at sun.security.x509.CertAndKeyGen.generate(CertAndKeyGen.java:134)
        at sun.security.tools.KeyTool.doGenKeyPair(KeyTool.java:1156)
        at sun.security.tools.KeyTool.doCommands(KeyTool.java:786)
        at sun.security.tools.KeyTool.run(KeyTool.java:172)
        at sun.security.tools.KeyTool.main(KeyTool.java:166)

В настоящее время я понятия не имею, как сгенерировать пару ключей и как сохранить ее в хранилище ключей. Также у меня есть код Java, который может генерировать пару ключей для алгоритма ГОСТ 34.10-2001:

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

KeyPairGenerator kpg = KeyPairGenerator.getInstance("ECGOST3410", "BC");
kpg.initialize(new ECGenParameterSpec("GostR3410-2001-CryptoPro-A"));

KeyPair kp = kpg.generateKeyPair();

В этом примере кода используется класс ECGenParameterSpec для инициализации генератора пары ключей, поэтому, может быть, мне следует каким-то образом передать его в keytool (-providerArg provider_arg или -Jjavaoption)?

P.S. Я думаю, что я должен указать имя кривой в качестве некоторого параметра, но я не могу определить, какой параметр я должен использовать.


person gkuzmin    schedule 29.01.2013    source источник


Ответы (1)


Вы не сможете использовать keytool и BC для создания хранилища ключей с ключами ГОСТ3410.

sun.security.x509.CertAndKeyGen, используемый keytool, не дает возможности инициализировать генератор ключей с параметрами, а генератор ключей BC GOST3410 требует инициализации с помощью ECParameterSpec.

Вы можете создать пару ключей+сертификат и поместить их в хранилище ключей программно:

Security.addProvider( new org.bouncycastle.jce.provider.BouncyCastleProvider() );

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance( "ECGOST3410", "BC" );
keyPairGenerator.initialize( new ECGenParameterSpec( "GostR3410-2001-CryptoPro-A" ) );
KeyPair keyPair = keyPairGenerator.generateKeyPair();

org.bouncycastle.asn1.x500.X500Name subject = new org.bouncycastle.asn1.x500.X500Name( "CN=Me" );
org.bouncycastle.asn1.x500.X500Name issuer = subject; // self-signed
BigInteger serial = BigInteger.ONE; // serial number for self-signed does not matter a lot
Date notBefore = new Date();
Date notAfter = new Date( notBefore.getTime() + TimeUnit.DAYS.toMillis( 365 ) );

org.bouncycastle.cert.X509v3CertificateBuilder certificateBuilder = new org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder(
        issuer, serial,
        notBefore, notAfter,
        subject, keyPair.getPublic()
);
org.bouncycastle.cert.X509CertificateHolder certificateHolder = certificateBuilder.build(
        new org.bouncycastle.operator.jcajce.JcaContentSignerBuilder( "GOST3411withECGOST3410" )
                .build( keyPair.getPrivate() )
);
org.bouncycastle.cert.jcajce.JcaX509CertificateConverter certificateConverter = new org.bouncycastle.cert.jcajce.JcaX509CertificateConverter();
X509Certificate certificate = certificateConverter.getCertificate( certificateHolder );

KeyStore keyStore = KeyStore.getInstance( "JKS" );
keyStore.load( null, null ); // initialize new keystore
keyStore.setEntry(
        "alias",
        new KeyStore.PrivateKeyEntry(
                keyPair.getPrivate(),
                new Certificate[] { certificate }
        ),
        new KeyStore.PasswordProtection( "entryPassword".toCharArray() )
);
keyStore.store( new FileOutputStream( "test.jks" ), "keystorePassword".toCharArray() );
person Oleg Estekhin    schedule 06.05.2014
comment
Как я могу импортировать существующий файл pfx, созданный с помощью алгоритма ECGOST3410, в хранилище ключей? - person dush88c; 27.06.2019