[xmlsec] nss / XMLSEC_KEYINFO_FLAGS_X509DATA_DONT_VERIFY_CERTS handling
Miklos Vajna
vmiklos at vmiklos.hu
Wed Jan 18 13:27:27 PST 2017
Hi,
As a follow-up up to <https://github.com/lsh123/xmlsec/pull/73>, I was
testing how XMLSEC_KEYINFO_FLAGS_X509DATA_DONT_VERIFY_CERTS is working
in the nss backend.
As far as I understand, this flag is supposed to be similar to 'curl -k'
or 'wget -k', i.e. it should only cause the certificate verification to
be disabled, everything else should be the same.
So here is a small script I made for testing:
----
cd $HOME/git/xmlsec/tests/aleksey-xmldsig-01
export LD_LIBRARY_PATH=$HOME/git/xmlsec/src/nss/.libs
$HOME/git/xmlsec/apps/xmlsec1 verify --crypto nss --crypto-config /tmp/xmlsec-crypto-config --enabled-key-data x509 enveloping-sha256-rsa-sha256-verify.xml
----
This should (and does) fail currently, as the certificate is not trusted
(no --trusted option is used).
However, I would expect it to succeed in case I patch the xmlsec test
app like this:
----
diff --git a/apps/xmlsec.c b/apps/xmlsec.c
index ea49cb6..ba812af 100644
--- a/apps/xmlsec.c
+++ b/apps/xmlsec.c
@@ -1822,6 +1822,7 @@ xmlSecAppPrepareKeyInfoReadCtx(xmlSecKeyInfoCtxPtr keyInfoCtx) {
if(xmlSecAppCmdLineParamIsSet(&X509SkipStrictChecksParam)) {
keyInfoCtx->flags |= XMLSEC_KEYINFO_FLAGS_X509DATA_SKIP_STRICT_CHECKS;
}
+ keyInfoCtx->flags |= XMLSEC_KEYINFO_FLAGS_X509DATA_DONT_VERIFY_CERTS;
#endif /* XMLSEC_NO_X509 */
/* read enabled key data list */
----
Instead of success, I get this:
----
func=xmlSecKeysMngrGetKey:file=keys.c:line=1246:obj=unknown:subj=xmlSecKeysMngrFindKey:error=1:xmlsec library function failed:
func=xmlSecDSigCtxProcessKeyInfoNode:file=xmldsig.c:line=790:obj=unknown:subj=unknown:error=45:key is not found:details=NULL
func=xmlSecDSigCtxProcessSignatureNode:file=xmldsig.c:line=503:obj=unknown:subj=xmlSecDSigCtxProcessKeyInfoNode:error=1:xmlsec library function failed:
func=xmlSecDSigCtxVerify:file=xmldsig.c:line=341:obj=unknown:subj=xmlSecDSigCtxSignatureProcessNode:error=1:xmlsec library function failed:
Error: signature failed
ERROR
SignedInfo References (ok/all): 0/0
Manifests References (ok/all): 0/0
Error: failed to verify file "enveloping-sha256-rsa-sha256-verify.xml"
----
Am I correct that this is a bug in the nss backend?
Here is my attempt to fix this:
----
diff --git a/src/nss/x509.c b/src/nss/x509.c
index 5dc7b69..e4f4bb8 100644
--- a/src/nss/x509.c
+++ b/src/nss/x509.c
@@ -687,13 +687,11 @@ xmlSecNssKeyDataX509XmlRead(xmlSecKeyDataId id, xmlSecKeyPtr key,
return(-1);
}
- if((keyInfoCtx->flags & XMLSEC_KEYINFO_FLAGS_X509DATA_DONT_VERIFY_CERTS) == 0) {
- ret = xmlSecNssKeyDataX509VerifyAndExtractKey(data, key, keyInfoCtx);
- if(ret < 0) {
- xmlSecInternalError("xmlSecNssKeyDataX509VerifyAndExtractKey",
- xmlSecKeyDataKlassGetName(id));
- return(-1);
- }
+ ret = xmlSecNssKeyDataX509VerifyAndExtractKey(data, key, keyInfoCtx);
+ if(ret < 0) {
+ xmlSecInternalError("xmlSecNssKeyDataX509VerifyAndExtractKey",
+ xmlSecKeyDataKlassGetName(id));
+ return(-1);
}
return(0);
}
diff --git a/src/nss/x509vfy.c b/src/nss/x509vfy.c
index fee2644..02080c9 100644
--- a/src/nss/x509vfy.c
+++ b/src/nss/x509vfy.c
@@ -213,13 +213,18 @@ xmlSecNssX509StoreVerify(xmlSecKeyDataStorePtr store, CERTCertList* certs,
continue;
}
- /* it's important to set the usage here, otherwise no real verification
- * is performed. */
- status = CERT_VerifyCertificate(CERT_GetDefaultCertDB(),
- cert, PR_FALSE,
- certificateUsageEmailSigner,
- timeboundary , NULL, NULL, NULL);
- if (status == SECSuccess) {
+ if((keyInfoCtx->flags & XMLSEC_KEYINFO_FLAGS_X509DATA_DONT_VERIFY_CERTS) == 0) {
+ /* it's important to set the usage here, otherwise no real verification
+ * is performed. */
+ status = CERT_VerifyCertificate(CERT_GetDefaultCertDB(),
+ cert, PR_FALSE,
+ certificateUsageEmailSigner,
+ timeboundary , NULL, NULL, NULL);
+ if(status == SECSuccess) {
+ break;
+ }
+ } else {
+ status = SECSuccess;
break;
}
}
----
I.e. instead of disabling the whole
xmlSecNssKeyDataX509VerifyAndExtractKey(), still execute it when the
"don't verify" flag is set, just don't call recently fixed
CERT_VerifyCertificate() function.
Is this the correct approach to fix the problem?
If so, I'm happy to extend the xmlsec1 test app to have a cmdline
parameter that sets XMLSEC_KEYINFO_FLAGS_X509DATA_DONT_VERIFY_CERTS, and
then I could sent a pull request together with a testcase.
But perhaps my assumptions are wrong. ;-)
Thanks,
Miklos
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://www.aleksey.com/pipermail/xmlsec/attachments/20170118/3747daae/attachment.sig>
More information about the xmlsec
mailing list