pki: Support an --addrblock option for self-signed certificates
This commit is contained in:
@@ -22,6 +22,7 @@
|
|||||||
#include <collections/linked_list.h>
|
#include <collections/linked_list.h>
|
||||||
#include <credentials/certificates/certificate.h>
|
#include <credentials/certificates/certificate.h>
|
||||||
#include <credentials/certificates/x509.h>
|
#include <credentials/certificates/x509.h>
|
||||||
|
#include <selectors/traffic_selector.h>
|
||||||
#include <asn1/asn1.h>
|
#include <asn1/asn1.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -57,6 +58,7 @@ static int self()
|
|||||||
char *file = NULL, *dn = NULL, *hex = NULL, *error = NULL, *keyid = NULL;
|
char *file = NULL, *dn = NULL, *hex = NULL, *error = NULL, *keyid = NULL;
|
||||||
identification_t *id = NULL;
|
identification_t *id = NULL;
|
||||||
linked_list_t *san, *ocsp, *permitted, *excluded, *policies, *mappings;
|
linked_list_t *san, *ocsp, *permitted, *excluded, *policies, *mappings;
|
||||||
|
linked_list_t *addrblocks;
|
||||||
int pathlen = X509_NO_CONSTRAINT, inhibit_any = X509_NO_CONSTRAINT;
|
int pathlen = X509_NO_CONSTRAINT, inhibit_any = X509_NO_CONSTRAINT;
|
||||||
int inhibit_mapping = X509_NO_CONSTRAINT;
|
int inhibit_mapping = X509_NO_CONSTRAINT;
|
||||||
int require_explicit = X509_NO_CONSTRAINT;
|
int require_explicit = X509_NO_CONSTRAINT;
|
||||||
@@ -66,6 +68,7 @@ static int self()
|
|||||||
char *datenb = NULL, *datena = NULL, *dateform = NULL;
|
char *datenb = NULL, *datena = NULL, *dateform = NULL;
|
||||||
x509_flag_t flags = 0;
|
x509_flag_t flags = 0;
|
||||||
x509_cert_policy_t *policy = NULL;
|
x509_cert_policy_t *policy = NULL;
|
||||||
|
traffic_selector_t *ts;
|
||||||
char *arg;
|
char *arg;
|
||||||
|
|
||||||
san = linked_list_create();
|
san = linked_list_create();
|
||||||
@@ -74,6 +77,7 @@ static int self()
|
|||||||
excluded = linked_list_create();
|
excluded = linked_list_create();
|
||||||
policies = linked_list_create();
|
policies = linked_list_create();
|
||||||
mappings = linked_list_create();
|
mappings = linked_list_create();
|
||||||
|
addrblocks = linked_list_create();
|
||||||
|
|
||||||
while (TRUE)
|
while (TRUE)
|
||||||
{
|
{
|
||||||
@@ -153,6 +157,15 @@ static int self()
|
|||||||
case 'p':
|
case 'p':
|
||||||
pathlen = atoi(arg);
|
pathlen = atoi(arg);
|
||||||
continue;
|
continue;
|
||||||
|
case 'B':
|
||||||
|
ts = parse_ts(arg);
|
||||||
|
if (!ts)
|
||||||
|
{
|
||||||
|
error = "invalid addressBlock";
|
||||||
|
goto usage;
|
||||||
|
}
|
||||||
|
addrblocks->insert_last(addrblocks, ts);
|
||||||
|
continue;
|
||||||
case 'n':
|
case 'n':
|
||||||
permitted->insert_last(permitted,
|
permitted->insert_last(permitted,
|
||||||
identification_create_from_string(arg));
|
identification_create_from_string(arg));
|
||||||
@@ -360,6 +373,7 @@ static int self()
|
|||||||
BUILD_NOT_AFTER_TIME, not_after, BUILD_SERIAL, serial,
|
BUILD_NOT_AFTER_TIME, not_after, BUILD_SERIAL, serial,
|
||||||
BUILD_DIGEST_ALG, digest, BUILD_X509_FLAG, flags,
|
BUILD_DIGEST_ALG, digest, BUILD_X509_FLAG, flags,
|
||||||
BUILD_PATHLEN, pathlen, BUILD_SUBJECT_ALTNAMES, san,
|
BUILD_PATHLEN, pathlen, BUILD_SUBJECT_ALTNAMES, san,
|
||||||
|
BUILD_ADDRBLOCKS, addrblocks,
|
||||||
BUILD_OCSP_ACCESS_LOCATIONS, ocsp,
|
BUILD_OCSP_ACCESS_LOCATIONS, ocsp,
|
||||||
BUILD_PERMITTED_NAME_CONSTRAINTS, permitted,
|
BUILD_PERMITTED_NAME_CONSTRAINTS, permitted,
|
||||||
BUILD_EXCLUDED_NAME_CONSTRAINTS, excluded,
|
BUILD_EXCLUDED_NAME_CONSTRAINTS, excluded,
|
||||||
@@ -394,6 +408,7 @@ end:
|
|||||||
san->destroy_offset(san, offsetof(identification_t, destroy));
|
san->destroy_offset(san, offsetof(identification_t, destroy));
|
||||||
permitted->destroy_offset(permitted, offsetof(identification_t, destroy));
|
permitted->destroy_offset(permitted, offsetof(identification_t, destroy));
|
||||||
excluded->destroy_offset(excluded, offsetof(identification_t, destroy));
|
excluded->destroy_offset(excluded, offsetof(identification_t, destroy));
|
||||||
|
addrblocks->destroy_offset(addrblocks, offsetof(traffic_selector_t, destroy));
|
||||||
policies->destroy_function(policies, (void*)destroy_cert_policy);
|
policies->destroy_function(policies, (void*)destroy_cert_policy);
|
||||||
mappings->destroy_function(mappings, (void*)destroy_policy_mapping);
|
mappings->destroy_function(mappings, (void*)destroy_policy_mapping);
|
||||||
ocsp->destroy(ocsp);
|
ocsp->destroy(ocsp);
|
||||||
@@ -411,6 +426,7 @@ usage:
|
|||||||
san->destroy_offset(san, offsetof(identification_t, destroy));
|
san->destroy_offset(san, offsetof(identification_t, destroy));
|
||||||
permitted->destroy_offset(permitted, offsetof(identification_t, destroy));
|
permitted->destroy_offset(permitted, offsetof(identification_t, destroy));
|
||||||
excluded->destroy_offset(excluded, offsetof(identification_t, destroy));
|
excluded->destroy_offset(excluded, offsetof(identification_t, destroy));
|
||||||
|
addrblocks->destroy_offset(addrblocks, offsetof(traffic_selector_t, destroy));
|
||||||
policies->destroy_function(policies, (void*)destroy_cert_policy);
|
policies->destroy_function(policies, (void*)destroy_cert_policy);
|
||||||
mappings->destroy_function(mappings, (void*)destroy_policy_mapping);
|
mappings->destroy_function(mappings, (void*)destroy_policy_mapping);
|
||||||
ocsp->destroy(ocsp);
|
ocsp->destroy(ocsp);
|
||||||
@@ -449,6 +465,7 @@ static void __attribute__ ((constructor))reg()
|
|||||||
{"serial", 's', 1, "serial number in hex, default: random"},
|
{"serial", 's', 1, "serial number in hex, default: random"},
|
||||||
{"ca", 'b', 0, "include CA basicConstraint, default: no"},
|
{"ca", 'b', 0, "include CA basicConstraint, default: no"},
|
||||||
{"pathlen", 'p', 1, "set path length constraint"},
|
{"pathlen", 'p', 1, "set path length constraint"},
|
||||||
|
{"addrblock", 'B', 1, "RFC 3779 addrBlock to include"},
|
||||||
{"nc-permitted", 'n', 1, "add permitted NameConstraint"},
|
{"nc-permitted", 'n', 1, "add permitted NameConstraint"},
|
||||||
{"nc-excluded", 'N', 1, "add excluded NameConstraint"},
|
{"nc-excluded", 'N', 1, "add excluded NameConstraint"},
|
||||||
{"cert-policy", 'P', 1, "certificatePolicy OID to include"},
|
{"cert-policy", 'P', 1, "certificatePolicy OID to include"},
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ pki \-\-self \- Create a self-signed certificate
|
|||||||
.OP \-\-ca
|
.OP \-\-ca
|
||||||
.OP \-\-ocsp uri
|
.OP \-\-ocsp uri
|
||||||
.OP \-\-pathlen len
|
.OP \-\-pathlen len
|
||||||
|
.OP \-\-addrblock block
|
||||||
.OP \-\-nc-permitted name
|
.OP \-\-nc-permitted name
|
||||||
.OP \-\-nc-excluded name
|
.OP \-\-nc-excluded name
|
||||||
.OP \-\-policy\-mapping mapping
|
.OP \-\-policy\-mapping mapping
|
||||||
@@ -127,6 +128,11 @@ times.
|
|||||||
.BI "\-p, \-\-pathlen " len
|
.BI "\-p, \-\-pathlen " len
|
||||||
Set path length constraint.
|
Set path length constraint.
|
||||||
.TP
|
.TP
|
||||||
|
.BI "\-B, \-\-addrblock " block
|
||||||
|
RFC 3779 address block to include in certificate. \fIblock\fR is either a
|
||||||
|
CIDR subnet (such as \fI10.0.0.0/8\fR) or an arbitrary address range
|
||||||
|
(\fI192.168.1.7-192.168.1.13\fR). Can be repeated to include multiple blocks.
|
||||||
|
.TP
|
||||||
.BI "\-n, \-\-nc-permitted " name
|
.BI "\-n, \-\-nc-permitted " name
|
||||||
Add permitted NameConstraint extension to certificate. For DNS or email
|
Add permitted NameConstraint extension to certificate. For DNS or email
|
||||||
constraints, the identity type is not always detectable by the given name. Use
|
constraints, the identity type is not always detectable by the given name. Use
|
||||||
|
|||||||
Reference in New Issue
Block a user