Сертификат может быть выпущен на IP. Например
https://1.1.1.1/ . Правда кому попало такой сертификат доверенный центр не выпустит и на 192.168 точно не выпустит, но самоподписанный сертификат выпустить можно, стандарты позволяют указывать IP, а не DNS-имя.
В вашем случае разумно всю заботу о сертификатах сложить на плечи пользователей-администраторов. Пользуйтесь стандартными средствами операционной системы, а администраторы пусть сами решают, выпустить им нормальный сертификат или делать локальный удостоверяющий центр с самоподписанным корневым сертификатом и устанавливать его как доверенный на нужные машины. От вас требуется предоставить возможность загружать ключ и сертификат в ваше приложение.
Для тупых можете предоставить возможность генерации сертификата через letsencrypt. От админа в данном случае нужно будет настроить DNS и указать у вас в настройках hostname, т.е. myserver.aws.com, например, который указывает на публичный IP-адрес с открытым 80 портом. Тогда вы сможете используя letsencrypt и слушая 80 порт на этой машине выпустить сертификат на этот домен и в дальнейшем его использовать в своих целях.
Ну можете ещё автоматически сгенерировать самоподписанный сертификат на произвольный домен/IP-адрес, выгрузить его пользователю и показать инструкцию, как его установить в доверенные на другом конце.
SVZ>Как эта проблема решается в мобильных интернет банках, например?
SVZ>Вот есть клиентское приложение, оно обязано иметь сертификат, чтобы доказать серверу, что оно "настоящее"?
SVZ>Или любое приложение может приконнектиться к веб АПИ?
Любое приложение может приконнектиться к веб АПИ. Любой сертификат тут будет бессмысленнен, т.к. расковырять apk и вытащить оттуда ключ это не так уж сложно, то бишь защита тут примерно как захардкодить пароль в исходниках. Обычно защиту делают с другого конца: в исходниках хардкодят публичный ключ сервера и при соединении проверяют, что сервер показывает именно его. Это позволяет затруднить анализ трафика, хотя всё равно пытливый ум расковыряет, но тут хотя бы никаких секретов в коде не прячут, просто дополнительные проверки.