#c# #bouncycastle
Вопрос:
Я создаю CSR с Надувным замком и подписываю его на HSM (ключ EC). Это прекрасно работает! Но в содержании CSR (и в сертификате позже) нет имени кривой EC. Вместо этого существуют параметры кривой. У некоторых клиентов есть проблемы с этим, например: Фитон. На скриншоте вы можете увидеть, как это делает OpenSSL. Как я могу заставить Bouncy Castle написать название кривой в CSR?
Код для добавления открытого ключа в CSR:
IList oids = new ArrayList();
IList values = new ArrayList();
..........
SubjectKeyIdentifier subjectKeyIdentifier = new SubjectKeyIdentifierStructure(publicKey);
X509Extension ski = new X509Extension(true, new DerOctetString(subjectKeyIdentifier));
oids.Add(X509Extensions.SubjectKeyIdentifier);
values.Add(ski);
AttributePkcs attribute = new AttributePkcs(PkcsObjectIdentifiers.Pkcs9AtExtensionRequest,
new DerSet(new X509Extensions(oids, values)));
//End Extensions
// SIGN on HSM
Pkcs10CertificationRequestDelaySigned csr = new Pkcs10CertificationRequestDelaySigned(
signatureAlgorithmStr,
subject,
publicKey,
new DerSet(attribute)
);
......
Скриншот: CSR с надувным замком и OpenSSL
Ответ №1:
Проблема не в BouncyCastle
том , а скорее в том, как генерируется / инициализируется открытый ключ. Вы можете выбрать либо именованную кривую, либо параметры расширенной группы, но не то и другое вместе.
Технически они эквивалентны, но с точки зрения использования они плохо сочетаются друг с другом. Поэтому вам придется сгенерировать и то, и другое, если вы хотите удовлетворить оба этих сценария.
Я не знаю, как вы инициализируете открытый ключ, но вы можете преобразовать его в другой тип открытого ключа перед подписанием.
AsymmetricKeyParameter publicKey = null;
// ... existing public key by some means
var castedPublicKey = (ECPublicKeyParameters)publicKey;
var newPublicKey = new ECPublicKeyParameters(
castedPublicKey.AlgorithmName
,castedPublicKey.Q,
X9ObjectIdentifiers.Prime256v1);
// ... rest of code
// SIGN on HSM
Pkcs10CertificationRequestDelaySigned csr = new Pkcs10CertificationRequestDelaySigned(
signatureAlgorithmStr,
subject,
newPublicKey,
new DerSet(attribute)
);
Переключитесь Prime256v1
на любую кривую, которую вы используете
Комментарии:
1. Спасибо, это помогло. Когда я запрашиваю EC-Public из HSM и создаю его из точки EC, я должен использовать «NamedCurve»- > X9ObjectIdentifiers.Prime256v1, это работает. Спасибо!
2. Параметры ECPublicKeyParameters pubKeyParameters = новые параметры ECPublicKeyParameters(«ECDSA», ECPoint, X9ObjectIdentifiers.Prime256v1);
3. Рад, что это помогло, вы можете проголосовать или отметить ответ как принятый, если это помогло решить проблему