|
@@ -226,12 +226,14 @@ int THttp::NeonServerSSLCallback(void * UserData, int Failures, const ne_ssl_cer
|
|
return Http->NeonServerSSLCallbackImpl(Failures, Certificate);
|
|
return Http->NeonServerSSLCallbackImpl(Failures, Certificate);
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
//---------------------------------------------------------------------------
|
|
-int THttp::NeonServerSSLCallbackImpl(int Failures, const ne_ssl_certificate * Certificate)
|
|
|
|
|
|
+enum { hcvNoWindows = 0x01, hcvNoKnown = 0x02 };
|
|
|
|
+//---------------------------------------------------------------------------
|
|
|
|
+int THttp::NeonServerSSLCallbackImpl(int Failures, const ne_ssl_certificate * ACertificate)
|
|
{
|
|
{
|
|
- AnsiString AsciiCert = NeonExportCertificate(Certificate);
|
|
|
|
|
|
+ AnsiString AsciiCert = NeonExportCertificate(ACertificate);
|
|
|
|
|
|
UnicodeString WindowsCertificateError;
|
|
UnicodeString WindowsCertificateError;
|
|
- if (Failures != 0)
|
|
|
|
|
|
+ if ((Failures != 0) && FLAGCLEAR(Configuration->HttpsCertificateValidation, hcvNoWindows))
|
|
{
|
|
{
|
|
AppLogFmt(L"TLS failure: %s (%d)", (NeonCertificateFailuresErrorStr(Failures, FHostName), Failures));
|
|
AppLogFmt(L"TLS failure: %s (%d)", (NeonCertificateFailuresErrorStr(Failures, FHostName), Failures));
|
|
AppLogFmt(L"Hostname: %s, Certificate: %s", (FHostName, AsciiCert, AsciiCert));
|
|
AppLogFmt(L"Hostname: %s, Certificate: %s", (FHostName, AsciiCert, AsciiCert));
|
|
@@ -245,6 +247,32 @@ int THttp::NeonServerSSLCallbackImpl(int Failures, const ne_ssl_certificate * Ce
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if ((Failures != 0) && FLAGSET(Failures, NE_SSL_UNTRUSTED) && FLAGCLEAR(Configuration->HttpsCertificateValidation, hcvNoKnown) &&
|
|
|
|
+ !Certificate.IsEmpty())
|
|
|
|
+ {
|
|
|
|
+ const ne_ssl_certificate * RootCertificate = ACertificate;
|
|
|
|
+ do
|
|
|
|
+ {
|
|
|
|
+ const ne_ssl_certificate * Issuer = ne_ssl_cert_signedby(RootCertificate);
|
|
|
|
+ if (Issuer != NULL)
|
|
|
|
+ {
|
|
|
|
+ RootCertificate = Issuer;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ while (true);
|
|
|
|
+
|
|
|
|
+ UnicodeString RootCert = UnicodeString(NeonExportCertificate(RootCertificate));
|
|
|
|
+ if (RootCert == Certificate)
|
|
|
|
+ {
|
|
|
|
+ Failures &= ~NE_SSL_UNTRUSTED;
|
|
|
|
+ AppLogFmt(L"Certificate is known (%d)", (Failures));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
if (Failures != 0)
|
|
if (Failures != 0)
|
|
{
|
|
{
|
|
FCertificateError = NeonCertificateFailuresErrorStr(Failures, FHostName);
|
|
FCertificateError = NeonCertificateFailuresErrorStr(Failures, FHostName);
|