That's because the string encodings are different.

The digest parameter to SKI is raw bytes, and OpenSSL is showing you
their hex encoding:

>>> import binascii

>>> binascii.unhexlify("32:30:30:31:30:30:33:66:66:65:33:66:66:38:30:35:66:36:34:62:30:61:36:35:36:61:61:65:65:35:36:38".rep\

lace(":", ""))

b'2001003ffe3ff805f64b0a656aaee568'

Alex

On Thu, Mar 13, 2025 at 6:18 PM Robert Moskowitz <r...@htt-consult.com> wrote:
>
> that is not what I am seeing:
>
> builder = builder.add_extension(
> x509.SubjectAlternativeName([x509.IPAddress(ipaddress.IPv6Address(deti))
>      ]),critical=True,)
> print(type(detb), detb)
> ski = x509.SubjectKeyIdentifier(detb)
> print(type(ski), ski)
> builder = builder.add_extension(ski, critical=False)
> certificate = builder.sign(hda_prkey, None)
>
> <class 'bytes'> b'2001003ffe3ff805f64b0a656aaee568'
> <class 'cryptography.x509.extensions.SubjectKeyIdentifier'>
> <SubjectKeyIdentifier(digest=b'2001003ffe3ff805f64b0a656aaee568')>
>
>          X509v3 extensions:
>              X509v3 Subject Alternative Name: critical
>                  IP Address:2001:3F:FE3F:F805:F64B:A65:6AAE:E568
>              X509v3 Subject Key Identifier:
> 32:30:30:31:30:30:33:66:66:65:33:66:66:38:30:35:66:36:34:62:30:61:36:35:36:61:61:65:65:35:36:38
>
> SAN gets the "right" value, SKI does not.
>
> On 3/13/25 6:12 PM, Alex Gaynor wrote:
> > Notwithstanding that the field is named digest, it can be any value.
> >
> > If you look at the generated X.509 certificate for any SKI value you
> > provide, you'll see it ends up in the certificate directly.
> >
> > Alex
> >
> > On Thu, Mar 13, 2025 at 6:09 PM Robert Moskowitz <r...@htt-consult.com> 
> > wrote:
> >> 5280 does not REQUIRE SKI to be a digest.  It can be any value you want.
> >>
> >> And if fact with openssl directly I can have in my config:
> >>
> >> [ usr_cert ]
> >> # Extensions for client certificates (`man x509v3_config`).
> >> subjectKeyIdentifier = $ENV::ski
> >> authorityKeyIdentifier = keyid:always
> >>
> >> Where I have:
> >>
> >> export ski=2001003FFE3FF8059B0E2860EB0BACDE
> >>
> >> e.g.:
> >>
> >>           X509v3 extensions:
> >>               X509v3 Subject Key Identifier:
> >>                   20:01:00:3F:FE:3F:F8:05:9B:0E:28:60:EB:0B:AC:DE
> >>               X509v3 Authority Key Identifier:
> >>                   20:01:00:3F:FE:3F:F8:05:E8:05:A9:8F:9D:F1:5E:2D
> >>
> >>
> >> On 3/13/25 5:55 PM, Alex Gaynor wrote:
> >>> I don't understand your question. As you can see, the value you pass
> >>> as the digest is the same as the value the SKI instance has. And as
> >>> the documentation states, digest and key_identifier are aliases for
> >>> each other (as attributes on an SKI).
> >>>
> >>> Alex
> >>>
> >>> On Thu, Mar 13, 2025 at 5:53 PM Robert Moskowitz <r...@htt-consult.com> 
> >>> wrote:
> >>>> I can't see to defeat it digesting the argument:
> >>>>
> >>>> print(type(detb), detb)
> >>>> ski = x509.SubjectKeyIdentifier(detb)
> >>>> print(type(ski), ski)
> >>>>
> >>>> <class 'bytes'> b'2001003ffe3ff805f64b0a656aaee568'
> >>>> <class 'cryptography.x509.extensions.SubjectKeyIdentifier'>
> >>>> <SubjectKeyIdentifier(digest=b'2001003ffe3ff805f64b0a656aaee568')>
> >>>>
> >>>> I don't WANT detb to be digested.  I just want its value in
> >>>> SubjectKeyIdentifier
> >>>>
> >>>> I tried, after rereading that web page doc:
> >>>>
> >>>> ski = x509.SubjectKeyIdentifier(key_identifier=detb)
> >>>>
> >>>> But that threw an error
> >>>>
> >>>>
> >>>> On 3/13/25 5:34 PM, Alex Gaynor via Cryptography-dev wrote:
> >>>>> You can pass any bytes value to the constructor:
> >>>>> https://cryptography.io/en/latest/x509/reference/#cryptography.x509.SubjectKeyIdentifier
> >>>>> (Sphinx doesn't highlight it, but you can see the constructor's
> >>>>> signature `SubjectKeyIdentifier(digest)`).
> >>>>>
> >>>>> Alex
> >>>>>
> >>>>> On Thu, Mar 13, 2025 at 5:32 PM Robert Moskowitz <r...@htt-consult.com> 
> >>>>> wrote:
> >>>>>> Per RFC5280
> >>>>>>
> >>>>>> Although the common practice for SubjectKeyIdentifier is to SHA1 hash
> >>>>>> the public key,  sec 4.2.1.2 clearly states that:
> >>>>>>
> >>>>>> "Other methods of generating unique numbers are also acceptable."
> >>>>>>
> >>>>>> And in fact, using openSSL I have set whatever value I have wanted into
> >>>>>> SubjectKeyIdentifier in the config file.
> >>>>>>
> >>>>>> But it seems in
> >>>>>>
> >>>>>> https://cryptography.io/en/latest/x509/reference/#cryptography.x509.SubjectKeyIdentifier.from_public_key
> >>>>>>
> >>>>>> "digest" is the only allowed option.
> >>>>>>
> >>>>>> For example I have an IPv6 address that the reverse lookup will get you
> >>>>>> all the RR you may need for the thing.  So I would want
> >>>>>>
> >>>>>> 2001003ffe3ff805f64b0a656aaee56
> >>>>>>
> >>>>>> as my SubjectKeyIdentifier
> >>>>>>
> >>>>>> How can I do this?  What type does that value need to be?
> >>>>>>
> >>>>>> Of course for AuthorityKeyIdentifier I think can "cheat" by using the
> >>>>>> int value of that ipv6 addr and feeding it in as the serial_number.
> >>>>>>
> >>>>>> thank you
> >>>>>>
> >>>>>>
> >>>>>> _______________________________________________
> >>>>>> Cryptography-dev mailing list
> >>>>>> Cryptography-dev@python.org
> >>>>>> https://mail.python.org/mailman/listinfo/cryptography-dev
> >
>


-- 
All that is necessary for evil to succeed is for good people to do nothing.
_______________________________________________
Cryptography-dev mailing list
Cryptography-dev@python.org
https://mail.python.org/mailman/listinfo/cryptography-dev

Reply via email to