Re: Libressl verify failure with 3.9.0

2024-04-09 Thread Ted Wynnychenko



Thanks for the suggestion.
The workaround does work, and creates (essentially) the same certificate,
but one that does not fail verification with the new libressl.
I did notice the option of not have the leading "20" for dates before 2050,
but I did not know enough to try doing that.
 
Ted
 
 
> -Original Message-
> > From: owner-m...@openbsd.org [mailto:owner-m...@openbsd.org] On
> Behalf
> > Of Theo Buehler
> > Sent: Monday, April 08, 2024 6:45 AM
> > To: Ted Wynnychenko
> > Cc: 'OpenBSD misc'; b...@openbsd.org; js...@openbsd.org
> > Subject: Re: Libressl verify failure with 3.9.0
> >
> > On Sun, Apr 07, 2024 at 04:57:24PM -0500, Ted Wynnychenko wrote:
> > > Hello,
> > >
> > > I recently updated to -current (about a week ago).
> > >
> > > I see that Libressl is at 3.9.1 just now, but I hope that won't be
> an
> > issue
> > > (I did not see anything in the release notes that would impact my
> > question).
> > > ---
> > > $ openssl version
> > > LibreSSL 3.9.0
> > > ---
> > >
> > > Over the years, I have made certificates for personal
> > servers/resources on
> > > my home network.  This is just for me, so I do some things that
> would
> > be
> > > frowned on (although, technically, there is nothing "wrong" with
> > them).
> > >
> > > In this case, since I have Apple iOS devices that I want to connect
> > to
> > > https, I backdate any certificates I create to 1/2/2019.  Apple has
> > imposed
> > > a 300 or 800 day time limit on the validity for certificates
> created
> > after
> > > (about) 7/1/2019.  Since I don't want to constantly make new
> > certificates
> > > for my personal/home network, I have just been setting the
> > certificates'
> > > "not before" date to early 2019.
> > >
> > > Anyway, this had worked fine.
> > > In fact, earlier this year (Jan 2024), I created a new certificate,
> > and all
> > > is good.
> > >
> > > A few weeks ago, I added a new thing to the network - a raspberry
> pi
> > (I got
> > > as a gift about 2013 and installed a linux image from 2019 on it)
> > that is
> > > connected to the home alarm system.
> > >
> > > Since I was annoyed that my browser was constantly giving me self-
> > signed
> > > certificate warnings, I decided to make a certificate for the nginx
> > running
> > > on this appliance.
> > >
> > > I created a key, made a csr, and then signed it with:
> > > openssl ca -startdate 2019010200Z -in pi.csr -out pi.pem -
> config
> > > /etc/ssl/openssl.cnf
> >
> > As a workaround, try using '-startdate 19010200Z' instead. I
> think
> > this is fallout from this commit:
> >
> >
> https://github.com/openbsd/src/commit/3feee4c53fbd67a4a480080d8ef5ae835
> > d3fbf82
> >
> > ASN1_TIME_set_string_X509() is documented as
> >
> >  In LibreSSL, ASN1_TIME_set_string() and
> > ASN1_TIME_set_string_X509()
> >  behave identically and always set the time object to a valid
> value
> > to use
> >  in an X.509 certificate.
> >
> > It seems to me that this is just wrong (it is true that both behave
> > identically because RFC5280 is defined to 0), but they do not set the
> > time object to "a valid value to use in an X.509 certificate".
> >
> > Confusingly, ASN1_TIME_adj_internal() actually honours its RFC5280
> > parameter by behaving the expected way whereas its meaning in
> > ASN1_TIME_set_string_internal() is different.
> >
> > I am unsure if the bug is in my commit above or in our version of
> > ASN1_TIME_set_string_X509() (or both).
> >
> > >
> > > This all works fine, and a certificate is created
> > >
> > > When I check with:
> > > openssl x509 -text -noout -in pi.pem
> > >
> > > everything seems as expected, including the not before/after dates:
> > >
> > > Validity
> > > Not Before: Jan  2 00:00:00 2019 GMT
> > > Not After : Apr  7 15:39:59 2054 GMT
> > >
> > > (yes, it is valid for 35 years - as I said before, if someone
> breaks
> > into my
> > > house to secretly do things, I have way bigger problems)
> > >
> > > But, if I try to verify this on the openbsd system, I get:
> > >
> > > # openssl verify pi.pem
> > > C

Re: Libressl verify failure with 3.9.0

2024-04-08 Thread 'Theo Buehler'
On Mon, Apr 08, 2024 at 05:53:47PM -0500, Ted Wynnychenko wrote:
> Thanks for the suggestion.
> The workaround does work, and creates (essentially) the same certificate,
> but one that does not fail verification with the new libressl.
> I did notice the option of not have the leading "20" for dates before 2050,
> but I did not know enough to try doing that.

