By masking the pointer type in some cases but not others, you are making your code inconsistent.
This one I disagree with. Unless they also expose ssh_key_struct of course. Could it be that you made a typo in your previous message and when you wrote: const ssh_key * you means to say const ssh_key_struct *?
You also hide useful information: if a function accepts a parameter of type ssh_key, it is reasonable to wonder if it is a structure passed by copy, a pointer to something you must allocate yourself, or something more complicated altogether.
This is much more valid argument in my opinion, and the main reason I never hide pointers behind typedefs. And if it's done, then the underlying struct that the typedef'ed pointer points to should be internal and not visible in the main header.