This can certainly be achieved, and the way you would do it depends upon how your apps run; if they are served by your web server simply listening on certain ports, then you would need to amend your configurations to use VirtualHosts similar to the following:
<VirtualHost *:443>
ServerAlias app1.com
DocumentRoot /var/www/html/app1 #or however this app is configured
[the rest of your configuration directives for the app]
</VirtualHost>
<VirtualHost *:443>
ServerAlias app2.com
[As above but for app2]
</VirtualHost>
Whereas, if your apps are being served by other processes listening on the ports you have noted, then you could set it up using a structure similar to the above, but utilising reverse proxies to serve the apps via port 443, for example:
<VirtualHost *:443>
ServerAlias app1.com
ProxyPreserveHost on
SSLProxyEngine On
ProxyPass / http://localhost:5443/ #change the port here for the app in question
ProxyPassReverse / http://localhost:5443/ # change the port here for the app in question
SSLEngine on
[SSL directives as appropriate for your requirements]
</VirtualHost>
<VirtualHost *:443>
ServerAlias app2.com
ProxyPreserveHost on
SSLProxyEngine On
ProxyPass / http://localhost:5443/ #change the port here for the app in question
ProxyPassReverse / http://localhost:5443/ # change the port here for the app in question
SSLEngine on
[SSL directives as appropriate for your requirements]
</VirtualHost>
This way, the SSL is handled by the web server, with the http requests passed back to whichever app is listening on the ports listed - and the apps are differentiated via host name requested. It is worth noting that if the apps are listening on these ports and replying only over SSL, it will be advisable to disable SSL from them (and run it via Apache as instructed above - once configured, also of course close those ports in your firewall if they are currently opened externally).