[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH] examples: add public key authentication to ssh_server_fork
[Thread Prev] | [Thread Next]
- Subject: [PATCH] examples: add public key authentication to ssh_server_fork
- From: Eric Bentley <ebentley66@xxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Sun, 26 Nov 2017 15:08:53 -0500
- To: libssh@xxxxxxxxxx
- Cc: Eric Bentley <ebentley66@xxxxxxxxx>
I noticed that there was no example showing server side public key encryption in the examples
so I added this one. I used authorizedkeys as a global to minimize the changes to the original
code as well as I was not sure the correct methodology of determining the .ssh directory location
for a user not using Linux. One code using the user parameter to determine the location to use
instead if desired.
Eric Bentley (1):
examples: add public key authentication to ssh_server_fork
examples/ssh_server_fork.c | 68 ++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 66 insertions(+), 2 deletions(-)
--
2.6.0.GIT
From 900a67d9a3c0811dd134c1b854d09acbc2edad9f Mon Sep 17 00:00:00 2001
From: Eric Bentley <ebentley66@xxxxxxxxx>
Date: Sat, 25 Nov 2017 17:10:30 -0500
Subject: [PATCH] examples: add public key authentication to ssh_server_fork
Signed-off-by: ebentley66@xxxxxxxxx
---
examples/ssh_server_fork.c | 68 ++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 66 insertions(+), 2 deletions(-)
diff --git a/examples/ssh_server_fork.c b/examples/ssh_server_fork.c
index 18320c8..6a505c7 100644
--- a/examples/ssh_server_fork.c
+++ b/examples/ssh_server_fork.c
@@ -37,6 +37,7 @@ The goal is to show the API in action.
#endif
#include <sys/ioctl.h>
#include <sys/wait.h>
+#include <sys/stat.h>
#include <stdio.h>
#ifndef KEYS_FOLDER
@@ -70,7 +71,8 @@ static void set_default_keys(ssh_bind sshbind,
KEYS_FOLDER "ssh_host_ecdsa_key");
}
}
-
+#define DEF_STR_SIZE 1024
+char authorizedkeys[DEF_STR_SIZE] = {0};
#ifdef HAVE_ARGP_H
const char *argp_program_version = "libssh server example "
SSH_STRINGIFY(LIBSSH_VERSION);
@@ -126,6 +128,14 @@ static struct argp_option options[] = {
.group = 0
},
{
+ .name = "authorizedkeys",
+ .key = 'a',
+ .arg = "FILE",
+ .flags = 0,
+ .doc = "Set the authorized keys file.",
+ .group = 0
+ },
+ {
.name = "no-default-keys",
.key = 'n',
.arg = NULL,
@@ -178,6 +188,9 @@ static error_t parse_opt (int key, char *arg, struct argp_state *state) {
ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_ECDSAKEY, arg);
ecdsa_already_set = 1;
break;
+ case 'a':
+ strncpy(authorizedkeys, arg, DEF_STR_SIZE-1);
+ break;
case 'v':
ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_LOG_VERBOSITY_STR,
"3");
@@ -434,6 +447,52 @@ static int auth_password(ssh_session session, const char *user,
return SSH_AUTH_DENIED;
}
+static int auth_publickey(ssh_session session, const char *user,
+ struct ssh_key_struct *pubkey,
+ char signature_state,
+ void *userdata)
+{
+ struct session_data_struct *sdata = (struct session_data_struct *) userdata;
+
+ (void) user;
+ (void) session;
+
+ if (signature_state == SSH_PUBLICKEY_STATE_NONE) {
+ return SSH_AUTH_SUCCESS;
+ }
+
+ if (signature_state != SSH_PUBLICKEY_STATE_VALID) {
+ return SSH_AUTH_DENIED;
+ }
+
+ // valid so far. Now look through authorized keys for a match
+ if (authorizedkeys[0])
+ {
+ ssh_key key;
+ int result;
+ struct stat buf;
+
+ if (stat(authorizedkeys, &buf) == 0) {
+ result = ssh_pki_import_pubkey_file( authorizedkeys, &key );
+ if ((result != SSH_OK) || (key==NULL))
+ fprintf(stderr, "unable to import public key file %s\n", authorizedkeys);
+ else {
+ result = ssh_key_cmp( key, pubkey, SSH_KEY_CMP_PUBLIC );
+ ssh_key_free(key);
+ if (result == 0) {
+ sdata->authenticated = 1;
+ return SSH_AUTH_SUCCESS;
+ }
+ }
+ }
+
+ }
+
+ // no matches
+ sdata->authenticated = 0;
+ return SSH_AUTH_DENIED;
+}
+
static ssh_channel channel_open(ssh_session session, void *userdata) {
struct session_data_struct *sdata = (struct session_data_struct *) userdata;
@@ -517,6 +576,12 @@ static void handle_session(ssh_event event, ssh_session session) {
.channel_open_request_session_function = channel_open,
};
+ if (authorizedkeys[0]) {
+ server_cb.auth_pubkey_function = auth_publickey;
+ ssh_set_auth_methods(session, SSH_AUTH_METHOD_PASSWORD | SSH_AUTH_METHOD_PUBLICKEY);
+ } else
+ ssh_set_auth_methods(session, SSH_AUTH_METHOD_PASSWORD);
+
ssh_callbacks_init(&server_cb);
ssh_callbacks_init(&channel_cb);
@@ -527,7 +592,6 @@ static void handle_session(ssh_event event, ssh_session session) {
return;
}
- ssh_set_auth_methods(session, SSH_AUTH_METHOD_PASSWORD);
ssh_event_add_session(event, session);
n = 0;
--
2.6.0.GIT
Archive administrator: postmaster@lists.cynapses.org