i2d_X509_REQ() -> d2i_X509_REQ() = asn1 encoding routines:c2i_ASN1_OBJECT:invalid object encoding:a_object.c:287
Graham Leggett
minfrin at sharp.fm
Mon Mar 18 19:51:02 UTC 2019
On 18 Mar 2019, at 18:49, Viktor Dukhovni <openssl-users at dukhovni.org> wrote:
> A mandatory part of the CSR is missing. It is malformed.
Some further digging shows the CSR is indeed malformed - the old openssl code created a CSR like this:
507:d=2 hl=2 l= 1 prim: OBJECT :itu-t
while the new openssl code produces a CSR like this:
508:d=2 hl=2 l= 0 prim: OBJECT :BAD OBJECT
It looks like X509_REQ_new() in older versions of openssl created an object with an empty signature, while the new code produces a bad signature.
> Since you don't have a CSR, the fix is to not attempt to encode the data
> as a CSR. It sounds like what you have is a CRI (that is a
> CertificationRequestInfo structure) so you'll need to encode that instead.
>
> https://tools.ietf.org/html/rfc2986#section-4
>
> The relevant codec functions are: i2d_X509_REQ_INFO and d2i_X509_REQ_INFO.
>
> A CSR is:
>
> CertificationRequest ::= SEQUENCE {
> certificationRequestInfo CertificationRequestInfo,
> signatureAlgorithm AlgorithmIdentifier{{ SignatureAlgorithms }},
> signature BIT STRING
> }
>
> which encapsulates the CRI a larger signed structure, adding precisely
> the bits you're missing.
This makes sense - however there don’t appear to be any APIs in openssl that allow you to manipulate a X509_REQ_INFO structure. I can create it, and encode/decode it, but there is no X509_REQ_INFO_get_subject_name() (or friends) to populate the structure. X509_REQ_INFO itself is opaque.
> An alternative (if you must) is to create an actual CSR, with a dummy
> signature OID, and signature and then ignore the signature on the other
> side.
This looks like a workaround for now, what API call would I use to do that?
The X509_REQ structure is opaque, so I can’t see what options I have for setting any OIDs.
Regards,
Graham
—
More information about the openssl-users
mailing list