@anav: That’s a problem with certificates, they are very secure when everything is configured correctly, but to do that can be quite annoying and tricky. You always have to verify them, otherwise they are useless.
Self-signed certificates can be as secure as trusted ones, in a way even more secure (*). But only with correct verification, which means that every single client must be given either server’s certificate, or certificate of your custom CA used to issue server’s certificate. Then client can verify that there’s really no MITM. Trouble is, this is ok if you do it for just few of your devices, or you’re a big enterprise with established ways how to handle it, but anything between is very annoying. Imagine having severals users and instructing everyone to manually install certificates to their devices. That’s not good. Also very unwise for those users, because then you would be able to issue certificates for other servers and their devices would trust them.
That’s advantage of trusted certificates, all regular systems (Windows, …) already include many CA certificates (like Let’s Encrypt). So if you get LE certificate for your SSTP or other server, client is able to verify that’s not fake. And without any manual config on client side. Catch is, it only works with clients where manufacturers handle updates of CA certificates, because they too can change, but not too frequently.
But if you use a client where manufacturer doesn’t handle this, it’s up to you. For example, RouterOS doesn’t include any certificates by default. So a RouterOS client connecting to SSTP server with LE certificate needs LE’s root certificate, to be able to verify server’s. And it’s up to you to keep it updated. It needs to be done only once a few years, but even that’s problematic for regular non-technical user.
And if it wasn’t bad enough, there’s not just CA certificate and server’s certificate, there are other intermediate certificates between them. And they too need to be verified, have own validity period, and everything. The right way is for server to send intermediate certificates to client, so that client needs only root and nothing else. The catch is, if you misconfigure this and server sends just its own certificate without intermediates, regular clients like Windows won’t probably notice, because they already got necessary intermediate certificates from elsewhere. But RouterOS client with just root certificate will have problem with that.
And it can be even worse, because in order to support some old clients, LE is currently by default providing wrong certificate chain with expired certificate. Some clients ignore that, but some don’t. And good luck getting it going if you don’t know much about it.
So again, certificates are great. But they work best when someone else does all the required work.
(*) With a public CA, there’s at least theoretical possibility to bribe someone inside to issue certificate for someone else’s server. It’s very unlikely and there are countermeasures against that. With your own CA, it’s not possible at all. And sure, they could simply beat you up and make you, but the point is that you’d definitely notice it.