blob: 9ba72d41cf9f1e1381841af3ea222101c1796f2e [file]
/*
* Copyright (C) 2005 Jan Hutter, Martin Willi
* Copyright (C) 2012 Tobias Brunner
* Copyright (C) 2022 Andreas Steffen, strongSec GmbH
*
* Copyright (C) secunet Security Networks AG
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include "pki.h"
#include "pki_cert.h"
#include "scep/scep.h"
#include <credentials/certificates/certificate.h>
/**
* Get CA certificate[s] from a SCEP server (RFC 8894)
*/
static int scepca()
{
cred_encoding_type_t form = CERT_ASN1_DER;
chunk_t scep_response = chunk_empty;
char *arg, *url = NULL, *caout = NULL, *raout = NULL;
bool force = FALSE, success;
u_int http_code = 0;
while (TRUE)
{
switch (command_getopt(&arg))
{
case 'h': /* --help */
return command_usage(NULL);
case 'u': /* --url */
url = arg;
continue;
case 'c': /* --caout */
caout = arg;
continue;
case 'r': /* --raout */
raout = arg;
continue;
case 'f': /* --form */
if (!get_form(arg, &form, CRED_CERTIFICATE))
{
return command_usage("invalid certificate output format");
}
continue;
case 'F': /* --force */
force = TRUE;
continue;
case EOF:
break;
default:
return command_usage("invalid --scepca option");
}
break;
}
if (!url)
{
return command_usage("--url is required");
}
if (!scep_http_request(url, SCEP_GET_CA_CERT, FALSE, chunk_empty,
&scep_response, &http_code))
{
DBG1(DBG_APP, "did not receive a valid SCEP response: HTTP %u", http_code);
return 1;
}
success = pki_cert_extract_cacerts(scep_response, caout, raout, TRUE, form,
force);
chunk_free(&scep_response);
return success ? 0 : 1;
}
/**
* Register the command.
*/
static void __attribute__ ((constructor))reg()
{
command_register((command_t) {
scepca, 'C', "scepca",
"get CA [and RA] certificate[s] from a SCEP server",
{"--url url [--caout file] [--raout file] [--outform der|pem] [--force]"},
{
{"help", 'h', 0, "show usage information"},
{"url", 'u', 1, "URL of the SCEP server"},
{"caout", 'c', 1, "CA certificate [template]"},
{"raout", 'r', 1, "RA certificate [template]"},
{"outform", 'f', 1, "encoding of stored certificates, default: der"},
{"force", 'F', 0, "force overwrite of existing files"},
}
});
}