Skip to content

Commit af21f63

Browse files
author
IPredator
committed
support client certificate verification
NOTE: Manual patch of bumptech#103
1 parent 6a0673c commit af21f63

File tree

3 files changed

+28
-1
lines changed

3 files changed

+28
-1
lines changed

configuration.c

+18-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#define CFG_TACK_PIN_ACTIVATION "tack-pin-activation"
3737
#endif /* ENABLE_TACK */
3838
#define CFG_PREFER_SERVER_CIPHERS "prefer-server-ciphers"
39+
#define CFG_PEER_CRT_VRFY_DPTH "peer-cert-verify"
3940
#define CFG_BACKEND "backend"
4041
#define CFG_FRONTEND "frontend"
4142
#define CFG_WORKERS "workers"
@@ -162,6 +163,7 @@ stud_config * config_new (void) {
162163
r->TCP_KEEPALIVE_TIME = 3600;
163164
r->DAEMONIZE = 0;
164165
r->PREFER_SERVER_CIPHERS = 0;
166+
r->PEER_CRT_VRFY_DPTH = 0;
165167
r->MAXFDS = -1;
166168

167169
return r;
@@ -598,6 +600,9 @@ void config_param_validate (char *k, char *v, stud_config *cfg, char *file, int
598600
else if (strcmp(k, CFG_TACK_PIN_ACTIVATION) == 0) {
599601
r = config_param_val_bool(v, &cfg->TACK_PIN_ACTIVATION);
600602
}
603+
else if (strcmp(k, CFG_PEER_CRT_VRFY_DPTH) == 0) {
604+
r = config_param_val_int(v, &cfg->PEER_CRT_VRFY_DPTH);
605+
}
601606
#endif /* ENABLE_TACK */
602607
else if (strcmp(k, CFG_SSL_ENGINE) == 0) {
603608
if (v != NULL && strlen(v) > 0) {
@@ -924,6 +929,8 @@ void config_print_usage_fd (char *prog, stud_config *cfg, FILE *out) {
924929
fprintf(out, " -c --ciphers=SUITE Sets allowed ciphers (Default: \"%s\")\n", config_disp_str(cfg->CIPHER_SUITE));
925930
fprintf(out, " -e --ssl-engine=NAME Sets OpenSSL engine (Default: \"%s\")\n", config_disp_str(cfg->ENGINE));
926931
fprintf(out, " -O --prefer-server-ciphers Prefer server list order\n");
932+
fprintf(out, " -p --peer-cert-verify=DEPTH\n");
933+
fprintf(out, " Require & verify peer certificates (Default: \"%d\")\n", cfg->PEER_CRT_VRFY_DPTH);
927934
#ifdef ENABLE_TACK
928935
fprintf(out, " -T --tack-file=FILE Load TACK data from specified file.\n");
929936
fprintf(out, " -S --tack-break-sigs-file=FILE Load TACK break sigs from specified file.\n");
@@ -1045,6 +1052,12 @@ void config_print_default (FILE *fd, stud_config *cfg) {
10451052
fprintf(fd, FMT_STR, CFG_PREFER_SERVER_CIPHERS, config_disp_bool(cfg->PREFER_SERVER_CIPHERS));
10461053
fprintf(fd, "\n");
10471054

1055+
fprintf(fd, "# Require peer to send a valid certificate and verify to this depth\n");
1056+
fprintf(fd, "#\n");
1057+
fprintf(fd, "# type: integer\n");
1058+
fprintf(fd, FMT_ISTR, CFG_PEER_CRT_VRFY_DPTH, cfg->PEER_CRT_VRFY_DPTH);
1059+
fprintf(fd, "\n");
1060+
10481061
fprintf(fd, "# Use specified SSL engine\n");
10491062
fprintf(fd, "#\n");
10501063
fprintf(fd, "# type: string\n");
@@ -1211,6 +1224,7 @@ void config_parse_cli(int argc, char **argv, stud_config *cfg) {
12111224
{ "client", 0, &client, 1},
12121225
{ CFG_CIPHERS, 1, NULL, 'c' },
12131226
{ CFG_PREFER_SERVER_CIPHERS, 0, NULL, 'O' },
1227+
{ CFG_PEER_CRT_VRFY_DPTH, 1, NULL, 'p' },
12141228
#ifdef ENABLE_TACK
12151229
{ CFG_TACK_FILE, 1, NULL, 'T'},
12161230
{ CFG_TACK_BREAK_SIGS_FILE, 1, NULL, 'S'},
@@ -1249,7 +1263,7 @@ void config_parse_cli(int argc, char **argv, stud_config *cfg) {
12491263
int option_index = 0;
12501264
c = getopt_long(
12511265
argc, argv,
1252-
"c:e:Ob:f:n:B:C:T:S:pU:P:M:k:r:u:g:qstVh",
1266+
"c:e:Op:b:f:n:B:C:T:S:pU:P:M:k:r:u:g:qstVh",
12531267
long_options, &option_index
12541268
);
12551269

@@ -1295,6 +1309,9 @@ void config_parse_cli(int argc, char **argv, stud_config *cfg) {
12951309
case 'O':
12961310
config_param_validate(CFG_PREFER_SERVER_CIPHERS, CFG_BOOL_ON, cfg, NULL, 0);
12971311
break;
1312+
case 'p':
1313+
config_param_validate(CFG_PEER_CRT_VRFY_DPTH, optarg, cfg, NULL, 0);
1314+
break;
12981315
case 'b':
12991316
config_param_validate(CFG_BACKEND, optarg, cfg, NULL, 0);
13001317
break;

configuration.h

+2
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,9 @@ typedef struct stud_config_s {
7474
int TCP_KEEPALIVE_TIME;
7575
int DAEMONIZE;
7676
int PREFER_SERVER_CIPHERS;
77+
int PEER_CRT_VRFY_DPTH;
7778
int MAXFDS;
79+
char *CERT_FILE;
7880
} stud_config;
7981

8082
char * config_error_get (void);

stud.c

+8
Original file line numberDiff line numberDiff line change
@@ -613,6 +613,14 @@ SSL_CTX *make_ctx(const char *pemfile) {
613613
SSL_CTX_set_options(ctx, SSL_OP_CIPHER_SERVER_PREFERENCE);
614614
}
615615

616+
if (CONFIG->PEER_CRT_VRFY_DPTH) {
617+
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER |
618+
SSL_VERIFY_FAIL_IF_NO_PEER_CERT | SSL_VERIFY_CLIENT_ONCE, NULL);
619+
SSL_CTX_set_verify_depth(ctx, CONFIG->PEER_CRT_VRFY_DPTH);
620+
// TODO: Make configurable
621+
SSL_CTX_load_verify_locations(ctx, CONFIG->CERT_FILE, NULL);
622+
}
623+
616624
if (CONFIG->PMODE == SSL_CLIENT) {
617625
return ctx;
618626
}

0 commit comments

Comments
 (0)