I wonder if this is a bug... I did some digging in the code (0.10.4).
The error message "The key algorithm 'ssh-rsa' is not allowed to be used by PUBLICKEY_ACCEPTED_TYPES" comes from: ssh_userauth_try_publickey(). This uses: auth.c:531: rc = ssh_key_algorithm_allowed(session, sig_type_c); But ssh_key_algorithm_allowed() checks again ssh_kex_get_default_methods() pki.c:371: allowed_list = ssh_kex_get_default_methods(SSH_HOSTKEYS); ssh_kex_get_default_methods() returns a constant list DEFAULT_PUBLIC_KEY_ALGORITHMS from static const char *default_methods[] (kex.c:242). Therefore ssh_userauth_try_publickey() always returns SSH_AUTH_DENIED if the algorithm is not in the DEFAULT list. How does this make sense? It doesn't respect the additional algorithms added through the SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES option. rsa-ssh would actually be supported. It's in the list supported_methods[] in kex.c:240. This is used for ssh_keep_known_algos() (kex.c:957) and allows to set the option to the session (options.c): case SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES: v = value; if (v == NULL || v[0] == '') { ssh_set_error_invalid(session); return -1; } else { if (ssh_fips_mode()) { p = ssh_keep_fips_algos(SSH_HOSTKEYS, v); } else { p = ssh_keep_known_algos(SSH_HOSTKEYS, v); } if (p == NULL) { ssh_set_error(session, SSH_REQUEST_DENIED, "Setting method: no known public key algorithm (%s)", v); return -1; } SAFE_FREE(session->opts.pubkey_accepted_types); session->opts.pubkey_accepted_types = p; } So what's the sense of allowing to add the algorithm through the option, but then denying the key because it's algorithm is not in the default list? IMHO SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES makes no sense this way... Cheers Till May 20, 2025 1:48 AM, g4-l...@tonarchiv.ch (mailto:g4-l...@tonarchiv.ch) wrote: Nice hint to use 'strings'. But from the output it's hard to tell. There are a few appearances: rsa-sha2-512 rsa-sha2-512,rsa-sha2-256,ssh-rsa ecdsa-sha2-nistp521-cert-...@openssh.com (mailto:ecdsa-sha2-nistp521-cert-...@openssh.com),ecdsa-sha2-nistp384-cert-...@openssh.com (mailto:ecdsa-sha2-nistp384-cert-...@openssh.com),ecdsa-sha2-nistp256-cert-...@openssh.com (mailto:ecdsa-sha2-nistp256-cert-...@openssh.com),rsa-sha2-512-cert-...@openssh.com (mailto:rsa-sha2-512-cert-...@openssh.com),rsa-sha2-256-cert-...@openssh.com (mailto:rsa-sha2-256-cert-...@openssh.com),ecdsa-sha2-nistp521,ecdsa-sha2-nistp384,ecdsa-sha2-nistp256,rsa-sha2-512,rsa-sha2-256 ssh-ed25519-cert-...@openssh.com (mailto:ssh-ed25519-cert-...@openssh.com),ecdsa-sha2-nistp521-cert-...@openssh.com (mailto:ecdsa-sha2-nistp521-cert-...@openssh.com),ecdsa-sha2-nistp384-cert-...@openssh.com (mailto:ecdsa-sha2-nistp384-cert-...@openssh.com),ecdsa-sha2-nistp256-cert-...@openssh.com (mailto:ecdsa-sha2-nistp256-cert-...@openssh.com),sk-ecdsa-sha2-nistp256-cert-...@openssh.com (mailto:sk-ecdsa-sha2-nistp256-cert-...@openssh.com),rsa-sha2-512-cert-...@openssh.com (mailto:rsa-sha2-512-cert-...@openssh.com),rsa-sha2-256-cert-...@openssh.com (mailto:rsa-sha2-256-cert-...@openssh.com),ssh-ed25519,ecdsa-sha2-nistp521,ecdsa-sha2-nistp384,ecdsa-sha2-nistp256,sk-ssh-ed25...@openssh.com (mailto:sk-ssh-ed25...@openssh.com),sk-ecdsa-sha2-nistp...@openssh.com (mailto:sk-ecdsa-sha2-nistp...@openssh.com),rsa-sha2-512,rsa-sha2-256 ssh-ed25519,ecdsa-sha2-nistp521,ecdsa-sha2-nistp384,ecdsa-sha2-nistp256,sk-ssh-ed25...@openssh.com (mailto:sk-ssh-ed25...@openssh.com),sk-ecdsa-sha2-nistp...@openssh.com (mailto:sk-ecdsa-sha2-nistp...@openssh.com),rsa-sha2-512,rsa-sha2-256,ssh-rsa The provided value (%u) for minimal RSA key size is too small. Use at least 768 bits. Either RSA or DSS must be chosen ssh-ed25519-cert-...@openssh.com (mailto:ssh-ed25519-cert-...@openssh.com),sk-ssh-ed25519-cert-...@openssh.com (mailto:sk-ssh-ed25519-cert-...@openssh.com),ecdsa-sha2-nistp521-cert-...@openssh.com (mailto:ecdsa-sha2-nistp521-cert-...@openssh.com),ecdsa-sha2-nistp384-cert-...@openssh.com (mailto:ecdsa-sha2-nistp384-cert-...@openssh.com),ecdsa-sha2-nistp256-cert-...@openssh.com (mailto:ecdsa-sha2-nistp256-cert-...@openssh.com),sk-ecdsa-sha2-nistp256-cert-...@openssh.com (mailto:sk-ecdsa-sha2-nistp256-cert-...@openssh.com),rsa-sha2-512-cert-...@openssh.com (mailto:rsa-sha2-512-cert-...@openssh.com),rsa-sha2-256-cert-...@openssh.com (mailto:rsa-sha2-256-cert-...@openssh.com),ssh-rsa-cert-...@openssh.com (mailto:ssh-rsa-cert-...@openssh.com),ssh-ed25519,ecdsa-sha2-nistp521,ecdsa-sha2-nistp384,ecdsa-sha2-nistp256,sk-ssh-ed25...@openssh.com (mailto:sk-ssh-ed25...@openssh.com),sk-ecdsa-sha2-nistp...@openssh.com (mailto:sk-ecdsa-sha2-nistp...@openssh.com),rsa-sha2-512,rsa-sha2-256,ssh-rsa rsa-sha2-256-cert-...@openssh.com (mailto:rsa-sha2-256-cert-...@openssh.com) rsa-sha2-512-cert-...@openssh.com (mailto:rsa-sha2-512-cert-...@openssh.com) Failed to build RSA public key The '%s' key of size %d is not allowd by RSA_MIN_SIZE Failed to build RSA private key ssh-rsa ssh-rsa-cert-...@openssh.com (mailto:ssh-rsa-cert-...@openssh.com) I'm using a minimalistic code now for testing. But still the same result: int main() { ssh_session session; int rc; const char *hostname = "10.10.10.10"; const char *username = "user"; const char *keyfile = "/home/user/id_rsa"; int port = 22; session = ssh_new(); if (session == NULL) { fprintf(stderr, "Failed to create SSH sessionn"); return 1; } ssh_set_log_level(SSH_LOG_FUNCTIONS); ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES, "+ssh-rsa"); ssh_options_set(session, SSH_OPTIONS_HOST, hostname); ssh_options_set(session, SSH_OPTIONS_PORT, &port); ssh_options_set(session, SSH_OPTIONS_USER, username); ssh_options_set(session, SSH_OPTIONS_IDENTITY, keyfile); rc = ssh_connect(session); if (rc != SSH_OK) { fprintf(stderr, "Error connecting to %s: %sn", hostname, ssh_get_error(session)); ssh_free(session); return 1; } rc = ssh_userauth_publickey_auto(session, NULL, NULL); if (rc != SSH_AUTH_SUCCESS) { fprintf(stderr, "Authentication failed: %sn", ssh_get_error(session)); ssh_disconnect(session); ssh_free(session); return 1; } printf("Connected and authenticated with key!n"); ssh_disconnect(session); ssh_free(session); return 0; } Output: ssh_userauth_publickey_auto: Trying to authenticate with /home/remadmin/id_rsa ssh_key_algorithm_allowed: Checking rsa-sha2-512 with list <ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-...@openssh.com (mailto:ecdsa-sha2-nistp256-cert-...@openssh.com),ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-...@openssh.com (mailto:ecdsa-sha2-nistp384-cert-...@openssh.com),ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-...@openssh.com (mailto:ecdsa-sha2-nistp521-cert-...@openssh.com),ssh-ed25519,ssh-ed25519-cert-...@openssh.com (mailto:ssh-ed25519-cert-...@openssh.com),rsa-sha2-256,rsa-sha2-256-cert-...@openssh.com (mailto:rsa-sha2-256-cert-...@openssh.com),rsa-sha2-512,rsa-sha2-512-cert-...@openssh.com (mailto:rsa-sha2-512-cert-...@openssh.com)> ssh_key_algorithm_allowed: Checking rsa-sha2-256 with list <ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-...@openssh.com (mailto:ecdsa-sha2-nistp256-cert-...@openssh.com),ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-...@openssh.com (mailto:ecdsa-sha2-nistp384-cert-...@openssh.com),ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-...@openssh.com (mailto:ecdsa-sha2-nistp521-cert-...@openssh.com),ssh-ed25519,ssh-ed25519-cert-...@openssh.com (mailto:ssh-ed25519-cert-...@openssh.com),rsa-sha2-256,rsa-sha2-256-cert-...@openssh.com (mailto:rsa-sha2-256-cert-...@openssh.com),rsa-sha2-512,rsa-sha2-512-cert-...@openssh.com (mailto:rsa-sha2-512-cert-...@openssh.com)> ssh_key_algorithm_allowed: Checking ssh-rsa with list <ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-...@openssh.com (mailto:ecdsa-sha2-nistp256-cert-...@openssh.com),ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-...@openssh.com (mailto:ecdsa-sha2-nistp384-cert-...@openssh.com),ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-...@openssh.com (mailto:ecdsa-sha2-nistp521-cert-...@openssh.com),ssh-ed25519,ssh-ed25519-cert-...@openssh.com (mailto:ssh-ed25519-cert-...@openssh.com),rsa-sha2-256,rsa-sha2-256-cert-...@openssh.com (mailto:rsa-sha2-256-cert-...@openssh.com),rsa-sha2-512,rsa-sha2-512-cert-...@openssh.com (mailto:rsa-sha2-512-cert-...@openssh.com)> ssh_userauth_try_publickey: The key algorithm 'ssh-rsa' is not allowed to be used by PUBLICKEY_ACCEPTED_TYPES configuration option ssh_userauth_publickey_auto: Public key for /home/remadmin/id_rsa refused by server To your last question: I'm simply talking to the libssh mailing list! My name is Till. Cheers May 19, 2025 11:59 PM, "Malak Bouaksa" <bouaksama...@gmail.com (mailto:bouaksama...@gmail.com?to=%22Malak%20Bouaksa%22%20<bouaksama...@gmail.com>)> wrote: You're absolutely right to be confused — that error message is really misleading. When libssh says the key was “refused by server,” it often doesn’t actually mean the server rejected it. In your case, the message "The key algorithm 'ssh-rsa' is not allowed to be used by PUBLICKEY_ACCEPTED_TYPES configuration option" shows that it’s the client itself, not the server, refusing the key. It’s likely that libssh 0.10.4 is filtering out ssh-rsa internally before it even tries to use it. This is a new default behavior introduced for security reasons, since ssh-rsa uses SHA-1, which is considered weak. To allow it, make sure you're calling ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES, "+ssh-rsa") (without a space after the plus) before calling ssh_connect(). If you set it too late, the option won’t take effect. Also consider setting SSH_OPTIONS_HOSTKEYS to include +ssh-rsa, just in case host key filtering is also in play. Finally, it’s worth checking whether your system’s libssh was compiled with ssh-rsa support disabled entirely — some distros remove it completely. A quick way to test that is by running strings on the libssh shared library to see if ssh-rsa appears at all. So no, the server probably isn’t refusing the key — your client just won’t let it be used unless you configure it properly, and sometimes not even then if it’s compiled out. And can I know who is talking to me and how you got my email? Thank you and I hope I helped with your problem. On Mon, May 19, 2025 at 10:14 PM <g4-l...@tonarchiv.ch (mailto:g4-l...@tonarchiv.ch)> wrote: Hi there and thanks for your reply! You mean ' ssh-rsa' i.e. without any space? I also tried that, and with a complete list, too: sh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES, "rsa-sha2-256,rsa-sha2-512,ecdh-sha2-nistp256,ssh-rsa" Nothing seems to help so far... It actually says (with debug log level); ssh_userauth_publickey_auto: ssh_userauth_publickey_auto: Public key for /opt/myproxy/.ssh/id_rsa refused by server ssh_userauth_publickey_auto: Access denied: Tried every public key, none matched ssh_userauth_publickey_auto Instance #11 failed: The key algorithm 'ssh-rsa' is not allowed to be used by PUBLICKEY_ACCEPTED_TYPES configuration option The last line comes from ssh_get_error(session): if(ssh_userauth_publickey_auto(session, NULL, NULL) != SSH_AUTH_SUCCESS) { tlog_error("ssh_userauth_password Instance #%d failed: %s", inst->instance_id, ssh_get_error(session)); ... But why it says: refused by server? Is this just a bad wording? Or is it really rejected by the peer? May 19, 2025 10:19 PM, "Malak Bouaksa" <bouaksama...@gmail.com (mailto:bouaksama...@gmail.com?to=%22malak%20bouaksa%22%20%3cbouaksama...@gmail.com%3E)> wrote: Hey there, What you're running into is actually a common issue when jumping from libssh 0.9.x to 0.10.x. Starting with version 0.10, libssh made a security-related change: it no longer allows the 'ssh-rsa' key type by default because it's based on SHA-1, which is considered weak by modern cryptographic standards. That’s why everything worked fine with version 0.9.6, but with 0.10.4 on RHEL9 That’s why everything worked fine with version 0.9.6, but with 0.10.4 on RHEL9 but here’s the catch: the space after the + is messing it up. It should be: ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES, "+ ssh-rsa"); On Mon, May 19, 2025 at 8:58 PM <g4-l...@tonarchiv.ch (mailto:g4-l...@tonarchiv.ch)> wrote: Hi there, I wrote a client (TCP forwarding) that connects to a server which uses libssh V 0.9.7. When I compile the client with 0.9.6 (this is what I get with libssh-dev on Pop!_OS 22.04) then all works fine. However, on RHEL9, libssh-dev brings v0.10.4. And compiled with that version the client can't connect anymore: "ssh_userauth_try_publickey: The key algorithm 'ssh-rsa' is not allowed to be used by PUBLICKEY_ACCEPTED_TYPES configuration option" At first I was confused: Who says this? The server? But it accepted the key when using a client with version 0.9.6. So I tried to add 'ssh-rsa' to the client's allowed key types: if (ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES, "+ ssh-rsa") < 0) { fprintf(stderr, "ssh_options_set failed: %sn", ssh_get_error(session); } ssh_options_set(...) seems to succeed. However, everything else remains the same. The key algorithm 'ssh-rsa' is not allowed to be used... How can this be solved? What is the right way to convince libssh that it can use public keys of type ssh-rsa? The remote account only knows my ssh-rsa public key and this can't be changed easily. That's why I have to stick with that type... Cheers Till