[openssl-users] Custom OID strange characters
Wim Lewis
wiml at omnigroup.com
Tue Aug 11 18:24:34 UTC 2015
On Aug 11, 2015, at 9:24 AM, Robert Sandilands <rsandila at netscape.net> wrote:
> I am trying to build a certificate request with a custom OID and it is encoding strange characters in the certificate.
>
> For example I specify the following line in the .cnf file:
> bla_policy = ASN1:PRINTABLESTRING:blabla
> Then I get the following when I dump the csr:
> 1.2.3.4.5.6.7:
> ..blabla
This is because openssl doesn't know the format of the value of your custom extension.
Running the result of your script through asn1parse shows the extension section like this (snipped some entries for brevity):
417:d=3 hl=2 l= 93 cons: SEQUENCE
419:d=4 hl=2 l= 9 prim: OBJECT :Extension Request
430:d=4 hl=2 l= 80 cons: SET
432:d=5 hl=2 l= 78 cons: SEQUENCE
434:d=6 hl=2 l= 12 cons: SEQUENCE
436:d=7 hl=2 l= 3 prim: OBJECT :X509v3 Basic Constraints
441:d=7 hl=2 l= 1 prim: BOOLEAN :255
444:d=7 hl=2 l= 2 prim: OCTET STRING [HEX DUMP]:3000
448:d=6 hl=2 l= 11 cons: SEQUENCE
450:d=7 hl=2 l= 3 prim: OBJECT :X509v3 Key Usage
455:d=7 hl=2 l= 4 prim: OCTET STRING [HEX DUMP]:030203F8
492:d=6 hl=2 l= 18 cons: SEQUENCE
494:d=7 hl=2 l= 6 prim: OBJECT :1.2.3.4.5.6.7
502:d=7 hl=2 l= 8 prim: OCTET STRING [HEX DUMP]:1306626C61626C61
Notice that the "value" of each constraint is an OCTET STRING, regardless of its type. (The BOOLEAN field in the basic constraints extension is the Critical flag.) As is usual with X.500 stuff, tracking down the actual definition of this field is a pain, but you can find it in the PKIX RFC3280/5280 (via PKCS#10/RFC2986 and PKCS#9/RFC2985):
Extension ::= SEQUENCE {
extnID OBJECT IDENTIFIER,
critical BOOLEAN DEFAULT FALSE,
extnValue OCTET STRING }
If you ask asn1parse to dump just the contents of your extension, you'll see exactly the PRINTABLESTRING which you requested:
% openssl asn1parse -i -offset 504 -length 8 -in test.csr
0:d=0 hl=2 l= 6 prim: PRINTABLESTRING :blabla
The two bytes, 13 06, are the DER encoding of a 6-byte string (13 contains the tag and class, indicating in this case PRINTABLESTRING, and 06 is the length in bytes of the string which follows). Similarly, the basicConstraints value is an empty (0-length) SEQUENCE because all of its contents have the default values and are omitted; and the keyUsage value is a BIT STRING (tag=3, length=0x02, number of unused bits = 0x03, bits=0x1F once you remove the padding) with a bitmap of the selected constraints. extendedKeyUsage, which I snipped, is a SEQUENCE of OIDs.
If this is a custom extension, you can define its contents to be whatever you like. The standardized extensions I know about are all DER-encoded values, but I don't think that's an actual requirement.
More information about the openssl-users
mailing list