Great. openssl ca should be smart enough to do that for you.  It tried
to, but failed due to a bug. This will be fixed in the next release:

https://github.com/openbsd/src/commit/72c7c57a68e32c57ac752161b5a93464ad11e7e1

The incomprehensible verification error is another bug and that will
also be fixed.



Re: Libressl verify failure with 3.9.0

2024-04-08 Thread Bob Beck



> On Apr 8, 2024, at 5:44 AM, Theo Buehler  wrote:
> 
> On Sun, Apr 07, 2024 at 04:57:24PM -0500, Ted Wynnychenko wrote:
>> Hello,
>> 
>> I recently updated to -current (about a week ago).
>> 
>> I see that Libressl is at 3.9.1 just now, but I hope that won't be an issue 
>> (I did not see anything in the release notes that would impact my question).
>> ---
>> $ openssl version
>> LibreSSL 3.9.0
>> ---
>> 
>> Over the years, I have made certificates for personal servers/resources on 
>> my home network.  This is just for me, so I do some things that would be 
>> frowned on (although, technically, there is nothing "wrong" with them).
>> 
>> In this case, since I have Apple iOS devices that I want to connect to 
>> https, I backdate any certificates I create to 1/2/2019.  Apple has imposed 
>> a 300 or 800 day time limit on the validity for certificates created after 
>> (about) 7/1/2019.  Since I don't want to constantly make new certificates 
>> for my personal/home network, I have just been setting the certificates' 
>> "not before" date to early 2019.
>> 
>> Anyway, this had worked fine.
>> In fact, earlier this year (Jan 2024), I created a new certificate, and all 
>> is good.
>> 
>> A few weeks ago, I added a new thing to the network - a raspberry pi (I got 
>> as a gift about 2013 and installed a linux image from 2019 on it) that is 
>> connected to the home alarm system.
>> 
>> Since I was annoyed that my browser was constantly giving me self-signed 
>> certificate warnings, I decided to make a certificate for the nginx running 
>> on this appliance.
>> 
>> I created a key, made a csr, and then signed it with:
>> openssl ca -startdate 2019010200Z -in pi.csr -out pi.pem -config 
>> /etc/ssl/openssl.cnf


Did you create this certificate on OpenBSD with Libressl openssl? Or on linux 
or something else with an OpenSSL openssl? 


> 
> As a workaround, try using '-startdate 19010200Z' instead. I think
> this is fallout from this commit:
> 
> https://github.com/openbsd/src/commit/3feee4c53fbd67a4a480080d8ef5ae835d3fbf82
> 
> ASN1_TIME_set_string_X509() is documented as
> 
> In LibreSSL, ASN1_TIME_set_string() and ASN1_TIME_set_string_X509()
> behave identically and always set the time object to a valid value to use
> in an X.509 certificate.
> 
> It seems to me that this is just wrong (it is true that both behave
> identically because RFC5280 is defined to 0), but they do not set the
> time object to "a valid value to use in an X.509 certificate".
> 
> Confusingly, ASN1_TIME_adj_internal() actually honours its RFC5280
> parameter by behaving the expected way whereas its meaning in
> ASN1_TIME_set_string_internal() is different.
> 
> I am unsure if the bug is in my commit above or in our version of
> ASN1_TIME_set_string_X509() (or both).

> 
>> 
>> This all works fine, and a certificate is created
>> 
>> When I check with:
>> openssl x509 -text -noout -in pi.pem
>> 
>> everything seems as expected, including the not before/after dates:
>> 
>>Validity
>>Not Before: Jan  2 00:00:00 2019 GMT
>>Not After : Apr  7 15:39:59 2054 GMT
>> 
>> (yes, it is valid for 35 years - as I said before, if someone breaks into my 
>> house to secretly do things, I have way bigger problems)
>> 
>> But, if I try to verify this on the openbsd system, I get:
>> 
>> # openssl verify pi.pem
>> C = US, ST = Illinois, L = ***, O = ***, OU = ***, CN = ***
>> error 20 at 0 depth lookup:unable to get local issuer certificate
>> pi.pem: verification failed: 20 (unable to get local issuer certificate)
>> ---
>> 
>> But, if I install this on the raspberry pi, which has a much older version 
>> of openssl on it:
>> $ openssl version
>> OpenSSL 1.1.1c  28 May 2019
>> 
>> The certificate verifies without an issue:
>> $ openssl verify pi.pem
>> pi.pem: OK
>> 
>> The last time I created a certificate was in January of this year 
>> (1/22/2024).
>> I am thinking the openbsd system was using Libressl 3.8.2 at that point.
>> 
>> I created that certificate in the exact same way, backdating the start date:
>> openssl ca -startdate 2019010200Z -in 54.csr -out 54.pem -config 
>> /etc/ssl/openssl.cnf
>> 
>> This previously created certificate also has them same backdated and very 
>> long valid period:
>> 
>>Validity
>>Not Before: Jan  2 00:00:00 2019 GMT
>>Not After : Jan 21 23:49:22 2054 GMT
>> 
>> (Notice the not after date is a little different)
>> Today, with the new libressl, this certificate verifies OK.
>> 
>> $ openssl verify 54.pem
>> 54.pem: OK
>> 
>> Finally, if I create the new certificate WITHOUT backdating it
>> e.g.:  openssl ca -in pi.csr -out pi.pem -config /etc/ssl/openssl.cnf
>> 
>> The certificate is created and verifies OK.
>> 
>> So, it seems, there is some sort of issue with backdating the certificate, 
>> but not an issue with the crazy long validity window, that was not present 
>> in January of this year.
>> 
>> However, as I said, if I 

