Номер DEA, связанный с сертификатом, может храниться в расширении 1.2.16.840.1.101.3.5.7 как DER, кодированная ASN.1. До этого момента не удалось выяснить, что такое фактическая структура и как ее можно воссоздать, чтобы иметь возможность включить любой желаемый номер DEA при генерации пользовательского сертификата
decode der: echo "" | xxd -r -p> octet_string_data.bin && openssl asn1parse -in octet_string_data.bin
должен рассмотреть, как обменивается обмено, номер DEA из расширений
не рассматривал, что расширение 1.2.16.840.1.101. 3.5.5 содержит
Обсуждение CHATGPT: https://chatgpt.com/share/6721f32d-4d80 ... 1da08247d6
>used java code
import org.bouncycastle.asn1.*;
import org.bouncycastle.asn1.x500.X500Name;
import org.bouncycastle.asn1.x509.*;
import org.bouncycastle.cert.X509CertificateHolder;
import org.bouncycastle.cert.X509v3CertificateBuilder;
import org.bouncycastle.cert.jcajce.JcaX509CertificateConverter;
import org.bouncycastle.cert.jcajce.JcaX509v3CertificateBuilder;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.operator.ContentSigner;
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder;
import java.math.BigInteger;
import java.security.*;
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
import java.util.Date;
public class CSOSCertificateGenerator {
static {
Security.addProvider(new BouncyCastleProvider());
}
public static X509Certificate generateCertificate(String deaNumber, Date expiryDate) throws Exception {
KeyPair keyPair = generateKeyPair();
X500Name issuer = new X500Name("CN=Axway Test CA, O=Axway, C=US");
X500Name subject = new X500Name("CN=" + deaNumber + ", O=Axway, C=US");
BigInteger serialNumber = new BigInteger(64, new SecureRandom());
Date notBefore = new Date();
Date notAfter = expiryDate;
X509v3CertificateBuilder certBuilder = new JcaX509v3CertificateBuilder(
issuer, serialNumber, notBefore, notAfter, subject, keyPair.getPublic());
// Encode DEA Number as ASN.1 structure
ASN1EncodableVector vector = new ASN1EncodableVector();
vector.add(new DERPrintableString(deaNumber)); // Storing DEA number
DERSequence deaASN1Sequence = new DERSequence(vector);
// Add DEA Number Extension (1.2.16.840.1.101.3.5.7)
certBuilder.addExtension(
new ASN1ObjectIdentifier("1.2.16.840.1.101.3.5.7"),
false, // Not critical
deaASN1Sequence
);
// Sign certificate
ContentSigner signer = new JcaContentSignerBuilder("SHA256WithRSAEncryption").build(keyPair.getPrivate());
X509CertificateHolder certHolder = certBuilder.build(signer);
return new JcaX509CertificateConverter().setProvider("BC").getCertificate(certHolder);
}
private static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048, new SecureRandom());
return keyPairGenerator.generateKeyPair();
}
public static void main(String[] args) {
try {
String deaNumber = "DEA1234567";
Date expiryDate = new Date(System.currentTimeMillis() + 31536000000L); // 1 year from now
X509Certificate cert = generateCertificate(deaNumber, expiryDate);
System.out.println("Generated CSOS Certificate with DEA Number: " + deaNumber);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... using-java