@@ -110,6 +110,7 @@ class SSLContext
110
110
uint8_t * data;
111
111
int rc = ssl_read (_ssl, &data);
112
112
if (rc < SSL_OK) {
113
+ ssl_display_error (rc);
113
114
break ;
114
115
}
115
116
}
@@ -227,6 +228,25 @@ class SSLContext
227
228
return true ;
228
229
}
229
230
231
+ bool verifyCert ()
232
+ {
233
+ int rc = ssl_verify_cert (_ssl);
234
+ if (_allowSelfSignedCerts && rc == SSL_X509_ERROR (X509_VFY_ERROR_SELF_SIGNED)) {
235
+ DEBUGV (" Allowing self-signed certificate\n " );
236
+ return true ;
237
+ } else if (rc != SSL_OK) {
238
+ DEBUGV (" ssl_verify_cert returned %d\n " , rc);
239
+ ssl_display_error (rc);
240
+ return false ;
241
+ }
242
+ return true ;
243
+ }
244
+
245
+ void allowSelfSignedCerts ()
246
+ {
247
+ _allowSelfSignedCerts = true ;
248
+ }
249
+
230
250
operator SSL*()
231
251
{
232
252
return _ssl;
@@ -268,6 +288,7 @@ class SSLContext
268
288
int _refcnt = 0 ;
269
289
const uint8_t * _read_ptr = nullptr ;
270
290
size_t _available = 0 ;
291
+ bool _allowSelfSignedCerts = false ;
271
292
static ClientContext* s_io_ctx;
272
293
};
273
294
@@ -559,96 +580,80 @@ bool WiFiClientSecure::verifyCertChain(const char* domain_name)
559
580
if (!_ssl) {
560
581
return false ;
561
582
}
562
- int rc = ssl_verify_cert (*_ssl);
563
- if (rc != SSL_OK) {
564
- DEBUGV (" ssl_verify_cert returned %d\n " , rc);
583
+ if (!_ssl->verifyCert ()) {
565
584
return false ;
566
585
}
567
-
568
586
return _verifyDN (domain_name);
569
587
}
570
588
571
- bool WiFiClientSecure::setCACert ( const uint8_t * pk, size_t size )
589
+ void WiFiClientSecure::_initSSLContext ( )
572
590
{
573
591
if (!_ssl) {
574
592
_ssl = new SSLContext;
575
593
_ssl->ref ();
576
594
}
595
+ }
596
+
597
+ bool WiFiClientSecure::setCACert (const uint8_t * pk, size_t size)
598
+ {
599
+ _initSSLContext ();
577
600
return _ssl->loadObject (SSL_OBJ_X509_CACERT, pk, size);
578
601
}
579
602
580
603
bool WiFiClientSecure::setCertificate (const uint8_t * pk, size_t size)
581
604
{
582
- if (!_ssl) {
583
- _ssl = new SSLContext;
584
- _ssl->ref ();
585
- }
605
+ _initSSLContext ();
586
606
return _ssl->loadObject (SSL_OBJ_X509_CERT, pk, size);
587
607
}
588
608
589
609
bool WiFiClientSecure::setPrivateKey (const uint8_t * pk, size_t size)
590
610
{
591
- if (!_ssl) {
592
- _ssl = new SSLContext;
593
- _ssl->ref ();
594
- }
611
+ _initSSLContext ();
595
612
return _ssl->loadObject (SSL_OBJ_RSA_KEY, pk, size);
596
613
}
597
614
598
615
bool WiFiClientSecure::setCACert_P (PGM_VOID_P pk, size_t size)
599
616
{
600
- if (!_ssl) {
601
- _ssl = new SSLContext;
602
- _ssl->ref ();
603
- }
617
+ _initSSLContext ();
604
618
return _ssl->loadObject_P (SSL_OBJ_X509_CACERT, pk, size);
605
619
}
606
620
607
621
bool WiFiClientSecure::setCertificate_P (PGM_VOID_P pk, size_t size)
608
622
{
609
- if (!_ssl) {
610
- _ssl = new SSLContext;
611
- _ssl->ref ();
612
- }
623
+ _initSSLContext ();
613
624
return _ssl->loadObject_P (SSL_OBJ_X509_CERT, pk, size);
614
625
}
615
626
616
627
bool WiFiClientSecure::setPrivateKey_P (PGM_VOID_P pk, size_t size)
617
628
{
618
- if (!_ssl) {
619
- _ssl = new SSLContext;
620
- _ssl->ref ();
621
- }
629
+ _initSSLContext ();
622
630
return _ssl->loadObject_P (SSL_OBJ_RSA_KEY, pk, size);
623
631
}
624
632
625
633
bool WiFiClientSecure::loadCACert (Stream& stream, size_t size)
626
634
{
627
- if (!_ssl) {
628
- _ssl = new SSLContext;
629
- _ssl->ref ();
630
- }
635
+ _initSSLContext ();
631
636
return _ssl->loadObject (SSL_OBJ_X509_CACERT, stream, size);
632
637
}
633
638
634
639
bool WiFiClientSecure::loadCertificate (Stream& stream, size_t size)
635
640
{
636
- if (!_ssl) {
637
- _ssl = new SSLContext;
638
- _ssl->ref ();
639
- }
641
+ _initSSLContext ();
640
642
return _ssl->loadObject (SSL_OBJ_X509_CERT, stream, size);
641
643
}
642
644
643
645
bool WiFiClientSecure::loadPrivateKey (Stream& stream, size_t size)
644
646
{
645
- if (!_ssl) {
646
- _ssl = new SSLContext;
647
- _ssl->ref ();
648
- }
647
+ _initSSLContext ();
649
648
return _ssl->loadObject (SSL_OBJ_RSA_KEY, stream, size);
650
649
}
651
650
651
+ void WiFiClientSecure::allowSelfSignedCerts ()
652
+ {
653
+ _initSSLContext ();
654
+ _ssl->allowSelfSignedCerts ();
655
+ }
656
+
652
657
extern " C" int __ax_port_read (int fd, uint8_t * buffer, size_t count)
653
658
{
654
659
ClientContext* _client = SSLContext::getIOContext (fd);
0 commit comments