Re: Libressl verify failure with 3.9.0

2024-04-08 Thread Theo Buehler
On Sun, Apr 07, 2024 at 04:57:24PM -0500, Ted Wynnychenko wrote:
> Hello,
> 
> I recently updated to -current (about a week ago).
> 
> I see that Libressl is at 3.9.1 just now, but I hope that won't be an issue 
> (I did not see anything in the release notes that would impact my question).
> ---
> $ openssl version
> LibreSSL 3.9.0
> ---
> 
> Over the years, I have made certificates for personal servers/resources on 
> my home network.  This is just for me, so I do some things that would be 
> frowned on (although, technically, there is nothing "wrong" with them).
> 
> In this case, since I have Apple iOS devices that I want to connect to 
> https, I backdate any certificates I create to 1/2/2019.  Apple has imposed 
> a 300 or 800 day time limit on the validity for certificates created after 
> (about) 7/1/2019.  Since I don't want to constantly make new certificates 
> for my personal/home network, I have just been setting the certificates' 
> "not before" date to early 2019.
> 
> Anyway, this had worked fine.
> In fact, earlier this year (Jan 2024), I created a new certificate, and all 
> is good.
> 
> A few weeks ago, I added a new thing to the network - a raspberry pi (I got 
> as a gift about 2013 and installed a linux image from 2019 on it) that is 
> connected to the home alarm system.
> 
> Since I was annoyed that my browser was constantly giving me self-signed 
> certificate warnings, I decided to make a certificate for the nginx running 
> on this appliance.
> 
> I created a key, made a csr, and then signed it with:
> openssl ca -startdate 2019010200Z -in pi.csr -out pi.pem -config 
> /etc/ssl/openssl.cnf

As a workaround, try using '-startdate 19010200Z' instead. I think
this is fallout from this commit:

https://github.com/openbsd/src/commit/3feee4c53fbd67a4a480080d8ef5ae835d3fbf82

ASN1_TIME_set_string_X509() is documented as

 In LibreSSL, ASN1_TIME_set_string() and ASN1_TIME_set_string_X509()
 behave identically and always set the time object to a valid value to use
 in an X.509 certificate.

It seems to me that this is just wrong (it is true that both behave
identically because RFC5280 is defined to 0), but they do not set the
time object to "a valid value to use in an X.509 certificate".

Confusingly, ASN1_TIME_adj_internal() actually honours its RFC5280
parameter by behaving the expected way whereas its meaning in
ASN1_TIME_set_string_internal() is different.

I am unsure if the bug is in my commit above or in our version of
ASN1_TIME_set_string_X509() (or both).

> 
> This all works fine, and a certificate is created
> 
> When I check with:
> openssl x509 -text -noout -in pi.pem
> 
> everything seems as expected, including the not before/after dates:
> 
> Validity
> Not Before: Jan  2 00:00:00 2019 GMT
> Not After : Apr  7 15:39:59 2054 GMT
> 
> (yes, it is valid for 35 years - as I said before, if someone breaks into my 
> house to secretly do things, I have way bigger problems)
> 
> But, if I try to verify this on the openbsd system, I get:
> 
> # openssl verify pi.pem
> C = US, ST = Illinois, L = ***, O = ***, OU = ***, CN = ***
> error 20 at 0 depth lookup:unable to get local issuer certificate
> pi.pem: verification failed: 20 (unable to get local issuer certificate)
> ---
> 
> But, if I install this on the raspberry pi, which has a much older version 
> of openssl on it:
> $ openssl version
> OpenSSL 1.1.1c  28 May 2019
> 
> The certificate verifies without an issue:
> $ openssl verify pi.pem
> pi.pem: OK
> 
> The last time I created a certificate was in January of this year 
> (1/22/2024).
> I am thinking the openbsd system was using Libressl 3.8.2 at that point.
> 
> I created that certificate in the exact same way, backdating the start date:
> openssl ca -startdate 2019010200Z -in 54.csr -out 54.pem -config 
> /etc/ssl/openssl.cnf
> 
> This previously created certificate also has them same backdated and very 
> long valid period:
> 
> Validity
> Not Before: Jan  2 00:00:00 2019 GMT
> Not After : Jan 21 23:49:22 2054 GMT
> 
> (Notice the not after date is a little different)
> Today, with the new libressl, this certificate verifies OK.
> 
> $ openssl verify 54.pem
> 54.pem: OK
> 
> Finally, if I create the new certificate WITHOUT backdating it
> e.g.:  openssl ca -in pi.csr -out pi.pem -config /etc/ssl/openssl.cnf
> 
> The certificate is created and verifies OK.
> 
> So, it seems, there is some sort of issue with backdating the certificate, 
> but not an issue with the crazy long validity window, that was not present 
> in January of this year.
> 
> However, as I said, if I don't backdate, then in about a year the ipad will 
> refuse to connect because of the restrictions apple has imposed, unless I 
> update the certificate.
> 
> I know this is not "best practice," but it should still work, right?
> 
> Is there something I am missing?
> Otherwise, it appears something has changed in Libressl

