Up until now I had been signing my apks with the following method:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore {keystore-file} {apk-file} {key
Wow, I didn't know you could change passwords in the keystore.
Anyway I had this exact problem and it turns out you don't need to change your password. The trick is to set options
--ks-pass stdin --key-pass stdin
This is supposedly default behavior but in my case it only worked if I specifically included these.
Execute the command, you'll be asked to enter passwords, and it works even with characters such as !.