[Spice-devel] [spice-common 3/3] ssl: Don't try hostname check if cert subject check fails
Uri Lublin
uril at redhat.com
Tue Sep 24 10:47:37 PDT 2013
On 09/23/2013 11:23 AM, Christophe Fergeau wrote:
> On Sun, Sep 22, 2013 at 02:39:36PM +0300, Uri Lublin wrote:
>> On 09/20/2013 06:07 PM, Christophe Fergeau wrote:
>> What is v->verifyop value when this problem occurs ?
> When this occurs, v->verifyop would be SPICE_SSL_VERIFY_OP_HOSTNAME |
> SPICE_SSL_VERIFY_OP_SUBJECT. This will happen when a host subject is set
> from the command line, or through the controller (and probably through a
> .vv file).
>
>> It "feels" like the hostname check should not be skipped.
>>
>> It's probably better to not return after a successful check, but
>> to continue checking other required parts of the parameters (e.g. both
>> the hostname and the cert-subject).
> This wouldn't work, cert-subject is set when we know the hostname check
> will fail, and when something else should be used instead of the hostname
> to check the certificate. So we don't want to check both, and fail if both
> fail.
> host-subject and hostname are trying to verify the same part of the
> certificate (the 'subject' field, even though hostname will also be looked
> for in the altSubjectName field), so it does not feel that bad to not check
> hostname when cert-subject is set.
Hi,
It seems better to me that spice-common would check whatever it is
asked, via v->verifyop,
and not return after the first successful test.
If hostname is known to be wrong, it should not be checked (its flag
should be off).
I think the current openssl_verify() implementation is wrong (even if it
works).
What do you think of the patch below. Would it not solve the original
bug (I did not test it) ?
A follow-up (or squashed) patch would be to print the warnings when they
occur,
instead of at the bottom of the function.
Thanks,
Uri.
---
diff --git a/common/ssl_verify.c b/common/ssl_verify.c
index e10ed52..cb00b3c 100644
--- a/common/ssl_verify.c
+++ b/common/ssl_verify.c
@@ -460,23 +460,16 @@ static int openssl_verify(int preverify_ok,
X509_STORE_CTX *ctx)
return 0;
if (v->verifyop & SPICE_SSL_VERIFY_OP_HOSTNAME) {
- if (verify_hostname(cert, v->hostname))
- return 1;
- else
+ if (!verify_hostname(cert, v->hostname))
failed_verifications |= SPICE_SSL_VERIFY_OP_HOSTNAME;
}
if (v->verifyop & SPICE_SSL_VERIFY_OP_SUBJECT) {
- if (verify_subject(cert, v))
- return 1;
- else
+ if (!verify_subject(cert, v))
failed_verifications |= SPICE_SSL_VERIFY_OP_SUBJECT;
}
- /* If we reach this code, this means all the tests failed, thus
- * verification failed
- */
if (failed_verifications & SPICE_SSL_VERIFY_OP_PUBKEY)
spice_warning("ssl: pubkey verification failed");
@@ -486,9 +479,11 @@ static int openssl_verify(int preverify_ok,
X509_STORE_CTX *ctx)
if (failed_verifications & SPICE_SSL_VERIFY_OP_SUBJECT)
spice_warning("ssl: subject '%s' verification failed",
v->subject);
- spice_warning("ssl: verification failed");
+ if (failed_verifications) {
+ spice_warning("ssl: verification failed");
+ }
- return 0;
+ return !failed_verifications;
}
SpiceOpenSSLVerify* spice_openssl_verify_new(SSL *ssl,
SPICE_SSL_VERIFY_OP verifyop,
More information about the Spice-devel
mailing list