Libressl verify failure with 3.9.0

2024-04-07 Thread Ted Wynnychenko
Hello,

I recently updated to -current (about a week ago).

I see that Libressl is at 3.9.1 just now, but I hope that won't be an issue 
(I did not see anything in the release notes that would impact my question).
---
$ openssl version
LibreSSL 3.9.0
---

Over the years, I have made certificates for personal servers/resources on 
my home network.  This is just for me, so I do some things that would be 
frowned on (although, technically, there is nothing "wrong" with them).

In this case, since I have Apple iOS devices that I want to connect to 
https, I backdate any certificates I create to 1/2/2019.  Apple has imposed 
a 300 or 800 day time limit on the validity for certificates created after 
(about) 7/1/2019.  Since I don't want to constantly make new certificates 
for my personal/home network, I have just been setting the certificates' 
"not before" date to early 2019.

Anyway, this had worked fine.
In fact, earlier this year (Jan 2024), I created a new certificate, and all 
is good.

A few weeks ago, I added a new thing to the network - a raspberry pi (I got 
as a gift about 2013 and installed a linux image from 2019 on it) that is 
connected to the home alarm system.

Since I was annoyed that my browser was constantly giving me self-signed 
certificate warnings, I decided to make a certificate for the nginx running 
on this appliance.

I created a key, made a csr, and then signed it with:
openssl ca -startdate 2019010200Z -in pi.csr -out pi.pem -config 
/etc/ssl/openssl.cnf

This all works fine, and a certificate is created

When I check with:
openssl x509 -text -noout -in pi.pem

everything seems as expected, including the not before/after dates:

Validity
Not Before: Jan  2 00:00:00 2019 GMT
Not After : Apr  7 15:39:59 2054 GMT

(yes, it is valid for 35 years - as I said before, if someone breaks into my 
house to secretly do things, I have way bigger problems)

But, if I try to verify this on the openbsd system, I get:

# openssl verify pi.pem
C = US, ST = Illinois, L = ***, O = ***, OU = ***, CN = ***
error 20 at 0 depth lookup:unable to get local issuer certificate
pi.pem: verification failed: 20 (unable to get local issuer certificate)
---

But, if I install this on the raspberry pi, which has a much older version 
of openssl on it:
$ openssl version
OpenSSL 1.1.1c  28 May 2019

The certificate verifies without an issue:
$ openssl verify pi.pem
pi.pem: OK

The last time I created a certificate was in January of this year 
(1/22/2024).
I am thinking the openbsd system was using Libressl 3.8.2 at that point.

I created that certificate in the exact same way, backdating the start date:
openssl ca -startdate 2019010200Z -in 54.csr -out 54.pem -config 
/etc/ssl/openssl.cnf

This previously created certificate also has them same backdated and very 
long valid period:

Validity
Not Before: Jan  2 00:00:00 2019 GMT
Not After : Jan 21 23:49:22 2054 GMT

(Notice the not after date is a little different)
Today, with the new libressl, this certificate verifies OK.

$ openssl verify 54.pem
54.pem: OK

Finally, if I create the new certificate WITHOUT backdating it
e.g.:  openssl ca -in pi.csr -out pi.pem -config /etc/ssl/openssl.cnf

The certificate is created and verifies OK.

So, it seems, there is some sort of issue with backdating the certificate, 
but not an issue with the crazy long validity window, that was not present 
in January of this year.

However, as I said, if I don't backdate, then in about a year the ipad will 
refuse to connect because of the restrictions apple has imposed, unless I 
update the certificate.

I know this is not "best practice," but it should still work, right?

Is there something I am missing?
Otherwise, it appears something has changed in Libressl 3.9.0 but is not 
documented.

Thanks in advance for any suggestions.
Ted