cert hostname validation is case insensitive and stricter for wildcard certificates

This commit is contained in:
Guenter Obiltschnig 2014-04-09 17:05:54 +02:00
Родитель 436737171d
Коммит f764673c61
2 изменённых файлов: 10 добавлений и 4 удалений

Просмотреть файл

@ -1,7 +1,7 @@
// //
// X509Certificate.h // X509Certificate.h
// //
// $Id: //poco/1.4/NetSSL_OpenSSL/include/Poco/Net/X509Certificate.h#2 $ // $Id: //poco/1.4/NetSSL_OpenSSL/include/Poco/Net/X509Certificate.h#3 $
// //
// Library: NetSSL_OpenSSL // Library: NetSSL_OpenSSL
// Package: SSLCore // Package: SSLCore

Просмотреть файл

@ -1,7 +1,7 @@
// //
// X509Certificate.cpp // X509Certificate.cpp
// //
// $Id: //poco/1.4/NetSSL_OpenSSL/src/X509Certificate.cpp#3 $ // $Id: //poco/1.4/NetSSL_OpenSSL/src/X509Certificate.cpp#4 $
// //
// Library: NetSSL_OpenSSL // Library: NetSSL_OpenSSL
// Package: SSLCore // Package: SSLCore
@ -138,6 +138,10 @@ bool X509Certificate::verify(const Poco::Crypto::X509Certificate& certificate, c
ok = (*it == ip); ok = (*it == ip);
} }
} }
else
{
ok = Poco::icompare(*it, hostName) == 0;
}
} }
} }
catch (HostNotFoundException&) catch (HostNotFoundException&)
@ -158,13 +162,15 @@ bool X509Certificate::containsWildcards(const std::string& commonName)
bool X509Certificate::matchWildcard(const std::string& wildcard, const std::string& hostName) bool X509Certificate::matchWildcard(const std::string& wildcard, const std::string& hostName)
{ {
// fix wildcards // fix wildcards
std::string wildcardExpr = Poco::replace(wildcard, ".", "\\."); std::string wildcardExpr("^");
wildcardExpr += Poco::replace(wildcard, ".", "\\.");
Poco::replaceInPlace(wildcardExpr, "*", ".*"); Poco::replaceInPlace(wildcardExpr, "*", ".*");
Poco::replaceInPlace(wildcardExpr, "..*", ".*"); Poco::replaceInPlace(wildcardExpr, "..*", ".*");
Poco::replaceInPlace(wildcardExpr, "?", ".?"); Poco::replaceInPlace(wildcardExpr, "?", ".?");
Poco::replaceInPlace(wildcardExpr, "..?", ".?"); Poco::replaceInPlace(wildcardExpr, "..?", ".?");
wildcardExpr += "$";
Poco::RegularExpression expr(wildcardExpr); Poco::RegularExpression expr(wildcardExpr, Poco::RegularExpression::RE_CASELESS);
return expr.match(hostName); return expr.match(hostName);
} }